|
寫這個(gè)的原因是,作業(yè)三需要理解學(xué)長們的程序(節(jié)能二隊(duì)程序),畫出思維導(dǎo)圖,而學(xué)長的程序是用KEA128作為開發(fā)板。
一、開發(fā)板 TRK-KEA128
如今車載的電器設(shè)備、娛樂功能越來越多,然而更多的功能也意味著更多的電子元件、更多的線路,這無疑讓車身布線成為一項(xiàng)十分艱難的工作,因此,CAN總線出現(xiàn)啦。
通俗的講,CAN總線好比在汽車的控制元件之間建立的網(wǎng)絡(luò),使它們實(shí)現(xiàn)資源上的共享(CAN總線通信方式:節(jié)點(diǎn)發(fā)送的信息可被網(wǎng)絡(luò)中所有其他節(jié)點(diǎn)看到),這樣,不僅大大減少了相同傳感器、導(dǎo)線的數(shù)量,同時(shí)也使可以配置的控制單元讀取更多信息,實(shí)現(xiàn)更加精確的控制。
顯然,TRK-KEA128就是基于CAN功能的控制芯片。
TRK-KEA128板載的資源:
采用80 LQFP封裝的Kinetis KEA128 MCU
采用PK20DX128 MCU的板載OpenSDA調(diào)試和編程電路
一個(gè)CAN通信接口、一個(gè)LIN通信接口
一個(gè)環(huán)境光傳感器、四個(gè)用戶LEDs
一個(gè)MCU RESET按鍵、一個(gè)SDA RESET按鍵、兩個(gè)用戶按鍵
12V DC Jack輸入、5V MicroUSB口輸入
TRK-KEA128板載的電路功能:
主控MCU以及延生的電路功能(例如IO口引出的用戶擴(kuò)展接口、按鍵\LED電路、利用ADC功能拓展的光線傳感器電路)
基于PK20DX128 MCU的板載OpenSDA調(diào)試電路
通過外部PHY擴(kuò)展的CAN、LIN接口電路
下圖是KEAZ128的中文手冊目錄,來自網(wǎng)絡(luò)(侵權(quán)必刪):
二、微控制器 PKEAZ128AMLK
主控MCU是 PKEAZ128AMLK,基于48MHz主頻的32位ARM Cortex-M0+處理器,集成了128KB FLASH以及16KB RAM,主要集成了CAN控制器,適合面向汽車網(wǎng)絡(luò)的應(yīng)用設(shè)計(jì),并且采用了常見的LQFP80封裝。
PKEAZ128AMLK微控制器的特點(diǎn):
高達(dá)48 MHz的ARM Cortex M0+內(nèi)核,集成128KB FLASH、16KB RAM
2.7V~5.5V寬電壓供電
一個(gè)16通道12位SAR ADC,兩個(gè)模擬比較器、定時(shí)器、安全模塊等
SPI、I2C、UART、CAN2.0A/B、KBI等接口,最高支持?jǐn)U展71GPIOs
電源管理模塊(PMC)具有三種模式:運(yùn)行、等待、停止
PKEAZ128AMLK微控制器的特性:
基于ARM Cortex-M0+處理器,功耗低,生態(tài)圈廣泛;
集成了CAN2.0A/B控制器,具備CAN網(wǎng)關(guān)功能,適合需要CAN總線網(wǎng)絡(luò)的應(yīng)用。
三、KEA128的KBI模塊
恩智浦Kinetis KE0x、KEA 系列MCU片上集成有KBI ( Keyboard Interrupts 鍵盤中斷模塊 )。
KEA128有兩個(gè)支持引腳中斷的 KBI 模塊,KBI0和KBI1。
KBI使用總線時(shí)鐘,SIM_SCGC寄存器使能KBI總線時(shí)鐘。
3.1 KBI端口
3.2 模塊功能配置代碼
3.2.1 初始化
void kbi_init(uint_16 kbiNo, uint_8 kbiMod, uint_8 EdgeSelect)
{
//(1)聲明局部變量
uint_8 module; //模塊號(hào)
uint_8 chn; //通道號(hào)
//(2)解析模塊號(hào)和通道號(hào)
kbi_mux_val(kbiNo,&module,&chn);
//(3)根據(jù)不同模塊號(hào)進(jìn)行設(shè)置
switch(module)
{
//(3.1)KBI0模塊
case 0:
SIM_SCGC |= SIM_SCGC_KBI0_MASK; // 使能KBI0總線時(shí)鐘
KBI0_SC = 0; //初始化KBI0_SC寄存器(狀態(tài)寄存器)
if (kbiMod == 0) //進(jìn)行邊緣檢測
{
KBI0_SC |= 0x00;
}
else //否則 檢測和電平控制
{
KBI0_SC |= 0x01;
}
//觸發(fā)條件
if(EdgeSelect == 0) //下降沿或低電平觸發(fā)
{
KBI0_ES |= KBI_ES_KBEDG(0x00); //當(dāng) kbiMod = 0,表示下降沿; 當(dāng) kbiMod = 1,表示下降沿或者低電平觸發(fā)
PORT_PUE0 |= 1<<chn;
}
else //上升沿或低電平觸發(fā)
{
KBI0_ES |= KBI_ES_KBEDG(1<<chn);//當(dāng) kbiMod = 0,表示上升沿; 當(dāng) kbiMod = 1,表示上升沿或者高電平觸發(fā)
}
KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中斷使能:0-31位每一位代表每個(gè)引腳,0 禁止, 1 使能
break;
//(3.1)KBI1模塊
case 1:
SIM_SCGC |= SIM_SCGC_KBI1_MASK; // 使能KBI1總線時(shí)鐘
if (kbiMod == 0) //邊緣檢測
{
KBI1_SC |= 0x00;
}
else //邊緣檢測和電平控制
{
KBI1_SC |= 0x01;
}
if(EdgeSelect == 0) //觸發(fā)條件:0-31位每一位代表每個(gè)引腳
{
KBI1_ES |= KBI_ES_KBEDG(0x00); //當(dāng) kbiMod = 0,表示下降沿; 當(dāng) kbiMod = 1,表示下降沿或者低電平觸發(fā)
PORT_PUE1 |= 1<<chn; //上拉引腳
}
else
{
KBI1_ES |= KBI_ES_KBEDG(1<<chn); //當(dāng) kbiMod = 0,表示上升沿; 當(dāng) kbiMod = 1,表示上升沿或者高電平觸發(fā)
}
KBI1_PE |= KBI_PE_KBIPE(1<<chn); //中斷使能:0-31位每一位代表每個(gè)引腳,0 禁止, 1 使能
break;
}
}
None
3.2.2 KBI模塊中斷使能
void kbi_enable_irq(uint_16 kbiNo)
{
//(1)聲明局部變量
if(kbiNo == 0)
{
KBI0_SC |= KBI_SC_KBSPEN_MASK; //使能清除中斷源引腳寄存器
KBI0_SC |= KBI_SC_RSTKBSP_MASK; //中斷源引腳寄存器清0
KBI0_SC |= KBI_SC_KBIE_MASK; //使能KBI0中斷
}
else
{
KBI1_SC |= KBI_SC_KBSPEN_MASK; //使能清除中斷源引腳寄存器
KBI1_SC |= KBI_SC_RSTKBSP_MASK; //中斷源引腳寄存器清0
KBI1_SC |= KBI_SC_KBIE_MASK; //使能KBI1中斷
}
//(2)清空中斷寄存器
NVIC_ClearPendingIRQ(table_irq_kbi[kbiNo]);
//(3)使能中斷
NVIC_EnableIRQ(table_irq_kbi[kbiNo]);
}
None
3.2.3 禁用KBI引腳中斷
void kbi_disable_pin_irq(uint_16 kbiNo)
{
//(1)聲明局部變量
uint_8 module; //模塊號(hào)
uint_8 chn; //通道號(hào)
//(2)解析模塊號(hào)和通道號(hào)
kbi_mux_val(kbiNo,&module,&chn);
//(3)根據(jù)不同模塊號(hào)進(jìn)行設(shè)置
switch(module)
{
//(3.1)禁止中斷使能:0-31位每一位代表每個(gè)引腳,0 禁止, 1 使能
case 0:
KBI0_PE &= ~KBI_PE_KBIPE(1<<chn);
break;
//(3.2)禁止中斷使能:0-31位每一位代表每個(gè)引腳,0 禁止, 1 使能
case 1:
KBI1_PE &= ~KBI_PE_KBIPE(1<<chn);
break;
}
}
None
3.2.4 使能KBI引腳中斷
void kbi_enable_pin_irq(uint_16 kbiNo)
{
//(1)聲明局部變量
uint_8 module; //模塊號(hào)
uint_8 chn; //通道號(hào)
//(2)解析模塊號(hào)和通道號(hào)
kbi_mux_val(kbiNo,&module,&chn);
//(3)根據(jù)不同模塊號(hào)進(jìn)行設(shè)置
switch(module)
{
//(3.1)KBI0模塊
case 0:
KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中斷使能:0-31位每一位代表每個(gè)引腳,0 禁止, 1 使能
break;
//(3.2)KBI1模塊
case 1:
KBI1_PE |= KBI_PE_KBIPE(1<<chn);//中斷使能:0-31位每一位代表每個(gè)引腳,0 禁止, 1 使能
break;
}
}
None
四、KEA128的時(shí)鐘配置
參見NXP KEA128 DS(S9KEA128P80M48SF0.pdf ),可以知道MCU最高支持48MHz core frequency.
中文版數(shù)據(jù)手冊:
具體的時(shí)鐘定義:
后續(xù)待更:
系統(tǒng)時(shí)鐘(core clock/system clock)與總線時(shí)鐘(bus clock/flash clock),F(xiàn)TM/PWT關(guān)系
core clock = ICSOUTCLK / div1, bus clock = core clock / div2, FTM/PWT時(shí)鐘 = core clock / div3
本文采用 CC BY-NC-SA 4.0 許可協(xié)議,著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
作者:jarrod-zhou
來源:山外K60——學(xué)習(xí)筆記之二 – 科創(chuàng)與算法小屋
|
|