STM32F6xx外设驱动2-delay(寄存器)nulceo144

[复制链接]
994|2
 楼主| 一路向北lm 发表于 2022-11-12 12:14 | 显示全部楼层 |阅读模式
源文件
  1. #include "bsp_phy.h"

  2. static uint32_t fac_us = 0; // us延时倍乘数

  3. /**
  4. * [url=home.php?mod=space&uid=247401]@brief[/url] 初始化延迟函数
  5. *                                 当使用ucos的时候,此函数会初始化ucos的时钟节拍
  6. *                                 SYSTICK的时钟固定为AHB时钟的1/8
  7. * @param SYSCLK 系统时钟频率
  8. */
  9. void DelayPhyConfig()
  10. {
  11.         HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); //SysTick频率为HCLK
  12.         fac_us = 216;                                                                                                                                                 //不论是否使用OS,fac_us都需要使用
  13. }

  14. /**
  15. * @brief 延时nus
  16. *
  17. * @param nus 要延时的us数.值不要大于1000us
  18. */
  19. void DelayPhyUs(uint32_t nus)
  20. {
  21.         uint32_t ticks;
  22.         uint32_t told, tnow, tcnt = 0;
  23.         uint32_t reload = SysTick->LOAD; //LOAD的值
  24.         ticks = nus * fac_us;                                //需要的节拍数
  25.         told = SysTick->VAL;                                //刚进入时的计数器值
  26.         while (1)
  27.         {
  28.                 tnow = SysTick->VAL;
  29.                 if (tnow != told)
  30.                 {
  31.                         if (tnow < told)
  32.                                 tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
  33.                         else
  34.                                 tcnt += reload - tnow + told;
  35.                         told = tnow;
  36.                         if (tcnt >= ticks)
  37.                                 break; //时间超过/等于要延迟的时间,则退出.
  38.                 }
  39.         };
  40. }

  41. /**
  42. * @brief 延时nms
  43. *
  44. * @param nms 要延时的ms数
  45. */
  46. void DelayPhyMs(uint16_t nms)
  47. {
  48.         uint32_t i;
  49.         for (i = 0; i < nms; i++)
  50.                 DelayPhyUs(1000);
  51. }


头文件
  1. /*****************************delay************************************/

  2. void DelayPhyConfig(void);
  3. void DelayPhyUs(uint32_t nus);
  4. void DelayPhyMs(uint16_t nms);
  5. /**********************************************************************/


ayb_ice 发表于 2022-11-14 08:53 | 显示全部楼层
让TICK定时器完全自由运行,两次相减(因是向下定时器,用前一次减后一次读到的值),保留24位值,直接判断结果即可
XIVN1987 发表于 2022-11-14 09:36 | 显示全部楼层

STM32有F6系列吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

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