延时方式主要有俩种,他们各有自己的优缺点
- [软件延时 ]
- [ 系统定时器延时]
List item
1软件延时
.所谓的软件延时就是利用cpu来处理 使cpu不能去处理别的命令这也是他的一个缺点还有他的延时很难精准
.优点是不占用硬件资源
for(int Delay_s)
{
int i = 0;
for(i = 0; i < Delay_s; i++)
{
for(int j = 0; i < 100; j++ );
}
}
利用for的嵌套来实现延时比较考虑cpu的运算速度(建议不使用)延时比较难以精准控制
2系统定时延时
他是利用的系统定时器中断来触发他不占用大量的cpu资源占用的是硬件资源延时页比较准确(利用晶振来计算时间,并触发中断)
/************定时器延时********************************
***直接使用芯片的告诉时钟(HSE =72 000 000)来定时
***SysTick_Config函数来设置定时
***如果设置为72则72/72 000 000 = 0.000 001s = 1us
***如果设置为72 000 则72 000 / 72 000 000 = 0.001s = 1ms
***如果设置为72 000 000 则 72 000 000 / 72 000 000 = 1s
*********************************************************/
void delay_us(int delay_us)
{
SysTick_Config(72);
for(int i = 0 ; i < us ;i++
{
while(!((SysTick->CTRL)&(1<<16))); //定时器检查第16位是否至1 如果为1说明时间到了退出循环
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//关闭定时器
}
void delay_ms(unsigned int ms)
{
SysTick_Config(72000);
for(int i = 0 ; i < ms ;i++)
{
while(!((SysTick->CTRL)&(1<<16))); //定时器检查第16位是否至1 如果为1说明时间到了退出循环
}
SysTick->CTRL =0x00;
}
void delay_s(unsigned int s)
{
SysTick_Config(72000);
for(int i = 0 ; i < s*1000 ;i++) //延时s时int的最大比72000000小所以在for中乘1000效果时一样的
{
while(!((SysTick->CTRL)&(1<<16))); //定时器检查第16位是否至1 如果为1说明时间到了退出循环
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
建议使用系统定时器的方法来延时可以有效的控制延时时间的长短