定时器是我们日常应用中必不可少的一部分,定时器的功能也多种多样,小到定时计数,大到捕获比较。今天来说说最基本的定时方法,常见的有两种,“死等”和“时间片”。今天讲的是“死等”延时,也就是说在延时的这段时间里,我什么都不干,就在那里计数,这种方法比较多的应用于一些日常调试和测试中。 下面以APM32F103XB为例,分十步对该过程进行分析。 //1.开启时钟 RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR2); //2.定义结构体名称 TMR_BaseConfig_T TMR_BaseConfigDiedelay; //3.配置结构体变量 TMR_BaseConfigDiedelay.clockDivision = TMR_CLOCK_DIV_1; TMR_BaseConfigDiedelay.countMode = TMR_COUNTER_MODE_UP; TMR_BaseConfigDiedelay.division = 7200 - 1; TMR_BaseConfigDiedelay.period = 10 * nms; TMR_ConfigTimeBase(TMR2, &TMR_BaseConfigDiedelay); //4.使能自动装载与预装载寄存器的允许位 TMR_EnableAutoReload(TMR2); //5.设置更新请求源只在计数器上溢或下溢时产生中断 TMR_ConfigUpdateRequest(TMR2,TMR_UPDATE_SOURCE_GLOBAL); //6.先清除一次标志位 TMR_ClearStatusFlag(TMR2,TMR_FLAG_UPDATE); //7.使能计数器 TMR_Enable(TMR2); //8.等待标志位置起 while(TMR_ReadStatusFlag(TMR2,TMR_FLAG_UPDATE)!= 1); //9.将计数器关闭 TMR_Disable(TMR2); //10.清除标志位,清除计数 TMR_ClearStatusFlag(TMR2,TMR_FLAG_UPDATE); TMR2->CNT = 0; 注:在使用这种方法时,要考虑好输入的值是否会超出重装载值的量程,可以根据自己的需求对预分频值和重装载值进行修改,否则,超出量程的话可能会导致计数不准(曾经在这里卡过很久)。每次使用时只要直接调用函数,并传入自己想要计数的时间即可实现。
|