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条回答
12345
1楼-- · 2019-07-21 04:29
回复【7楼】正点原子:
---------------------------------
我也是用IAR编译器,我再找找原因吧~~~
NE558
2楼-- · 2019-07-21 06:20
 精彩回答 2  元偷偷看……
网络孤客
3楼-- · 2019-07-21 08:41
回复【9楼】NE558:
---------------------------------
看这贴:
http://www.openedv.com/posts/list/17347.htm
PYQ2015
4楼-- · 2019-07-21 11:56
我也用IAR,真心不喜欢stvd,真的好繁琐,刚建好的工程编译通过,关掉后从新打开在编译就出现一大堆错误,真是一奇葩!

一周热门 更多>