求助定时器准确延时函数t1_delay_us(unsigned t_us)函数!!!本人菜鸟,有可能程序思路出错。

2019-07-19 21:55发布

[mw_shl_code=c,true]//程序目的使用定时器进行准确延时,使LED闪烁。 流程;延时每次都会进入中断关闭计数器,在下一次进入中断时再打开计数器。通过改变计数器初值改变时间延迟。 //仿真现象;LED灯不闪烁,程序按照顺序进行,每次都会进入中断,但定时器不定时??? #include"stm8s103k3.h" _Bool LED1 @PC_ODR:2; void t1_delay_us(unsigned t_us); unsigned int n=0; void TIM1_Init(unsigned us); void GPIO_Init(void); main() { _asm("sim"); GPIO_Init();//初始化GPIO while (1) { LED1=1;//灯亮 t1_delay_us(50000);//延时 LED1=0; //灯灭 t1_delay_us(50000);//延时 } } @far @interrupt void TIM1_OVER_Int(void) { TIM1_SR1 = 0x00;//中断标志位清零 n=1;//进入中断判断位 TIM1_CR1&=0XFE;//关计算器 } void GPIO_Init(void) { PC_DDR = 0x04; PC_CR1 = 0x06; PC_CR2 = 0x02; } void TIM1_Init(unsigned us) { TIM1_PSCRH = 0; TIM1_PSCRL = 19; TIM1_ARRH=(unsigned char)(us>>8);//自动重载 TIM1_ARRL=(unsigned char)us; TIM1_IER=0X01; TIM1_CNTRH=(unsigned char)(us>>8);//赋初值 TIM1_CNTRL=(unsigned char)us; _asm("rim");//开总中断 TIM1_CR1 |=0x01;//开计数器 } void t1_delay_us(unsigned int t_us) { TIM1_Init(t_us); while(n!=1);//判断是否进入中断,如果进入n清零,方便下一一次判断。 n=0; } [/mw_shl_code]
求助定时器准确延时函数t1_delay_us(unsigned t_us)函数!!!本人菜鸟,有可能程序思路出错。如果t1_delay_us(unsigned t_us)可行,想问一下定时误差多大???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
monicacoma
1楼-- · 2019-07-20 00:55
 精彩回答 2  元偷偷看……
cowboy
2楼-- · 2019-07-20 01:35

对stm32没有了解,请求大神看看我的程序,程序设计思路是;改变定时器的初值,来改变定时时间,进入中断关闭定时器,同时标志位清零,下次定时时再给定时器赋新的初值!!!!!

一周热门 更多>