大家好!在使用下面的延时函数中,使用delay_ms(1000)时候延时大约1秒钟,但使用delay_ms(2000)时发现时间变短了,这个是什么情况?延迟1ms: 复制代码 1 /******************************************************************************* 2 * 函 数 名 : delay_ms 3 * 函数功能 : 延时函数,延时ms 4 * 输 入 : i 5 * 输 出 : 无 6 *******************************************************************************/ 7 void delay_ms(u32 i) 8 { 9 u32 temp; 10 SysTick->LOAD=9000*i; //设置重装数值 72MHZ时 11 SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源 12 SysTick->VAL=0; //清零计数器 13 do 14 { 15 temp=SysTick->CTRL; //读取当前倒计数值 16 } 17 while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达 18 SysTick->CTRL=0; //关闭计数器 19 SysTick->VAL=0; //清空计数器 20 }
延迟1ms: 复制代码 1 /******************************************************************************* 2 * 函 数 名 : delay_ms 3 * 函数功能 : 延时函数,延时ms 4 * 输 入 : i 5 * 输 出 : 无 6 *******************************************************************************/ 7 void delay_ms(u32 i) 8 { 9 u32 temp; 10 SysTick->LOAD=9000*i; //设置重装数值 72MHZ时 11 SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源 12 SysTick->VAL=0; //清零计数器 13 do 14 { 15 temp=SysTick->CTRL; //读取当前倒计数值 16 } 17 while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达 18 SysTick->CTRL=0; //关闭计数器 19 SysTick->VAL=0; //清空计数器 20 }
SYSTICK 是一个24位的定时器
2^24 = 16777216
而你的SysTick->LOAD=9000*i; 2000*9000=18000000 数据已经溢出了
据我所知,是因为时间值太大了,定时器应该都已经完全溢出了。所以值最好不要太大了。
你要是想两秒最好循环两次
超出范围了,只好用两个1000代替2000ms
SysTick结构体下面的LOAD成员是一个24位的变量,这里超过24位,就相当于只装载了一个
18000000-2^24的值,时间自然变短