[应用相关] STM32中3个延时函数

[复制链接]
518|4
 楼主| 而服务器人 发表于 2022-7-27 23:56 | 显示全部楼层 |阅读模式
第一个延时函数
  1. void delay(u16 num)
  2. {
  3.   u16 i,j;
  4.   for(i=0;i<num;i++)
  5.     for(j=0;j<0x800;j++);
  6. }
  7. eg:delay(50);


 楼主| 而服务器人 发表于 2022-7-27 23:58 | 显示全部楼层
第二个延时函数:
  1. void Delayms(u16 ms)
  2. {
  3.   u16 i,j;
  4.   u8 k;
  5.   for(i=0;i<ms;i++)
  6.     for(j=0;j<0x0500;j++) k++;
  7. }

 楼主| 而服务器人 发表于 2022-7-28 22:55 | 显示全部楼层
第三个延时函数:
 楼主| 而服务器人 发表于 2022-7-28 23:06 | 显示全部楼层
  1. static u8  fac_us=0;//us延时倍乘数
  2. static u16 fac_ms=0;//ms延时倍乘数
  3. //初始化延迟函数
  4. //SYSTICK的时钟固定为HCLK时钟的1/8
  5. //SYSCLK:系统时钟
  6. void delay_init(u8 SYSCLK)
  7. {
  8.         SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8
  9.         fac_us=SYSCLK/8;                    
  10.         fac_ms=(u16)fac_us*1000;
  11. }                                                                    
  12. //延时nms
  13. //注意nms的范围
  14. //SysTick->LOAD为24位寄存器,所以,最大延时为:
  15. //nms<=0xffffff*8*1000/SYSCLK
  16. //SYSCLK单位为Hz,nms单位为ms
  17. //对72M条件下,nms<=1864
  18. void delay_ms(u16 nms)
  19. {                                     
  20.         u32 temp;                  
  21.         SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
  22.         SysTick->VAL =0x00;           //清空计数器
  23.         SysTick->CTRL=0x01 ;          //开始倒数  
  24.         do
  25.         {
  26.                 temp=SysTick->CTRL;
  27.         }
  28.         while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
  29.         SysTick->CTRL=0x00;       //关闭计数器
  30.         SysTick->VAL =0X00;       //清空计数器                      
  31. }   
  32. //延时nus
  33. //nus为要延时的us数.                                                                                      
  34. void delay_us(u32 nus)
  35. {               
  36.         u32 temp;                     
  37.         SysTick->LOAD=nus*fac_us; //时间加载                           
  38.         SysTick->VAL=0x00;        //清空计数器
  39.         SysTick->CTRL=0x01 ;      //开始倒数          
  40.         do
  41.         {
  42.                 temp=SysTick->CTRL;
  43.         }
  44.         while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
  45.         SysTick->CTRL=0x00;       //关闭计数器
  46.         SysTick->VAL =0X00;       //清空计数器         
  47. }
稳稳の幸福 发表于 2022-7-29 11:18 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

471

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部