stm32f1的延时

延时方式主要有俩种,他们各有自己的优缺点

  1. [软件延时 ]
  2. [ 系统定时器延时]
    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;
 } 

建议使用系统定时器的方法来延时可以有效的控制延时时间的长短

发布了6 篇原创文章 · 获赞 1 · 访问量 511

猜你喜欢

转载自blog.csdn.net/flq1997/article/details/97053234