初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2016-3-30
- 在线时间
- 11 小时
|
5金钱
大家好,今天实验待机唤醒实验,发现一个问题:使用原子的delay_ms函数延时3秒侦测按键,实际延时时间达到十几秒!MCU:STM32F103C8T6
下面是原子的原始代码:
1. delay_ms函数,使用的是SysTick。在函数内设置SysTick并等待计时结束。
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
2. 检测按键函数,按键连续按超过3秒时,进入待机模式。
u8 Check_WKUP(void)
{
u8 t=0;
LED0=0;
while(1)
{
if(WKUP_KD)
{
t++;
delay_ms(30);
if(t>=100)
{
LED0=0;
return 1;
}
}else
{
LED0=1;
return 0;
}
}
}
函数中是每次延时30ms,然后侦测100次按键电平来实现3秒的判断。但是实际测试发现,实际要完成这100次,每次30ms的判断,整个判断时间达到十几秒才完成!!??
我将红色部分更改成:
Delay_ms(1000);
if(t>=3)
这样实际的时间倒是和3秒差不多。
另外一种改法,就是更改delay_ms为:
void delay_ms(__IO uint32_t nCount)
{
TimingDelay = nCount;
while(TimingDelay > 0)
{
}
}
void SysTick_Handler(void)
{
if (TimingDelay > 0)
TimingDelay--;
}
这样也是OK的。3秒就可以完成侦测。
我想这部分代码,应该是已经验证过的吧?但是我实验时会遇到这样的问题?哪位大神可以帮忙分析解答下?非常感谢!
|
|