论坛风格切换切换到宽版
  • 382阅读
  • 6回复

跟著BD7OTO學習寶峰UV-5RH的應用部分開發3(系統時鐘和全局中斷,矩陣鍵盤) [复制链接]

上一主题 下一主题
离线bd7oto
 
发帖
30
只看楼主 倒序阅读 0楼 发表于: 04-08
第一篇文章介紹了模板工程和下載文件(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重新编辑 ]
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
高级硬件攻城狮+程序猿,擅长DSP、FPGA、ARM
微信:132,三两两八,8051
QQ:344266487
https://shop197337704.taobao.com/
用最严格的规范去创造最可靠的产品,服务社会,创造价值
离线王立
发帖
223
只看该作者 1楼 发表于: 04-08
Re:跟著BD7OTO學習寶峰UV-5RH的應用部分開發3(系統時鐘和全局中斷,矩陣 ..
    
离线爱不交租
发帖
12302
只看该作者 2楼 发表于: 04-09
Re:跟著BD7OTO學習寶峰UV-5RH的應用部分開發3(系統時鐘和全局中斷,矩陣 ..
好牛13的
我读书少  不要骗我
离线bh8ssx
发帖
96
只看该作者 3楼 发表于: 04-09
Re:跟著BD7OTO學習寶峰UV-5RH的應用部分開發3(系統時鐘和全局中斷,矩陣 ..
小调皮
离线BG5IY
发帖
41
只看该作者 4楼 发表于: 04-10
Re:跟著BD7OTO學習寶峰UV-5RH的應用部分開發3(系統時鐘和全局中斷,矩陣 ..
必须点赞!先收藏,回头玩
ZhongXu/BG5IY

欢迎加入QQ群: 870801104
业余无线电趣味园+Xiegu机友汇
离线王雷生
发帖
1066
只看该作者 5楼 发表于: 04-11
Re:跟著BD7OTO學習寶峰UV-5RH的應用部分開發3(系統時鐘和全局中斷,矩陣 ..
直接在这个基础上开发新款手持对讲机
呼号:BG6OJX
QQ:68330835
电话:19939000388
地址:河南 济源 沁园 南夫 胜利街北六巷四十六号
离线tiger-gz
发帖
10
只看该作者 6楼 发表于: 04-12
Re:跟著BD7OTO學習寶峰UV-5RH的應用部分開發3(系統時鐘和全局中斷,矩陣 ..
工作量应该不小吧,楼主加油.