|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
- ^6 l/ j J9 D7 B9 @$ U一、开发板 TRK-KEA128
9 B6 S7 |) x4 a) q% A$ j. R/ f5 E5 M" _0 D2 [
如今车载的电器设备、娱乐功能越来越多,然而更多的功能也意味着更多的电子元件、更多的线路,这无疑让车身布线成为一项十分艰难的工作,因此,CAN总线出现啦。
! q( g9 _6 c" {7 E& _& e0 [! v; {* @% J
通俗的讲,CAN总线好比在汽车的控制元件之间建立的网络,使它们实现资源上的共享(CAN总线通信方式:节点发送的信息可被网络中所有其他节点看到),这样,不仅大大减少了相同传感器、导线的数量,同时也使可以配置的控制单元读取更多信息,实现更加精确的控制。
/ J. s3 j3 w8 B8 M2 q) H
% N- m! p+ C. h. [. c显然,TRK-KEA128就是基于CAN功能的控制芯片。
0 k! `/ r% X) l" Z m" L
( {) s+ X: G: x/ aTRK-KEA128板载的资源:
2 ? A; e, ~, ~) B+ R7 O- Z* } U" M
采用80 LQFP封装的Kinetis KEA128 mcu1 n6 f4 ]9 w" [0 ?
采用PK20DX128 MCU的板载OpenSDA调试和编程电路
' U' N7 Q: E: H! s 一个CAN通信接口、一个LIN通信接口
* G! d& C* Z+ F$ a# l 一个环境光传感器、四个用户LEDs/ q2 ^: g% g5 d7 [4 h+ j
一个MCU RESET按键、一个SDA RESET按键、两个用户按键2 j! {3 p. C' Y, _$ u( ]
12V DC Jack输入、5V MicroUSB口输入
' h+ v, `% g- d; T! n. f( u7 u
% [* M* W& f+ Y0 R" L& DTRK-KEA128板载的电路功能:) N2 D0 |6 t0 s* i$ p+ |* m
z* p0 h) X7 E3 W) e( u
主控MCU以及延生的电路功能(例如IO口引出的用户扩展接口、按键\LED电路、利用ADC功能拓展的光线传感器电路)) g1 u+ U, e, ]4 l
基于PK20DX128 MCU的板载OpenSDA调试电路$ ?0 Z( P% m. c, H; W8 \$ F
通过外部PHY扩展的CAN、LIN接口电路( b% l' Z1 P3 `5 [: X% D
W2 H. z9 ?2 K下图是KEAZ128的中文手册目录,来自网络(侵权必删):
5 u7 c4 Z( e+ r/ {二、微控制器 PKEAZ128AMLK
5 V+ v( X/ r( d1 M D0 j G ]9 s
! t: D% `/ \# u7 L$ v主控MCU是 PKEAZ128AMLK,基于48MHz主频的32位ARM Cortex-M0+处理器,集成了128KB FLASH以及16KB RAM,主要集成了CAN控制器,适合面向汽车网络的应用设计,并且采用了常见的LQFP80封装。
3 g( |# W* e7 W- @, x! {5 e
3 k0 ^1 z! r p. t8 ~$ l& e; tPKEAZ128AMLK微控制器的特点:
/ i8 h. |6 t* B: H9 N, z! A3 T6 q$ r% S
高达48 MHz的ARM Cortex M0+内核,集成128KB FLASH、16KB RAM
3 i( S) p8 d$ X$ |) J, q 2.7V~5.5V宽电压供电- O4 q7 j9 z; ]2 J
一个16通道12位SAR ADC,两个模拟比较器、定时器、安全模块等
; ^5 P# }' g. `4 z" i0 p# U9 n) [. C1 R SPI、I2C、UART、CAN2.0A/B、KBI等接口,最高支持扩展71GPIOs9 p! v; D1 M% Q0 [
电源管理模块(PMC)具有三种模式:运行、等待、停止/ l8 ~0 ~2 s% D$ ^) M
/ o. a5 S$ b4 ~8 ]" g' cPKEAZ128AMLK微控制器的特性:4 ?+ o$ d/ W) W, y2 Y0 V+ I/ f7 k
+ ^% ~' ~6 d# _0 d/ |
基于ARM Cortex-M0+处理器,功耗低,生态圈广泛;
6 x, \" a6 \' { 集成了CAN2.0A/B控制器,具备CAN网关功能,适合需要CAN总线网络的应用。
% l5 G3 w5 W9 ]! G8 b+ J4 }$ |% t' w* b! K9 n" v( t3 r
三、KEA128的KBI模块7 K" J- r6 L3 y8 |9 x$ A- k& \
5 g! i. k* A5 R( `恩智浦Kinetis KE0x、KEA 系列MCU片上集成有KBI ( Keyboard Interrupts 键盘中断模块 )。
g/ w2 v7 o4 Q" u" i
' u- B" g& V( B6 k6 X5 VKEA128有两个支持引脚中断的 KBI 模块,KBI0和KBI1。" n6 t N3 y: C+ ?) u
: B6 N8 b3 n- j
KBI使用总线时钟,SIM_SCGC寄存器使能KBI总线时钟。8 e! a' n8 S) r9 G3 ?1 h
3.1 KBI端口
; [7 n3 x# S& p( _) Z# }/ W( K3 ~: w' d, i7 Y
3.2 模块功能配置代码+ p& x6 p' o0 Y* P
3.2.1 初始化
2 Z+ ]) S- w0 @3 P: N4 f- b# A# |$ T8 Y) w
void kbi_init(uint_16 kbiNo, uint_8 kbiMod, uint_8 EdgeSelect)
8 Z0 e. N& `/ A' d' N{
. z% G( I7 N2 O8 k1 e //(1)声明局部变量
: A+ Z, L' T/ ~ uint_8 module; //模块号
% k7 v( l/ h; s uint_8 chn; //通道号$ F& P, M0 ^ o, N$ R
//(2)解析模块号和通道号6 D9 w6 e/ P2 X
kbi_mux_val(kbiNo,&module,&chn);
. j$ V& I9 `6 c4 N: N$ y2 Z //(3)根据不同模块号进行设置
2 g/ ^" g% \/ k% S1 j4 T3 c9 u- u switch(module)9 q; Z& k5 E0 X
{1 F2 u: E% |* A9 j+ Q$ ?. j
//(3.1)KBI0模块
9 f# }0 y0 U5 F case 0:
& e0 s8 [* A. W: J SIM_SCGC |= SIM_SCGC_KBI0_MASK; // 使能KBI0总线时钟* r& z- t2 V2 m3 s4 @' g
KBI0_SC = 0; //初始化KBI0_SC寄存器(状态寄存器)) G$ y2 U4 }! B7 w3 a1 x
if (kbiMod == 0) //进行边缘检测' x6 i- c% p# ?7 q' `! P
{
) _# V# V. d6 ]; Q; D KBI0_SC |= 0x00;
2 C4 C" J9 I8 T }
0 _7 k' n% {8 i y1 W! Q+ f+ R" ` else //否则 检测和电平控制
6 f1 p* Z0 @! p7 i# q {9 S2 s9 J6 B; _8 v: S" |
KBI0_SC |= 0x01;5 h( U8 `% c: Y) s
}7 \/ c& [) b4 q& J# ` ~" F
//触发条件& t0 Q: a; Q1 s6 W+ M5 m* u
if(EdgeSelect == 0) //下降沿或低电平触发, R5 m. ~9 n0 |) `9 t! |, k2 X
{5 _% P% \1 i. R! }% S
KBI0_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发5 v- h; s: |% t; e2 q, R
PORT_PUE0 |= 1<<chn;; L- |1 {: O) S/ H; ]
}
4 ~6 s6 I0 k8 e& U+ h" o! n c else //上升沿或低电平触发% N5 H. z9 U( d3 w; ?3 D: t
{* H4 U$ q V' H0 Y6 t
KBI0_ES |= KBI_ES_KBEDG(1<<chn);//当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发2 o* f2 j5 z, J# R1 ~
}
- r- f6 B7 v p KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
/ I) R& I( G; S7 g8 i break;
2 T; e2 j" H9 l" A3 \# V/ [ //(3.1)KBI1模块" T y8 k1 j, R
case 1:3 y% ~/ v0 R, S" {' g) _
SIM_SCGC |= SIM_SCGC_KBI1_MASK; // 使能KBI1总线时钟( B8 j- M0 h* ]2 z
if (kbiMod == 0) //边缘检测
! k9 g" s6 v- a {
9 U* S* b, y; u# M: { KBI1_SC |= 0x00;
! I3 p. a( s$ i; m1 W( w- H }
4 b. j' Z% g9 H9 l, H else //边缘检测和电平控制
* n# `! h C, f! ?" ? {
t6 W U5 ?( k+ B- s% N7 t KBI1_SC |= 0x01;+ q, j) E6 Q3 s# ]. V
}3 [' ^1 ^! x: l8 C' m2 e
if(EdgeSelect == 0) //触发条件:0-31位每一位代表每个引脚
0 N1 ^& `0 h: d5 I" X {
- j9 g4 m' [( P7 x/ ?: B# o* z KBI1_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发, y7 Z$ G$ P# F' m( v$ R
PORT_PUE1 |= 1<<chn; //上拉引脚" K9 E0 J+ s1 }0 X3 {9 v+ `$ w0 M
}0 W. k" c' f. O
else
# j" V. Q! _. S$ _ {
9 l+ ^" t7 \) w KBI1_ES |= KBI_ES_KBEDG(1<<chn); //当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发
! {5 v: s0 Q& a4 m }# h3 D* K! o" p1 C" T5 Y. C. f
KBI1_PE |= KBI_PE_KBIPE(1<<chn); //中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能0 \4 u0 c; o s8 ~6 {3 [* b' k, R) ?
break;
" f0 f& Z. [5 m* Y6 A }* b2 p. O6 y1 x7 L# ?) M6 C
}) g0 n" }. g) A1 ]2 F
( f9 [& N, Z5 w, }' _: wNone. E3 B* w1 w0 z" Q6 u1 ~" i! Q
3.2.2 KBI模块中断使能$ S4 h& i' l0 t3 e/ _
* H3 h& s6 l( |- [8 @1 fvoid kbi_enable_irq(uint_16 kbiNo)
p1 Z9 K5 p7 b/ s, w% \{$ ~3 R0 C2 s5 P& Y* p5 Y
//(1)声明局部变量
- t. d5 C) X( { if(kbiNo == 0)( D6 _; | w% s( j R% @( Y
{% M7 ]+ D9 T9 p9 t( \7 _
KBI0_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器9 W' S: Y6 T& X- A" {
KBI0_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清0
2 Q* m$ O _5 V KBI0_SC |= KBI_SC_KBIE_MASK; //使能KBI0中断 M( a0 s: ~ G, Z
}
: I# }" A1 _+ g4 O7 g1 d9 ?/ C else
- p% j0 E `* Z* T. n; ^) G3 W {5 R% P0 |- k" ~$ w/ F
KBI1_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器
. q, v( `5 A9 Y5 ` KBI1_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清0# t, L2 A3 G" D5 W% y( t
KBI1_SC |= KBI_SC_KBIE_MASK; //使能KBI1中断$ I/ d3 \0 E: N. G! v
}
O i- Z7 U1 G //(2)清空中断寄存器
; @. P( g, ] u. Z NVIC_ClearPendingIRQ(table_irq_kbi[kbiNo]);4 P" c3 @: b) e, T- L" w0 o
//(3)使能中断/ z* O1 {% }8 z5 ?
NVIC_EnableIRQ(table_irq_kbi[kbiNo]);! e! l. p. ~* a7 x! W7 E" Z4 h
}
# m# o5 J; v# \& A& l) z% b1 p4 O7 }* W) C! z9 K! A4 n
None) c+ ^- l0 E" z1 |5 A8 A/ `- l
3.2.3 禁用KBI引脚中断
; B) h9 m( Y8 Z; g$ w. l: }; ~1 B; I' R# f% B- L7 s; }8 Y* N
void kbi_disable_pin_irq(uint_16 kbiNo)
& E, m# _5 u! W1 u( k! g/ T9 x2 Z{9 N# u! @! g3 \
//(1)声明局部变量
9 M1 x- w7 v: m uint_8 module; //模块号/ O. d4 j& k, z8 z
uint_8 chn; //通道号
. n# @4 e# n; Y2 l, K! k- d7 k! Q //(2)解析模块号和通道号2 ]4 Z% J$ m0 W/ O3 M: A. `: O
kbi_mux_val(kbiNo,&module,&chn);- ]+ {; j4 e6 c: B
//(3)根据不同模块号进行设置4 |9 E" ~3 ~, K& k3 }. Q4 y
switch(module)+ A# T) C- r7 c4 {4 s
{
u- z0 P0 I+ F: e1 }' x% ] //(3.1)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
! E7 m# S5 S+ N" [! P6 R case 0:( T1 Y8 M4 Z0 Z
KBI0_PE &= ~KBI_PE_KBIPE(1<<chn);) a5 y0 C. K `* W/ w$ w
break;5 v# G; U6 L5 i- ^" N
//(3.2)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能- Y$ n3 B+ ~5 ` z$ | _
case 1:
2 W6 S- r6 F! t8 {3 w KBI1_PE &= ~KBI_PE_KBIPE(1<<chn);
8 L! ^. J8 x3 I3 y) W) E1 E break;5 C* ]+ x. ~+ B) \" f S
}
- ^# c8 U8 l# M9 F0 \* y}; F8 q5 N9 @( D
4 z% h5 y3 a1 F$ p4 N
None3 J4 r, R' c, z1 I# s
3.2.4 使能KBI引脚中断
* k$ x, q+ `' _! T: B& N; s
* D* C( h& ^2 S ?7 hvoid kbi_enable_pin_irq(uint_16 kbiNo)5 }3 z8 }1 q {8 J, J y6 y$ d* w
{
, D8 F" W; Q& E; u* l- j+ t0 K, a //(1)声明局部变量! J. ]4 S, o0 a/ ^5 C
uint_8 module; //模块号7 D1 z$ v6 Q6 o+ t# U
uint_8 chn; //通道号% z% s2 a- O4 {4 B* ?) K3 n
//(2)解析模块号和通道号3 G' \7 X, E/ m8 R
kbi_mux_val(kbiNo,&module,&chn);
5 U# ~1 _' w* T0 H7 u0 B //(3)根据不同模块号进行设置/ M; Y8 l" ^+ {/ q
switch(module)( R0 R+ M0 D: J# }1 Y7 i
{$ J2 Q. J2 P6 r
//(3.1)KBI0模块
- \4 B! G' a9 r& } case 0:
% `0 u; L3 a; d+ T+ Q6 L$ g$ K KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
, D+ x0 G. l, x+ e& H5 ] break;
0 M! m4 @& p& o9 ]% h1 g //(3.2)KBI1模块1 I; Q# f! m0 Z/ {" @
case 1:$ V6 `* x# ~/ |8 H" v" e8 `
KBI1_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能0 n+ T% e: f% I& M1 K; g" Z
break;
# ^! Q7 p6 F1 R. `8 w! [) c }
6 G+ e2 D+ f2 o6 G% _}) z# X$ [* ~" h L) I
! M+ e6 x' D* {' X" z! R7 jNone+ f7 |" n. I: _; N8 _6 Y5 h% t
四、KEA128的时钟配置. w7 B% K* `$ u: W% _$ a
5 M: o: r2 g9 l6 ?. }
参见NXP KEA128 DS(S9KEA128P80M48SF0.pdf ),可以知道MCU最高支持48MHz core frequency.2 P) l" q, h9 P' t- ~$ B/ n
+ T' A4 q) A. ^2 H2 p
中文版数据手册:5 [$ S0 K/ l9 j& r
5 U% |9 i$ k7 T! _9 ?, T
具体的时钟定义:) p |& T! h; ~2 Y- z- Q
# d2 K7 l3 t2 ^3 k2 e% q& g5 p4 C
后续待更:! r) @6 P% a, B
, ~4 ^+ @( J9 g8 i
系统时钟(core clock/system clock)与总线时钟(bus clock/flash clock),FTM/PWT关系
. x) n7 W# l8 d6 s. Z4 W7 w
& x( y7 w5 g7 f A) n( }core clock = ICSOUTCLK / div1, bus clock = core clock / div2, FTM/PWT时钟 = core clock / div3' s* i7 ?! f* n) W7 }2 R
|
|