OpenEdv-开源电子网

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

delay_ms() 这个函数不知是被哪条语句干扰,走时明显过快。(开发板型号:stm32f103rbt6)

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2015-7-25
在线时间
1 小时
发表于 2015-8-8 20:01:45 | 显示全部楼层 |阅读模式
5金钱
我最近在做一个读取AM2302传感器的实验,在调试的时候发现delay_ms()函数延迟的时间与正常值相差很大(快了很多)。
经过精简代码精确地描述问题,我把与传感器相关的代码全部注释,但此延时函数依然过快。
为了描述问题,我使用了跑马灯实验的部分代码用来调试。代码如下:
[mw_shl_code=c,true]int main(void) { u8 Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00}; //???????÷?????????? Stm32_Clock_Init(9);//?????±???è?? delay_init(72); //???±?????? uart_init(72,9600); //?®??1?????? LED_Init(); while(1) { // delay_ms(2000); // printf("1"); LED0=0; LED1=1; delay_ms(1000); LED0=1; LED1=0; delay_ms(1000); // Clear_Data(Sensor_Data,5); // RCC->APB2ENR|=1<<2; //????PORTA???±?? // Read_Sensor(Sensor_Data,5);//?????????÷???? // LCDSend_NByte(Sensor_Data,5);//?¨??LCD???????? } }[/mw_shl_code]
在跑马灯实验中,此delay_ms()函数走时是准确的,但把跑马灯的部分代码注释掉,使用串口及printf()函数调试,此delay_ms()函数走时出现很大偏差,明显过快,在串口调试助手中1出现的频率大约是0.5秒每次。代码如下:
[mw_shl_code=c,true]int main(void) { u8 Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00}; //???????÷?????????? Stm32_Clock_Init(9);//?????±???è?? delay_init(72); //???±?????? uart_init(72,9600); //?®??1?????? LED_Init(); while(1) { delay_ms(2000); printf("1"); // LED0=0; // LED1=1; // delay_ms(1000); // LED0=1; // LED1=0; // delay_ms(1000); // Clear_Data(Sensor_Data,5); // RCC->APB2ENR|=1<<2; //????PORTA???±?? // Read_Sensor(Sensor_Data,5);//?????????÷???? // LCDSend_NByte(Sensor_Data,5);//?¨??LCD???????? } }[/mw_shl_code]
本人初学嵌入式,对此问题不了解,希望懂的人指教。谢谢。


======================================2015.8.9更新==================================================
经过进一步排查,我发现延时1s即改为delay_ms(1000)时走时是准确的,一次性延时2s及以上就会出现走时不准的情况。开始我怀疑是参数越界,经查看发现参数类型是u16也就是上限是65535并未出现越界。到现在为止仍不知道原因,但可以通过调用多个delay_ms(1000)来延时较长时间,其他类似情况应该也可以用这个方法解决。
希望知道原因的同志能够解答一下。谢谢。

最佳答案

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

大哥好好看一下delay_ms()允许的最大延时时间是多少?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-8-8 20:01:46 | 显示全部楼层
大哥好好看一下delay_ms()允许的最大延时时间是多少?

开往春天的手扶拖拉机
回复

使用道具 举报

4

主题

67

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
212
金钱
212
注册时间
2015-8-5
在线时间
49 小时
发表于 2015-8-8 23:47:13 | 显示全部楼层
想要准确定时,用定时器来实现,自己封装一个用定时器计数值来延时的函数
开源QQ群:431600056
回复

使用道具 举报

39

主题

598

帖子

0

精华

高级会员

Rank: 4

积分
875
金钱
875
注册时间
2013-12-18
在线时间
41 小时
发表于 2015-8-9 08:43:24 | 显示全部楼层
回复【2楼】独孤帅:
---------------------------------
1楼,楼主问的不是这个意思把?本来用滴答定时器的延时就挺准的,但是楼主在某些时候,就会不准的非常严重,找不到问题,而在有些时候,确实非常准确,所以你的回答....
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2015-7-25
在线时间
1 小时
 楼主| 发表于 2015-8-9 13:07:25 | 显示全部楼层
更新了,顶一下
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2015-7-25
在线时间
1 小时
 楼主| 发表于 2015-8-9 21:30:14 | 显示全部楼层
回复【5楼】zuozhongkai:
---------------------------------
多谢提醒,以前一直没注意注释,看来以后得多注意了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 23:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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