OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2924|回复: 4

实验16 待机唤醒实验----delay_ms 函数延时异常

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-30
在线时间
11 小时
发表于 2016-4-27 14:35:26 | 显示全部楼层 |阅读模式
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秒就可以完成侦测。

我想这部分代码,应该是已经验证过的吧?但是我实验时会遇到这样的问题?哪位大神可以帮忙分析解答下?非常感谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-4-27 14:59:47 | 显示全部楼层
循环的其他语句也需要时间
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-8-17
在线时间
16 小时
发表于 2016-4-30 11:53:38 | 显示全部楼层
新手,遇到同样的问题,对这个延时函数不会用。
回复

使用道具 举报

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-12-3
在线时间
83 小时
发表于 2016-4-30 13:40:18 | 显示全部楼层
晶振没起震吧  
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-1 10:43:44 | 显示全部楼层
编写代码,检查延时函数的准确性。 估计就是时钟配置有问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 19:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表