设置定时器为定时模式时,要按照以下步骤操作:
(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口的输出信号:

精度比较高了。
我要赚赏金
