华大HC32-(02)-系统时钟和基本定时器

一、开发环境及工具

  1. HC32F003 / HC32F005
  2. Keil uVision5 V5.33 / IAR For ARM 7.80.4 (J-Link)
  3. 此工程源码下载路径 : https://gitee.com/amx/hc32ddl-app

在这里插入图片描述


二、系统时钟修改

  1. 时钟控制模块框图(我们使用内部高速时钟RCH)

在这里插入图片描述

  1. 将系统时钟由默认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

在这里插入图片描述

  1. 定时器功能-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++;
        }
    }
    
  2. 主函数调用

    int32_t main(void)
    {
    	SystemInit();
    	App_BtTimerTest();
    	
      	while (1)
    	{
    	}
    }
    

四、仿真测试

  1. 主频16Mhz,定时10ms中断一次,连接J-Link仿真运行查看定时器中断delaytick值变化:

    MDK中:

在这里插入图片描述

IAR中(窗口约1秒钟刷新一次):

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AizBot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值