tim1定时器延时函数,请教延时误差多少?

2019-07-19 21:29发布

[mw_shl_code=c,true]#include"stm8s103k3.h" void TIM1_Init(unsigned int us); void TIM1_over_test(void); void t1_delay_us(unsigned int t_us); _Bool LED1 @PC_ODR:2; unsigned char t_over; void GPIO_Init(void)//初始化GPIO { PC_DDR = 0x04; PC_CR1 = 0x04; PC_CR2 = 0x00; } main() { GPIO_Init(); while(1) { LED1=1; t1_delay_us(40000); LED1=0; t1_delay_us(4000); } } void TIM1_Init(unsigned int us)//延时函数,延时时间=单位时间*初值us { TIM1_PSCRH = 0; TIM1_PSCRL = 19;//时钟分频,每个单位为10us TIM1_ARRH=(unsigned char)(us>>8);//自动重装载 TIM1_ARRL=(unsigned char)us; TIM1_IER=0X00; TIM1_CNTRH=(unsigned char)(us>>8);//赋予初值 TIM1_CNTRL=(unsigned char)us; TIM1_CR1 |=0x01;//开计数器 } void TIM1_over_test(void)//判断是否产生更新事件 { while(t_over==1) { if((TIM1_SR1&0x01)==0x01)//如果产生更新时间,则将标志位清零,判断位清零 { TIM1_SR1&=0xfe; t_over=0; } } } void t1_delay_us(unsigned int t_us)//延时函数 { TIM1_Init(t_us);//对计数器赋初值 TIM1_SR1&=0xfe;//标志位清零,这句位置非常重要,不能修改到void TIM1_Init(unsigned int us)中,否则程序部延时[/mw_shl_code] [mw_shl_code=c,true] t_over=1; TIM1_over_test(); TIM1_CR1=0X00;//关计数器 } [/mw_shl_code] 程序思路,将定时器tim1做出一个方便使用的延时函数。在此程序中led灯会闪烁。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。