OpenEdv-开源电子网

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

战舰板蜂鸣器实验延时异常

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2025-7-24
在线时间
2 小时
发表于 2025-7-28 20:04:48 | 显示全部楼层 |阅读模式
1金钱
大佬们,最近在学正点原子的课程时,发现一个问题,我在驱动蜂鸣器响的时候,如果让它响1s,他可以正常的只响1s,但是如果是2s的话,就会很短促的响一声,同时这个2s的延时很快就结束了,根本没有起到2s延时的效果,如果设置为3s,延时也达不到3s的效果,也是在延时1s后结束,这是为什么呢,实验视频如附件,希望有大佬可以帮忙解惑,谢谢while(1)
{
BEEP =0;
LED0 = 1;
delay_ms(1000);
LED0 = 0;
BEEP = 1;
delay_ms(1000);
LED0 = 1;
BEEP = 0;
delay_ms(1000);
LED0 = 0;
BEEP = 1;
delay_ms(2000);
LED0 = 1;
BEEP = 0;
delay_ms(1000);
LED0 = 0;
BEEP = 1;
delay_ms(3000);
LED0 = 1;
BEEP = 0;
delay_ms(1000);
}



蜂鸣器.zip

787.88 KB, 下载次数: 0

最佳答案

查看完整内容[请看2#楼]

//SysTick->LOAD为24位寄存器,所以,最大延时为: //nmsLOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1VAL =0X00; //清空计数器 }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

327

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2033
金钱
2033
注册时间
2018-11-28
在线时间
252 小时
发表于 2025-7-28 20:04:49 | 显示全部楼层
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit)
        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;                                               //清空计数器                      
}
回复

使用道具 举报

4

主题

916

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4596
金钱
4596
注册时间
2019-9-4
在线时间
924 小时
发表于 2025-7-29 10:57:28 | 显示全部楼层
delay_ms延时函数有上限,不能延时太长。我记得注释上有写,你看一下delay_ms函数的注释。这是因为delay_ms函数是使用滴答定时器实现的,滴答定时器延时的长度受限于计数寄存器,应该是24位,然后再根据计数周期,就可以算出最长可以延时多长了
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2025-7-24
在线时间
2 小时
 楼主| 发表于 2025-7-29 20:41:02 | 显示全部楼层
A571157242 发表于 2025-7-29 10:57
delay_ms延时函数有上限,不能延时太长。我记得注释上有写,你看一下delay_ms函数的注释。这是因为delay_ms ...

那为什么只有在延时2s的时候,这个延时时间就非常短,感觉不足0.5s,延时2s以上就可以达到1s的效果呢
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2020-2-8
在线时间
17 小时
发表于 2025-7-29 21:19:27 | 显示全部楼层
codemaker 发表于 2025-7-29 20:41
那为什么只有在延时2s的时候,这个延时时间就非常短,感觉不足0.5s,延时2s以上就可以达到1s的效果呢

你自己拿带的demo测试一下不就行了
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2019-4-27
在线时间
12 小时
发表于 2025-7-30 10:31:45 | 显示全部楼层
codemaker 发表于 2025-7-29 20:41
那为什么只有在延时2s的时候,这个延时时间就非常短,感觉不足0.5s,延时2s以上就可以达到1s的效果呢

你应该明白,,对于一个8位的寄存器 你向它写入1和 写入 257 其实都是 1 .。。那么类比一下?
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2025-7-24
在线时间
2 小时
 楼主| 发表于 2025-7-30 20:06:11 | 显示全部楼层
cofmilk 发表于 2025-7-30 10:31
你应该明白,,对于一个8位的寄存器 你向它写入1和 写入 257 其实都是 1 .。。那么类比一下?

感谢大佬解惑
回复

使用道具 举报

5

主题

327

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2033
金钱
2033
注册时间
2018-11-28
在线时间
252 小时
发表于 2025-7-31 11:55:18 | 显示全部楼层
超出范围,会出问题的,如果要延更长时间可以这样写:
LED0 = 1;
BEEP = 0;
delay_ms(1000);
delay_ms(1000);
LED0 = 0;
BEEP = 1;
delay_ms(1000);
delay_ms(1000);

当然也可以用定时器

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-14 15:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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