论坛元老
 
- 积分
- 4496
- 金钱
- 4496
- 注册时间
- 2018-5-11
- 在线时间
- 941 小时
|
发表于 2022-5-30 15:50:40
|
显示全部楼层
本帖最后由 warship 于 2022-5-30 16:02 编辑
一般情况下,
我是不太用定时器的,
因为定时器是一种比较宝贵的资源,
并且设置操作稍复杂。
大量的延时和计时我都是用SysTick
这个大家都是要开启的。
u8 bTickInt;
static u32 nTicks = 0; //为一个32位的静态全局变量,用于累计SysTick总次数
/* SysTick中断服务函数 */
void SysTick_Handler(void)
{
static int a = 0;
nTicks++;
if ( nTicks % 300 == 0 )
bTickInt = bTickInt | 0x10; //置位300毫秒标志位
if ( nTicks % 200 == 0 )
bTickInt = bTickInt | 0x04; //置位200毫秒标志位
if ( nTicks % 40 == 0 )
bTickInt = bTickInt | 0x08; //置位40毫秒标志位
if ( a++ > 19 ) //用变量累计是否达20ms
{
bTickInt = bTickInt | 0x02; //置位20毫秒标志位
a = 0;
}
bTickInt |= 0x01; //置位1毫秒标志位
}
在这里面你可以根据自己的延时需要,
设置多个不同的变量,相当于开了多个定时器。
比如你想延时1秒,相当于5个200毫秒(当然也可以相当于50个20ms,随便你组合)
然后增加一个变量如MyTimer1=5;
在上述函数的 置位200毫秒标志位的执行体中增加一句if(MyTimer1)MyTimer1--;
在主程序中查询,如果MyTimer1==0, 就是延时时间到了。
处理完你的IO设置,再令MyTimer1=5;又是下一个周期了。
|
|