一、开发环境及工具
- HC32F003 / HC32F005
- Keil uVision5 V5.33 / IAR For ARM 7.80.4 (J-Link)
- 此工程源码下载路径 : https://gitee.com/amx/hc32ddl-app
二、系统时钟修改
- 时钟控制模块框图(我们使用内部高速时钟RCH)
-
将系统时钟由默认4MH改为16MHz (在system_hc32f005.c文件中)
uint32_t SystemCoreClock = 4000000; uint32_t SystemHclkClock = 0; //add clock source. void SystemCoreClockUpdate (void) // Update SystemCoreClock variable { SystemCoreClock = Sysctrl_GetHClkFreq(); SystemHclkClock = Sysctrl_GetPClkFreq(); } //系统时钟配置 void App_ClkCfg(void) { stc_sysctrl_clk_cfg_t stcCfg; ///< 因要使用的时钟源HCLK小于等于24M:此处设置FLASH 读等待周期为0 cycle(默认值也为0 cycle) Flash_WaitCycle(FlashWaitCycle0); ///< 时钟初始化前,优先设置要使用的时钟源:此处设置RCH为4MHz(默认值为4MHz) Sysctrl_SetRCHTrim(SysctrlRchFreq16MHz); ///< 选择内部RCH作为HCLK时钟源; stcCfg.enClkSrc = SysctrlClkRCH; ///< HCLK SYSCLK/2 stcCfg.enHClkDiv = SysctrlHclkDiv1; ///< PCLK 为HCLK/8 stcCfg.enPClkDiv = SysctrlPclkDiv1; ///< 系统时钟初始化 Sysctrl_ClkInit(&stcCfg); } /** ****************************************************************************** ** \brief Setup the microcontroller system. Initialize the System and update ** the SystemCoreClock variable. ** ** \param none ** \return none ******************************************************************************/ void SystemInit(void) { App_ClkCfg(); // 配置时钟 SystemCoreClockUpdate(); // 获取HCLK和PCLK }
三、基本定时器BT
-
定时器功能-16位自动重载模式(定时器为溢出中断)
uint32_t delaytick; /******************************************************************************* * BT定时功能测试 (重载模式) ******************************************************************************/ en_result_t App_BtTimerTest(void) { stc_bt_cfg_t stcCfg; en_result_t enResult = Error; uint16_t u16ArrData = 0x10000 - 10000; // 10ms中断一次 uint16_t u16InitCntData = 0x10000 - 10000; Sysctrl_SetPeripheralGate(SysctrlPeripheralBt, TRUE); stcCfg.enGateP = BtPositive; stcCfg.enGate = BtGateDisable; stcCfg.enPRS = BtPCLKDiv16; // 16分频 stcCfg.enTog = BtTogDisable; stcCfg.enCT = BtTimer; // 定时器功能 stcCfg.enMD = BtMode2; // 自动重装载16位定时器 //Bt配置初始化 if (Ok != Bt_Init(TIM0, &stcCfg)) { enResult = Error; } //INT ENABLE Bt_ClearIntFlag(TIM0); Bt_EnableIrq(TIM0); EnableNvic(TIM0_IRQn, IrqLevel3, TRUE); //设置重载值和计数值,启动计数 Bt_ARRSet(TIM0, u16ArrData); Bt_Cnt16Set(TIM0, u16InitCntData); Bt_Run(TIM0); return enResult; } /******************************************************************************* * TIM0中断服务函数 ******************************************************************************/ void Tim0_IRQHandler(void) { if (TRUE == Bt_GetIntFlag(TIM0)) { Bt_ClearIntFlag(TIM0); delaytick++; } }
-
主函数调用
int32_t main(void) { SystemInit(); App_BtTimerTest(); while (1) { } }
四、仿真测试
-
主频16Mhz,定时10ms中断一次,连接J-Link仿真运行查看定时器中断delaytick值变化:
MDK中:
IAR中(窗口约1秒钟刷新一次):