单片机学习小组
直播中

一说就是错

12年用户 532经验值
私信 关注

如何利用滴答时钟delay us?

如何利用滴答时钟delay us?

回帖(1)

黄迎春

2022-2-10 11:27:49
方法1:改变滴答时钟的计数重载值,实现。


/*******************************************************************************
** 函数名称: SysTick_Config_Test
** 功能描述:
** 参数说明: SystemCoreClocks: 当前系统运行的最大时钟,单位Hz
**                         Value:  = 1000      滴答时钟1ms中断一次
**                   = 1000000   滴答时钟1us中断一次
** 返回说明: 返回0表示成功,否则失败
** 创建人员: Sudaroot
** 创建日期: 2019-08-26
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/

uint32_t SysTick_Config_Test(uint32_t SystemCoreClocks, uint32_t Value)
{
    return SysTick_Config(SystemCoreClocks / Value);
}
测试:


int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  //STM32F429配置最大时钟180MHz, 1us延时
  SysTick_Config_Test(180000000, 1000000);

  while (1)
  {
      printf("sudrootrn");
      HAL_Delay(1000000);
  }
}
效果:





方法2:就是累计滴答时钟的节拍数,当节拍数大于等于我们所需计数即完成;
SysTick reload value register (STK_LOAD)  : 滴答时钟重载值(取值范围:0x00000001-0x00FFFFFF)
例如,如果每100个时钟脉冲需要SysTick中断,则置位重新载入99。

SysTick current value register (STK_VAL) :SysTick计数器的当前值。

还需注意滴答时钟是向下递减的。






#define     SYS_CORE_CLOCK_MHZ       180     //当前系统运行的最大时钟,单位MHz
void delay_us(uint32_t us)
{               
    uint32_t ticks = us * SYS_CORE_CLOCK_MHZ;
    uint32_t tickcount = 0, tnow = 0, told = SysTick->VAL;
   
    do{
       tnow = SysTick->VAL;        //获取当前值。
       tickcount += (told > tnow ? (told - tnow) : (SysTick->LOAD + told - tnow));
       told = tnow;
    }while(tickcount < ticks);
}
测试:


int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  while (1)
  {
      printf("sudrootrn");
      delay_us(1000000);
  }
}
效果:






  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分