|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
; z9 P4 |% T8 d: {/ e3 ~; T一、开发板 TRK-KEA128
" l- N5 H2 _2 J% D4 ~0 Z
+ B, b7 z# v' V/ X: x如今车载的电器设备、娱乐功能越来越多,然而更多的功能也意味着更多的电子元件、更多的线路,这无疑让车身布线成为一项十分艰难的工作,因此,CAN总线出现啦。
, b, X4 s2 E- [5 W1 m
$ b& o. y2 [# Q通俗的讲,CAN总线好比在汽车的控制元件之间建立的网络,使它们实现资源上的共享(CAN总线通信方式:节点发送的信息可被网络中所有其他节点看到),这样,不仅大大减少了相同传感器、导线的数量,同时也使可以配置的控制单元读取更多信息,实现更加精确的控制。
" Q$ D$ ]0 t0 K: m0 j; F0 ~
' W8 ^8 I U& q; s$ b+ p显然,TRK-KEA128就是基于CAN功能的控制芯片。
5 K$ R% y- l5 ^" Y3 b. E8 ]( G* K6 g. J
TRK-KEA128板载的资源:1 h0 N5 H) H, j- P
9 x2 |* n; f% {% r1 E. n: s+ U* T 采用80 LQFP封装的Kinetis KEA128 mcu+ ~4 m; R3 w" ] L4 f
采用PK20DX128 MCU的板载OpenSDA调试和编程电路
" I* U& q" e0 g, ~7 ^2 j 一个CAN通信接口、一个LIN通信接口2 ?# Z( _: G; B. E* s: d# S' e
一个环境光传感器、四个用户LEDs
- ]& z7 v+ l: Z$ k 一个MCU RESET按键、一个SDA RESET按键、两个用户按键
* U; m i6 |" W$ V4 n/ D4 E. A 12V DC Jack输入、5V MicroUSB口输入# P2 ~7 E8 y, n" n/ _9 C
' {+ N1 `3 S/ e
TRK-KEA128板载的电路功能:
5 _+ y! T: U$ x
0 T% n2 B+ U3 O$ B0 q 主控MCU以及延生的电路功能(例如IO口引出的用户扩展接口、按键\LED电路、利用ADC功能拓展的光线传感器电路)6 q. k9 I2 A3 C
基于PK20DX128 MCU的板载OpenSDA调试电路5 e7 x% g; ~0 ]2 |) P+ |. s! R8 @/ O+ L
通过外部PHY扩展的CAN、LIN接口电路* Y0 ]: ~( |8 Z
8 O8 v4 W0 c- [9 v4 P
下图是KEAZ128的中文手册目录,来自网络(侵权必删):$ [: l7 \+ q1 F8 p' x( j1 i
二、微控制器 PKEAZ128AMLK
2 D8 e8 d2 C) \" r ^' {7 r
' r. I5 \8 @5 d5 D& v5 q主控MCU是 PKEAZ128AMLK,基于48MHz主频的32位ARM Cortex-M0+处理器,集成了128KB FLASH以及16KB RAM,主要集成了CAN控制器,适合面向汽车网络的应用设计,并且采用了常见的LQFP80封装。
! H; q" L; C" @
$ D* E8 P, w X/ T) K- M+ CPKEAZ128AMLK微控制器的特点:
$ r' x( T7 |3 v, X& S7 c( p9 B: G6 f v: X6 V% g
高达48 MHz的ARM Cortex M0+内核,集成128KB FLASH、16KB RAM, _6 k9 f1 t! ^8 O
2.7V~5.5V宽电压供电
/ y6 N* i' X/ X, z9 ` x O 一个16通道12位SAR ADC,两个模拟比较器、定时器、安全模块等" }) b1 _) g/ @; a1 X3 ?
SPI、I2C、UART、CAN2.0A/B、KBI等接口,最高支持扩展71GPIOs
8 |+ X2 c4 g; J; v9 V 电源管理模块(PMC)具有三种模式:运行、等待、停止
1 F( j. R7 Y. V* W/ t/ ~" E* P7 Z
5 @$ S; d. V7 F/ T' XPKEAZ128AMLK微控制器的特性:
/ l$ W, {% K( n) Z( Y8 K
' W, n8 }7 ]/ t0 O) f 基于ARM Cortex-M0+处理器,功耗低,生态圈广泛;; z. H- k) v8 o! b) K: I" Z- y
集成了CAN2.0A/B控制器,具备CAN网关功能,适合需要CAN总线网络的应用。
8 ]( A! c) [& [' o0 n( z$ f0 x$ v
三、KEA128的KBI模块
; g& c* J% w8 s( \2 J/ x
4 n9 K6 H/ b6 {恩智浦Kinetis KE0x、KEA 系列MCU片上集成有KBI ( Keyboard Interrupts 键盘中断模块 )。
U* r: A" Z7 y+ k/ X) U' u' n+ l
: z+ D% l C( d/ @. p9 hKEA128有两个支持引脚中断的 KBI 模块,KBI0和KBI1。6 T& {& K6 j, u; N0 N0 W- P
9 v; B9 O' n" X+ G+ l2 ~
KBI使用总线时钟,SIM_SCGC寄存器使能KBI总线时钟。
7 g. I. y" w$ \# Z' x3.1 KBI端口
. f, R8 Y2 \" H3 X3 y
8 P3 Q( j, r8 W% {1 f3.2 模块功能配置代码
. n0 e- z) E8 d$ v3.2.1 初始化
$ s* J; @5 A$ q4 k) N5 ^7 N" c! o9 u+ F6 l
void kbi_init(uint_16 kbiNo, uint_8 kbiMod, uint_8 EdgeSelect)
8 }7 @- ] S# H3 x5 q{+ F4 |2 w2 i6 V$ C* @2 W: {! f
//(1)声明局部变量
0 n3 ^ @) z+ H0 z' H uint_8 module; //模块号
2 U6 p( u. Z" L$ G uint_8 chn; //通道号2 | g, X9 s. i' r5 S
//(2)解析模块号和通道号
9 s, ^- m) f* h" z kbi_mux_val(kbiNo,&module,&chn);, I! L: Q# ^9 x7 H0 n$ W
//(3)根据不同模块号进行设置 @* Q: g3 Q- _9 b
switch(module)
7 F) a% U' P! a4 n& R5 U+ Q {
0 L( ], ~; D4 ~* K/ Q5 M: p% U8 J" B- R //(3.1)KBI0模块% [& H; w4 Z- u' s! J! y k" W+ v% z
case 0:& B( G7 |& M A! h
SIM_SCGC |= SIM_SCGC_KBI0_MASK; // 使能KBI0总线时钟
) t; R# m* W2 A KBI0_SC = 0; //初始化KBI0_SC寄存器(状态寄存器)3 \" V4 a) d/ g- c% }
if (kbiMod == 0) //进行边缘检测
1 D, C- I1 @# Y2 w' R# | {. `: [ y1 l X, e, b+ h) F1 [" J
KBI0_SC |= 0x00;/ {$ h1 r1 |: ~+ \4 t' \) E
}. V: C) M- x9 e+ z- b% K! |0 ?* h; `( x
else //否则 检测和电平控制7 k9 V& o' e) R# k9 E
{3 J3 u% t% ]5 L! l7 n! R
KBI0_SC |= 0x01;
* F+ {1 I" m: z. M* D, ^ }* b! o q: \6 l0 e# W% F
//触发条件. }3 t$ R0 L1 M. t; F1 Q
if(EdgeSelect == 0) //下降沿或低电平触发" l" Z* G! V2 [# Z
{
3 [" h) l4 e$ K# {0 W* K8 Q: e KBI0_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发
. y9 o: M- v1 ]2 N5 |( ^( { PORT_PUE0 |= 1<<chn;4 D9 @. o& p- d- y( M# M4 @
}
; \/ T2 M2 f# R' s: T2 j else //上升沿或低电平触发* x. U J5 T' L! O5 q
{
$ H1 g# C' o& r2 H7 p. T KBI0_ES |= KBI_ES_KBEDG(1<<chn);//当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发% E p' @3 h) b
}
g5 q( d$ K' l KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
5 t- ~5 a; ?: ]% j5 T d$ j# y break;
& a* A- A5 B- f2 y: Y# N4 W# T1 H //(3.1)KBI1模块4 j. i* [: ?% |3 Q5 `3 E6 F
case 1:# l4 d% l+ { b5 h1 I' X
SIM_SCGC |= SIM_SCGC_KBI1_MASK; // 使能KBI1总线时钟
0 t) i1 @+ c- Q! U% g- ? if (kbiMod == 0) //边缘检测
; j9 q& }8 |7 N3 o' Q6 L4 y9 c4 K: T {% y2 f" q9 ]& |
KBI1_SC |= 0x00;0 O1 @/ D+ p( w- n7 k4 o# I) n
}4 A$ g+ a$ Y# I% ^/ P
else //边缘检测和电平控制
' S6 O6 y0 m+ r* h {
, `, }0 B8 {" P" _6 Q: Y' b KBI1_SC |= 0x01;0 C8 u- O, {3 m* y; h& ?4 @7 i
}
# k( b! {) r0 H if(EdgeSelect == 0) //触发条件:0-31位每一位代表每个引脚
8 l7 ^2 p. y a4 v( A {6 `0 c) Q9 K6 P
KBI1_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发: [. A* ^/ E3 J- ?
PORT_PUE1 |= 1<<chn; //上拉引脚, h6 M% h) \( O1 V T4 i3 @
}5 \7 V" V3 u. u7 b7 q5 ?
else
; I0 B6 S5 p* {5 W V3 X0 O' y {
8 X# Q9 f4 a- U/ G KBI1_ES |= KBI_ES_KBEDG(1<<chn); //当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发
; D w5 B9 b x j! l2 a }
+ L {9 I0 P! H8 B; R. w# p- i KBI1_PE |= KBI_PE_KBIPE(1<<chn); //中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能+ ~9 v9 x- [8 k$ I5 n0 L' I* X$ c! @
break;9 B' j, \& w: I6 g' N
}
# J3 v0 y6 c) E" O}
5 N T* g- w& J b! d) k) [1 u1 Y- w# O$ D/ u0 E4 {/ K
None
7 R" M' g3 N) ?) r9 T: h3.2.2 KBI模块中断使能
9 i! s$ T4 C C* @5 Q9 R' J3 m' K# R) ^
void kbi_enable_irq(uint_16 kbiNo)4 J2 \$ S7 O" m5 {
{6 P- c3 v0 k1 Y% t2 Z* x
//(1)声明局部变量 S; ]9 T9 ]1 t! L" D
if(kbiNo == 0) d, \ ?9 J+ g
{
) h4 y% F1 B+ | KBI0_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器5 n, p. L3 z" M
KBI0_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清0
, J1 F' V! F1 n( x0 F1 h6 e KBI0_SC |= KBI_SC_KBIE_MASK; //使能KBI0中断( K( Y( @4 l6 N1 D% I7 \
}
: L- a. `: N0 R" x f1 w7 s* i5 ~ else
# a- N5 m) l3 E4 u/ j( F4 @ {
& _1 \; n3 I6 k( S: F$ b KBI1_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器& r) Z2 i6 v' Y! ^
KBI1_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清0
: T! a* s }7 z M C KBI1_SC |= KBI_SC_KBIE_MASK; //使能KBI1中断4 d" B7 U7 F3 u& W' {
}9 l' C4 Y* R5 `9 r3 w4 l2 B8 A( j
//(2)清空中断寄存器9 j7 q3 y4 z* r3 J/ B* B
NVIC_ClearPendingIRQ(table_irq_kbi[kbiNo]);9 {1 C! {, F2 D. g+ }2 y
//(3)使能中断$ M/ r$ ^% A6 a6 x+ S* g
NVIC_EnableIRQ(table_irq_kbi[kbiNo]);
) S5 U% z" E. c3 @+ {' D8 l0 O9 Z5 {}
) v/ g5 Y9 I( X2 S4 g' g/ s
4 |0 H2 ^8 G/ p M2 X$ W5 o2 M4 aNone
5 ?) w0 s( r. h2 g' H1 Y+ `3.2.3 禁用KBI引脚中断, w4 @) V, V" p' I* O# b$ Q2 ]
/ r J' D7 e' j4 R8 L- p% e
void kbi_disable_pin_irq(uint_16 kbiNo)
+ W: z$ X3 ^3 i5 h" d. w, E5 I{0 o, P$ K! i* x/ ] r
//(1)声明局部变量
# M4 l, F0 E0 Q4 V- ?5 E9 K uint_8 module; //模块号
; [& _4 d @- O. P' m uint_8 chn; //通道号
* x/ q! Z0 a! e1 k //(2)解析模块号和通道号6 ]; R, n3 l' Y8 b& v6 \
kbi_mux_val(kbiNo,&module,&chn);# y1 y* [- e) x( X' b
//(3)根据不同模块号进行设置 r/ y6 h! V/ T3 P3 L' R% L2 j! J
switch(module)) g' {) w! Z8 m g0 g ^: d
{
! g) H2 Q" G+ t6 j4 L //(3.1)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
, G3 A; q6 ^0 j/ G$ { case 0:
- y/ {4 b% W" y1 g# f& }$ E0 [, K KBI0_PE &= ~KBI_PE_KBIPE(1<<chn);
" F) T% l7 c" Z# C% S9 S break;0 I, c" r0 |1 c& O
//(3.2)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
& Z! k q9 g2 X. U+ j case 1:; H' R+ H) B+ k" s. n; Z/ ] s
KBI1_PE &= ~KBI_PE_KBIPE(1<<chn);
, ^& B9 v! c. o" Y; y0 r% n break;+ I Z- U" Y. s4 ?* D
}
( J5 q2 z9 y! ]}) k) j7 m: \1 i6 ^6 Q
: A0 l4 W/ M8 T, }
None/ G m1 e) U/ ?+ ^. f9 {8 x
3.2.4 使能KBI引脚中断
^+ z5 l: @2 w0 V3 u
' |+ N8 q( w$ Z# B5 ~void kbi_enable_pin_irq(uint_16 kbiNo)2 M! R1 f1 f1 D2 s2 P
{
1 \$ d4 `: A# u4 ^% E1 f //(1)声明局部变量& ?4 ?8 `* ?6 `4 ?2 M
uint_8 module; //模块号& n$ n% g* A8 l
uint_8 chn; //通道号
* G2 P6 h& A& L3 c9 |# I' u //(2)解析模块号和通道号; e- b0 u* S$ e1 t
kbi_mux_val(kbiNo,&module,&chn);+ o* E. r; Y* U8 Y& M
//(3)根据不同模块号进行设置& s S8 T7 U7 t
switch(module)
' p! K0 k9 v' z2 n* ] {6 ?' h+ L" A; x! z; D$ \" L ^
//(3.1)KBI0模块' p' F6 A! G1 d) p3 _$ L' @
case 0:
& B c4 W5 G8 [. n" E3 T KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能% t3 m8 B& H; _" z: x$ A9 G% K l
break;
- `6 {; f* h; K Y! D) ] Z //(3.2)KBI1模块8 m% @% ~! }4 _" p5 J. \# V2 m- M
case 1:* m8 ?+ }! ?& w: y9 R# a
KBI1_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
! V2 ?/ e' ]7 x break;
( r$ X7 ]9 A$ U+ A2 {, h }
- t k, `' Q2 |4 x) K E2 Y}4 \) f/ k$ K# P6 g9 w$ l
6 e2 p5 ?; V$ R$ I- {* e; M' r
None. y- c( K, V/ Y+ o% e* R) h/ G1 h; A
四、KEA128的时钟配置0 D: F" c+ P( G" z
% f+ B* a; R8 T V参见NXP KEA128 DS(S9KEA128P80M48SF0.pdf ),可以知道MCU最高支持48MHz core frequency. ]7 G6 [3 c9 p8 E: W0 i. R
6 O) @5 b9 g9 O8 \中文版数据手册:& K4 U3 ^6 j2 q6 q: u L
9 r! a5 N3 R1 A' T% n1 y
具体的时钟定义:% Q! S; V8 b7 ]0 p# _& g% Q
$ `# Z7 P3 y( j( o+ x后续待更:0 J$ F4 u. a5 x6 E9 ~
b! b7 g9 H0 v8 X
系统时钟(core clock/system clock)与总线时钟(bus clock/flash clock),FTM/PWT关系/ o+ E" v0 j1 a$ w/ t1 Y. S
# U/ O$ `* P1 V- j
core clock = ICSOUTCLK / div1, bus clock = core clock / div2, FTM/PWT时钟 = core clock / div3
" I. d4 y; ^% S0 N: @/ H4 t |
|