|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5 \) ^3 ]" |7 L! }0 B7 ]一、开发板 TRK-KEA1286 n/ I* c/ g- z) \
5 [1 V! s: \0 f1 e3 r' z6 p
如今车载的电器设备、娱乐功能越来越多,然而更多的功能也意味着更多的电子元件、更多的线路,这无疑让车身布线成为一项十分艰难的工作,因此,CAN总线出现啦。
/ z. {) w! C$ j* f$ Z9 Q( V! M R9 U
通俗的讲,CAN总线好比在汽车的控制元件之间建立的网络,使它们实现资源上的共享(CAN总线通信方式:节点发送的信息可被网络中所有其他节点看到),这样,不仅大大减少了相同传感器、导线的数量,同时也使可以配置的控制单元读取更多信息,实现更加精确的控制。/ ^/ A1 ]8 S! I7 o
% ?) U6 O% Y6 Y; {$ C* X( P; C显然,TRK-KEA128就是基于CAN功能的控制芯片。8 o. Q1 S \# O& m! a/ Z
3 l, n8 Y$ V. A0 @: X7 z; p; F( x
TRK-KEA128板载的资源:3 X( l: }& _8 x: k/ ~2 W5 M, J( Q' \
- r, f! b3 d7 [6 b5 ? 采用80 LQFP封装的Kinetis KEA128 mcu
* N. v" E9 F" B! i6 V( t 采用PK20DX128 MCU的板载OpenSDA调试和编程电路
9 b1 J# ]! r5 C5 h 一个CAN通信接口、一个LIN通信接口
6 e9 b, x9 `* H. a% { 一个环境光传感器、四个用户LEDs: h D0 w$ p/ `' v, i1 D( q
一个MCU RESET按键、一个SDA RESET按键、两个用户按键" E3 Y$ l/ j# k0 n2 r# Z# A
12V DC Jack输入、5V MicroUSB口输入
# C4 k4 D! H4 s5 U. E4 [* u5 g3 M) g7 A2 M
TRK-KEA128板载的电路功能:
2 D1 n" @+ ` |9 l- {. R
3 ^2 l) o n7 X0 @0 w 主控MCU以及延生的电路功能(例如IO口引出的用户扩展接口、按键\LED电路、利用ADC功能拓展的光线传感器电路)
; h4 E, r* E: e3 X+ ]* C/ ?8 Q/ t 基于PK20DX128 MCU的板载OpenSDA调试电路% x2 R5 u5 f2 Q7 V5 ^' Z
通过外部PHY扩展的CAN、LIN接口电路+ y: ^: y4 c" {! N% b: }+ a/ J
* w" L; F, x+ b8 b" k: U1 T+ x
下图是KEAZ128的中文手册目录,来自网络(侵权必删):# L* F1 K; x3 B; Z1 r6 M, E
二、微控制器 PKEAZ128AMLK& J" [) O' X9 b( E6 P4 ~5 q1 J5 N
( T) C& _& `( L# b) C% R( w; h9 x主控MCU是 PKEAZ128AMLK,基于48MHz主频的32位ARM Cortex-M0+处理器,集成了128KB FLASH以及16KB RAM,主要集成了CAN控制器,适合面向汽车网络的应用设计,并且采用了常见的LQFP80封装。
/ X- b" R/ q* T. o
" ?6 ]9 L+ F! {4 R% FPKEAZ128AMLK微控制器的特点:
+ O2 D1 }+ h) { n0 {4 } v1 A7 S- B; h, m2 g. L j/ O( x8 e6 ]
高达48 MHz的ARM Cortex M0+内核,集成128KB FLASH、16KB RAM
6 R1 r. ]& q) f, Z$ I4 N: } 2.7V~5.5V宽电压供电+ K. m L3 g* \& p2 n3 k- x3 S
一个16通道12位SAR ADC,两个模拟比较器、定时器、安全模块等
1 D' @7 ]$ g6 e; O1 {, E$ | SPI、I2C、UART、CAN2.0A/B、KBI等接口,最高支持扩展71GPIOs x/ `/ n; @5 S: G3 Q0 \, d& [: z
电源管理模块(PMC)具有三种模式:运行、等待、停止' t! q, m+ @$ @
( `% ]* s( ^0 J6 `
PKEAZ128AMLK微控制器的特性:
) |" ~9 u- Q' s3 Z
, ^ j8 n6 e, ^ 基于ARM Cortex-M0+处理器,功耗低,生态圈广泛;
i) W! T9 b+ X$ Y& a+ Q 集成了CAN2.0A/B控制器,具备CAN网关功能,适合需要CAN总线网络的应用。1 G' ]' D$ C$ H* _/ u1 F$ f
& Q+ u {6 g4 U' A9 y
三、KEA128的KBI模块
6 l& _! d! z$ A* d
( Z* K) q! _& s" B7 m恩智浦Kinetis KE0x、KEA 系列MCU片上集成有KBI ( Keyboard Interrupts 键盘中断模块 )。
+ I: H4 v* z z0 C# h
4 o9 a8 D% G3 x$ c8 K pKEA128有两个支持引脚中断的 KBI 模块,KBI0和KBI1。
f5 e; U# a9 q$ H0 s
3 e& C+ t; P& D& D7 KKBI使用总线时钟,SIM_SCGC寄存器使能KBI总线时钟。9 S+ J! H6 L" w! o! {2 W
3.1 KBI端口* o8 S$ A+ @8 u$ u
' ?8 R8 M9 X1 b8 c3.2 模块功能配置代码" B: X: u; C9 ]
3.2.1 初始化; O. w1 t) Z4 i; E# z$ x
) a$ I# f8 M. ^
void kbi_init(uint_16 kbiNo, uint_8 kbiMod, uint_8 EdgeSelect)8 u) X; ~# J6 l; \& L, z9 [7 E. x
{
' m. p" \0 c6 p! q //(1)声明局部变量0 l# y. [$ m$ c
uint_8 module; //模块号
# f6 F% _# [' m. ^' l; a O6 n5 n- ] uint_8 chn; //通道号
+ D ^, Z, T( |) o' W C A4 d //(2)解析模块号和通道号5 [; V0 D8 \4 Z, H* ]) w7 ]
kbi_mux_val(kbiNo,&module,&chn); U4 r( M7 M; t, i; l* ?* p
//(3)根据不同模块号进行设置* `9 u- Y# R8 j. c( @
switch(module)
. M5 G7 j$ W" D1 J9 d {
0 H q9 h! U& p% S //(3.1)KBI0模块
# p5 q. X, ?( W, U) Z/ C; Z F; J case 0:9 g/ {& x$ R" Y) s. m' U3 y' F
SIM_SCGC |= SIM_SCGC_KBI0_MASK; // 使能KBI0总线时钟
( G; B7 L* Y: ]% u' s( D" Z KBI0_SC = 0; //初始化KBI0_SC寄存器(状态寄存器)
; Z! E4 f7 i$ j% |9 k" T if (kbiMod == 0) //进行边缘检测
7 f/ z! ~# t L" C: L" m {
5 s+ }3 p, e; Y3 Q+ e4 X3 W KBI0_SC |= 0x00;
( d! y3 ]: h- a$ L }
0 Y& S8 e% o- N, V( l6 N) y else //否则 检测和电平控制
% y9 ?) [8 u" v- l6 C {! J( c( b2 ^4 W- w0 J! G5 x7 Y" h" K
KBI0_SC |= 0x01;
! Y E& |! i: M7 S/ Q8 S }
/ k- ?, z" @& L: M //触发条件
; Z$ S7 _' ?# s4 h4 f- j3 K% } if(EdgeSelect == 0) //下降沿或低电平触发, H/ d) X( O; ~' m2 p; m' u' p
{3 l8 k. ^2 G0 b
KBI0_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发- j6 ~! F% }9 x# g# d4 ^' t
PORT_PUE0 |= 1<<chn;# q5 |9 K8 |3 \% B" S6 f' i7 J
}4 T6 u$ H2 D$ K% T8 {$ a4 j5 j
else //上升沿或低电平触发
) k, q# C) b% d$ q! L V$ i7 }# d3 j& u {
& ~( y; I. s1 P3 L2 ~% W KBI0_ES |= KBI_ES_KBEDG(1<<chn);//当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发: G2 {1 a9 R" W1 X& P: P0 v7 X
}
% E$ b1 P; p7 J! K$ I KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
7 a. l) v- ?: f1 k6 k1 R; R break;
* S2 G1 w& N/ z5 w h //(3.1)KBI1模块
3 g/ L; r5 M0 I/ b0 Y# _/ z; f case 1:6 m) n; _4 Q+ o
SIM_SCGC |= SIM_SCGC_KBI1_MASK; // 使能KBI1总线时钟
( J( K6 [6 T) K2 |* @. [7 i% ^ if (kbiMod == 0) //边缘检测. m A# u7 e( S- t0 `# m
{! P& t. J, w8 @
KBI1_SC |= 0x00;
$ m3 v- w! O: f# R c8 o }
# U0 n; z3 b7 y( } else //边缘检测和电平控制
+ a c! K) g4 T/ ]6 d& b# u& ~+ z( {! X# q9 Y {
' l* i2 \/ X+ v: P KBI1_SC |= 0x01; }" s6 N [7 N( m5 Y2 R- @
}
( r/ ?# h5 V* k# d2 [. E( `/ x( a if(EdgeSelect == 0) //触发条件:0-31位每一位代表每个引脚8 w. f1 H7 d/ Z
{
0 e" A1 T; R& _0 A8 D KBI1_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发
4 ?. _& M8 R# [/ Z PORT_PUE1 |= 1<<chn; //上拉引脚( P1 R: L3 j: `) Z
}' p: b7 u; Y, T" F" [) w' Z' @
else- S. J( Q7 P" m0 I. _8 @& Z
{
8 _* K* I ^) g/ \- h" c KBI1_ES |= KBI_ES_KBEDG(1<<chn); //当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发
9 Q$ Y; A) i @/ j8 {4 O* c% [ }
5 j" ^* ?- j6 R; h KBI1_PE |= KBI_PE_KBIPE(1<<chn); //中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能9 s8 B4 U' r* h0 }5 d$ ~" p0 E! y8 v
break;; b! [# K* a) A8 c/ J: [/ y
}
& i, K) a& p0 j* M}
; z. C$ Y4 z' c2 }* d) D4 B( x9 V# K- j6 Y! S9 d/ h# \
None
( ~1 T6 d$ {- ` r8 y3 p3.2.2 KBI模块中断使能
6 f$ k( A) V4 B1 W9 ~. m$ x
+ S* l' o: |- ?void kbi_enable_irq(uint_16 kbiNo)
. l5 {1 _3 a5 ~4 V3 X; c{5 s% @5 I! K! m1 Y% `( p
//(1)声明局部变量
1 }+ G: |) \) z' O% O, z if(kbiNo == 0)
# o0 a2 W& ~) c' K1 C {5 J( @! } w4 y% ?; v
KBI0_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器7 I* v6 y$ U# Z3 e9 t; s( j9 @7 w
KBI0_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清0
, t3 M6 Z( i' n S3 G' H KBI0_SC |= KBI_SC_KBIE_MASK; //使能KBI0中断
! S+ G. I; ~" K1 V; N# y }6 _) m8 D6 a5 u
else. w6 ?0 ~! c! P
{+ Z" Q+ N" I0 Z; W
KBI1_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器
0 }' f$ `! o9 v: L+ r* b+ j KBI1_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清00 H: a3 c9 f; E. o8 F; ^ ^( n4 e) r( N
KBI1_SC |= KBI_SC_KBIE_MASK; //使能KBI1中断" T- t9 j6 L4 M. W: T B7 t
}: h |/ ` d& C E$ Y* v
//(2)清空中断寄存器7 x _2 G# ?) P: }- p* J. |
NVIC_ClearPendingIRQ(table_irq_kbi[kbiNo]);
# C3 N9 ]: ^( r; W //(3)使能中断
2 C+ k% i6 W9 X. b NVIC_EnableIRQ(table_irq_kbi[kbiNo]);7 D+ n2 O8 P; _- ~
}
4 O8 w& W! P6 h, ^( I# g3 w/ g9 m! U- A* J
None" ~4 H! x: \, j7 }
3.2.3 禁用KBI引脚中断% Y' v X" k7 | B- U
* E6 O9 u5 L, [0 `& z: @
void kbi_disable_pin_irq(uint_16 kbiNo)
5 S* i6 o/ x, b8 e; e% T{, c2 Y3 P/ R5 H
//(1)声明局部变量& J! z1 c$ T5 c7 u! m
uint_8 module; //模块号! p- u0 `. A1 Z2 R' E K
uint_8 chn; //通道号) R/ ~( K9 b! N* m$ O! r
//(2)解析模块号和通道号
4 E. V9 s* G! A' c$ ]/ N, y7 e kbi_mux_val(kbiNo,&module,&chn);
0 |$ {+ G- i" H/ K* l9 ^ //(3)根据不同模块号进行设置7 Q/ u: r* R- B; o7 M+ A/ }
switch(module)
* T0 d B: V/ m Y9 h3 L {
. n: E% m6 b/ g6 }0 E5 z* m //(3.1)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能/ P! |, l) {; X
case 0:- Z) y9 O& B# O% n. r- p2 X
KBI0_PE &= ~KBI_PE_KBIPE(1<<chn);1 a* E; }% u' k+ V5 t& b* h4 e: z
break;0 x0 e- ^6 v/ L8 O
//(3.2)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
) R" ]5 h I: d8 z9 K( r. I3 A case 1:
- W, T/ a5 A' S1 d4 n7 g# ^1 A) G KBI1_PE &= ~KBI_PE_KBIPE(1<<chn);
% s9 `( x7 w# |# w break;1 J! _; }. n/ s' x1 Q$ g7 Z8 @
}
X0 Q/ \- i2 e- t; N! j. F9 M}1 \: h2 r3 k) D; O% ^
9 r3 z- x/ Q5 }( v3 X( DNone& G5 x# M7 j+ m A7 V& c) O' i6 U
3.2.4 使能KBI引脚中断# y1 p) g% D0 P5 }
. B+ A N/ r0 g$ x( C# X7 i% }/ fvoid kbi_enable_pin_irq(uint_16 kbiNo)" F8 Y' _. j) i( l Z7 X
{
" m: S/ X9 Y# Q) E: X' W1 Z8 T //(1)声明局部变量3 T) ~# g/ H6 g
uint_8 module; //模块号
) x- b9 k7 B( P9 H. q2 C uint_8 chn; //通道号3 e# u: W/ M7 U9 Y4 C% T: l
//(2)解析模块号和通道号 C6 b+ {7 b; y2 X5 C' I
kbi_mux_val(kbiNo,&module,&chn);
: d# Z8 Z; s1 V# ^. @/ R) W* W$ b4 f //(3)根据不同模块号进行设置
2 I3 a0 `+ _; R/ @ switch(module)8 w- c4 L: o3 |5 j
{+ |: v- J. _; v- x2 C) Q
//(3.1)KBI0模块
$ W( r7 {1 P. b9 n0 Z5 g* x case 0:
9 f0 d/ S M$ _4 j KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能6 ^% g$ f" U. m9 E
break;
0 i3 x+ V0 N/ ]" l! b //(3.2)KBI1模块
" V' I/ ^& c2 q5 n6 w- J case 1:
& [4 F& \/ f# o6 H. e/ I KBI1_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
" p1 E; { h; X/ @3 `) M break;. t s& c g- g, N2 x; f, A3 ?0 V! b
}
0 s/ G5 J) y8 |0 g# r}# E0 h7 D0 ?8 y! W7 f
/ R) k" y5 Y; r: A* hNone! v9 _. j' P0 d" }$ z
四、KEA128的时钟配置
" r% F1 r* X9 H7 `. c1 y- h: B4 ^* m5 X" K; A- ~
参见NXP KEA128 DS(S9KEA128P80M48SF0.pdf ),可以知道MCU最高支持48MHz core frequency.
; U& u, f5 ]/ [
1 L+ M1 P+ I2 v) Z中文版数据手册:+ Q# s3 a# Q( \# v/ D
1 l) r' l& N3 E n具体的时钟定义:5 l/ N- w0 H2 o
# x) s$ |' F& g) G) a1 W! e后续待更:
{! Q1 f3 z/ p8 Z& D7 O- Q5 `$ K6 ^* y8 Q3 }8 s" |* r
系统时钟(core clock/system clock)与总线时钟(bus clock/flash clock),FTM/PWT关系% L+ _6 ]( j1 j
- H1 ~+ ^' d6 T
core clock = ICSOUTCLK / div1, bus clock = core clock / div2, FTM/PWT时钟 = core clock / div3, `2 |3 P. k% h5 A4 [6 B
|
|