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