第一篇文章介紹了模板工程和下載文件(BF文件)的生成方法,
地址:
https://www.hellocq.net/forum/read.php?tid=376181第二篇文章介紹了部分外設所對應的IO口,
地址:
https://www.hellocq.net/forum/read.php?tid=376232這篇文章講解系統時鐘、全局中斷、以及矩陣鍵盤的處理方法。
———————————————分割綫———————————————
通過查看拆機圖,UV5RH所使用的外部晶體為16M,建議運行主頻72M(方便程序移植)
(注意,右邊CPU下方即16M晶體)
這裏需要修改 at32f421_conf.h 中 HEXT_VALUE 即可。
#define HEXT_VALUE ((uint32_t)16000000)
系統時鐘周波數 = 外部晶體周波數 / 2 * 倍頻係數,儅要設置的系統時鐘周波數為72M時,倍頻係數為 CRM_PLL_MULT_9
系統時鐘初始化函數如下:
void system_clock_config(void){ /* config flash psr register */ flash_psr_set(FLASH_WAIT_CYCLE_3);
/* reset crm */ crm_reset();
crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);
/* wait till hext is ready */ while(crm_hext_stable_wait() == ERROR) { }
/* config pll clock resource */ crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_9); //最關鍵的一行
/* enable pll */ crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
/* wait till pll is ready */ while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET) { }
/* config ahbclk */ crm_ahb_div_set(CRM_AHB_DIV_1);
/* config apb2clk, the maximum frequency of APB1/APB2 clock is 120 MHz */ crm_apb2_div_set(CRM_APB2_DIV_1);
/* config apb1clk, the maximum frequency of APB1/APB2 clock is 120 MHz */ crm_apb1_div_set(CRM_APB1_DIV_1);
/* enable auto step mode */ crm_auto_step_mode_enable(TRUE);
/* select pll as system clock source */ crm_sysclk_switch(CRM_SCLK_PLL);
/* wait till pll is used as system clock source */ while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL) { }
/* disable auto step mode */ crm_auto_step_mode_enable(FALSE);
/* update system_core_clock global variable */ system_core_clock_update();}———————————————分割綫———————————————
在第一篇文章(
https://www.hellocq.net/forum/read.php?tid=376181)中介紹過,
寶峰UV-5RH的MCU已含有Bootloader,Bootloader的範圍是0x8000000-0x8001000(即4K),
所以應用程序部分需要修改Flash起始地址(0x8001000),
還有中斷向量的便宜地址(#define VECT_TAB_OFFSET 0x1000),否則中斷進不去。
經過分析,Bootloader跳轉到APP時候,已經關閉了所有的中斷,進入APP后,各種中斷進不去,於是,問題產生。
解決方法:
//关闭所有中断(但是不包括fault和NMI中断)__asm void INTX_DISABLE(void){ CPSID I BX LR }
//开启所有中断__asm void INTX_ENABLE(void){ CPSIE I BX LR }這樣在APP中,在進入主循環while(1)之前 開啓所有中斷即可。
———————————————分割綫———————————————
由於Bootloader中已經初始化了串行口等外設,自己在APP中初始化的串口參數如果與之不一致的話,容易出現各種稀奇古怪的問題(例如中斷進不去)等等。
這裏在初始化串行口之前,推薦大家做個逆初始化操作,清除之前的配置參數。
usart_reset(USART1);
———————————————分割綫———————————————
初始化定時器1作爲主作業任務定時器。
儅系統始終為72M時,分頻係數72,即1M。此時儅計數達到1000時,是1ms。
init.period = 999;
init.division = 72;
定時器1中斷服務函數為 TMR1_BRK_OVF_TRG_HALL_IRQHandler,這這裏可以執行一個任務操作(例如矩陣鍵盤掃描和鍵值處理)等等。
———————————————分割綫———————————————
關於矩陣鍵盤鍵值處理。
矩陣鍵盤掃描在定時器1中斷服務函數中執行,即每1ms掃描一條絎綫。
初始化一個數組作爲FIFO,每隔1ms向FIFO中添加鍵值。
如果鍵值一直是同一個(例如數字7),那就是數字7按下了。
如果鍵值一直在同一列輪轉(例如AB鍵、上、數字1、數字4、數字7),那麽就是行綫接地的(A/B鍵)按下了。
———————————————分割綫———————————————
未完待續。
謝謝大家閲讀,這裏是BD7OTO
2024.04.06在澳門氹仔。
[ 此帖被bd7oto在2024-04-08 11:57重新编辑 ]