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灯会闪烁。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
正点原子
1楼-- · 2019-07-20 03:27
我发过一个不使用定时器的STM8延时函数代码,还比较准确,你可以试试.
定时器的没去做了,本来STM8的定时器就不多,还用一个来做这个延时,就有点浪费了.
敌害
2楼-- · 2019-07-20 08:36
 精彩回答 2  元偷偷看……
cowboy
3楼-- · 2019-07-20 14:30
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-20 16:31
回复【3楼】敌害:
---------------------------------
这个不知道哦.
12345
5楼-- · 2019-07-20 19:31
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-07-21 00:21
回复【6楼】12345:
---------------------------------
我验证是可以的哦,至于你的死机,那就要找找原因了
我用的IAR编译器。

一周热门 更多>