这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【CH582M】CH582M的定时器(2)定时模式

共1条 1/1 1 跳转至

【CH582M】CH582M的定时器(2)定时模式

专家
2026-09-04 12:52:06     打赏

设置定时器为定时模式时,要按照以下步骤操作:

1)置位模式设置寄存器的RB_TMR_ALL_CLEAR,使定时器的 FIFO/计数器(包括当前计数值寄存器数值清零)/中断标志清零。

2)设置寄存器 R32_TMRx_CNT_END 为要定时阈值,就是达到预定计数上限。

3)清零模式设置寄存器的RB_TMR_ALL_CLEAR位

4)清零模式设置寄存器的RB_TMR_MODE_IN 位,表示让定时器工作于定时器模式或者PWM模式。

5)如果需要中断,可设置R8_TMRx_INTER_EN 寄存器,置位 RB_TMR_IE_CYC_END ,打开定时周期中断

6)将模式设置寄存器的 RB_TMR_COUNT_EN 置位,表示开始启动定时器,开始计数

7)如果当前计数值寄存器(R32_TMRx_COUNT)的值累加到预设值(R32_TMRx_CNT_END寄存器)时,定时就完成了。此时系统自动将中断标志寄存器(R8_TMRx_INT_FLAG)的RB_TMR_IF_CYC_END位设置为1,表示定时完成。清除这个标志,是通过向改位写1完成。

测试用的关键代码如下:

// LED 接在 PB4
#define LED_PIN     GPIO_Pin_4

/*********************************************************************
 * @fn      TMR0_TimerInit
 *
 * @brief   定时功能初始化
 *
 * @param   t       - 定时时间,基于当前系统时钟Tsys, 最长定时周期 67108864
 *
 * @return  none
 */
void TMR0_TimerInit(uint32_t t)
{
    R32_TMR0_CNT_END = t;
    R8_TMR0_CTRL_MOD = RB_TMR_ALL_CLEAR;
    R8_TMR0_CTRL_MOD = RB_TMR_COUNT_EN;
}

int main()
{
    uint8_t i;
    SetSysClock(CLK_SOURCE_PLL_60MHz);
    /* 配置串口调试 */
    DebugInit();
    PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);
    
    // 配置 PB4 为输出方式
    GPIOB_SetBits(GPIO_Pin_4);
    GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);
    
    TMR0_TimerInit(FREQ_SYS / 10);       // 设置定时时间 :0.1S (时钟周期=1/60M,计数值=6M)
    TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END);   // 配置中断 : 周期结束
    PFIC_EnableIRQ(TMR0_IRQn);          // 许可中断
    while(1);
}

/*********************************************************************
 * @fn      TMR0_IRQHandler
 *
 * @brief   TMR0中断函数
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void TMR0_IRQHandler(void) // TMR0 定时中断
{
    if(TMR0_GetITFlag(TMR0_3_IT_CYC_END)) {
        // 清除中断标志
        TMR0_ClearITFlag(TMR0_3_IT_CYC_END);
        // GOPIO口翻转
        GPIOB_InverseBits(GPIO_Pin_4);
    }
}

由逻辑分析仪捕捉到的PB4口的输出信号:

image.png

精度比较高了。




关键词: CH582M     TMR     定时    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]