完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
M261的定时器,偏差很大,600秒差不多10秒的误差,咋办?
用了tiMER0作为定时器,采用内部高速时钟作为时钟源,系统时钟设置为4MHz. void TMR0_IRQHandler(void) { TMR0_COUNT++; TIMER_ClearIntFlag(TIMER0); } void TIMER0_INIT(void) { /* setting take effect */ TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1); CLK_SysTickDelay(50); /* Enable timer wake up system */ TIMER_EnableWakeup(TIMER0); CLK_SysTickDelay(50); /* Enable Timer0 interrupt */ TIMER_EnableInt(TIMER0); CLK_SysTickDelay(50); NVIC_EnableIRQ(TMR0_IRQn); /* Start Timer0 counting */ TIMER_Start(TIMER0); CLK_SysTickDelay(50); } |
|
相关推荐
1个回答
|
|
nbsp; TIMER_SET_PRESCALE_VALUE(TIMER0, 23); //设置预分频器,将时钟源分频为24 TIMER_SET_CMP_VALUE(TIMER0, 62500); //设置比较器值,产生1秒定时器 NVIC_EnableIRQ(TMR0_IRQn); TIMER_EnableInt(TIMER0); TIMER_Start(TIMER0);} int main(){ /* setting UART0_CLK clock source and UART0 clock divider */ CLK_EnableModuleClock(UART0_MODULE); CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0_S_HIRC, CLK_CLKDIV_UART(1)); UART_Open(UART0, 115200); TIMER0_INIT(); while(1){ printf("TMR0_COUNT = %dn", TMR0_COUNT); CLK_SysTickDelay(1000); //打印一次后延时1秒 } return 0;}
你可以通过两个途径来消除误差: 1. 误差来自定时器的时钟源精度,使用外部时钟源代替内部高速时钟,可以提高定时器准确性。若使用外部时钟源后依然存在误差,那么使用精度更高的时钟源可能能降低误差。 2. 误差来自预分频器的设置。在设置预分频器时,频率必须精确地被分频。预分频器分频越大,频率的错误率越高。您可以通过尝试不同的预分频器值,以获得最小误差,例如以2或3的倍数进行预分频会更好。 |
|
|
|
只有小组成员才能发言,加入小组>>
829 浏览 0 评论
1167 浏览 1 评论
2546 浏览 5 评论
2873 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2734 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1142浏览 3评论
203浏览 2评论
470浏览 2评论
384浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
465浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-3 02:09 , Processed in 0.953794 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号