我最近在做一个读取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)来延时较长时间,其他类似情况应该也可以用这个方法解决。
希望知道原因的同志能够解答一下。谢谢。 |