牛卧堂MCU技术交流
标题:
M451计时器的时延函数TIMER
[打印本页]
作者:
匿名
时间:
2022-6-22 14:23
标题:
M451计时器的时延函数TIMER
void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec) //TIMER0,100
{
uint32_t u32Clk = TIMER_GetModuleClock(timer); //#define TIMER0 ((TIMER_T *) TMR01_BASE)
uint32_t u32Prescale = 0UL, u32Delay = (SystemCoreClock / u32Clk) + 1UL;//SystemCoreClock为系统时钟源为HXT,频率12MHz; u32Delay = (12/12)+1=2
uint32_t u32Cmpr, u32NsecPerTick;
/* Clear current timer configuration */
timer->CTL = 0UL;
timer->EXTCTL = 0UL;
if(u32Clk <= 1000000UL) /* min delay is 1000 us if timer clock source is <= 1 MHz */
{
if(u32Usec < 1000UL)
{
u32Usec = 1000UL;
}
if(u32Usec > 1000000UL)
{
u32Usec = 1000000UL;
}
}
else
{
if(u32Usec < 100UL)
{
u32Usec = 100UL;
}
if(u32Usec > 1000000UL)
{
u32Usec = 1000000UL;
}
}
if(u32Clk <= 1000000UL)
{
u32Prescale = 0UL;
u32NsecPerTick = 1000000000UL / u32Clk; //若u32Clk为12M,则1*10^9/12*10^6
u32Cmpr = (u32Usec * 1000UL) / u32NsecPerTick; //x*1000/83
}
//u32Usec*u32Clk*10^(-6)
else
{
u32Cmpr = u32Usec * (u32Clk / 1000000UL);
u32Prescale = (u32Cmpr >> 24); /* for 24 bits CMPDAT */
if (u32Prescale > 0UL) //若u32Cmpr大于16777216则大于0;即u32Clk大于16.7MHz
u32Cmpr = u32Cmpr / (u32Prescale + 1UL); //除以2
}
timer->CMP = u32Cmpr;//若为12MHz,则每次计数时间为1/12us
timer->CTL = TIMER_CTL_CNTEN_Msk | TIMER_ONESHOT_MODE | u32Prescale;
其中u32Usec为输入的时延参数,单位us;u32Clk为时钟频率,单位Hz
函数限制时延必须在100us到1秒之间;频率小的话限制更强
在官方BSP里边的时延函数void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec)里面为什么要通过
时钟频率来限制可用时延长短?我测试了在范围外,如10us,结果是真实显示时延有误差。
新手入坑,有没有大佬懂的,请指教。
作者:
admin
时间:
2022-6-23 11:41
限制延时时间是为了保证延时的精度。代码执行本身也是要花时间的,如果定时时间短,代码执行的时间就会显得误差比较大
作者:
xxxaxx
时间:
2022-6-27 17:21
admin 发表于 2022-6-23 11:41
限制延时时间是为了保证延时的精度。代码执行本身也是要花时间的,如果定时时间短,代码执行的时间就会显得 ...
应该是这样的。懂了
欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/)
Powered by Discuz! X3.2