初学STM32,对微秒延时函数的理解

     有很多方法可以实现微秒延时,我也仅仅刚学一个月,分享一下自己的理解,这里是大神的方法:

原文链接:https://blog.csdn.net/Firefly_cjd/article/details/106709259

    我们来看看下面这个方法:

void delay_us(uint32_t nus)
{
  uint32_t temp;
  SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000000/8*nus;
  SysTick->VAL=0X00;//清空计数器
  SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
  do
  {
    temp=SysTick->CTRL;//读取当前倒计数值
  }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
  SysTick->CTRL=0x00; //关闭计数器
  SysTick->VAL =0X00; //清空计数器
}

比较大神的代码,我这里采用HAL库来实现,没有找到这段内容:RCC_Clocks.HCLK_Frequency,

这代表HCLK的时钟频率,SysTick 8分频,所以后面除以8;

我用的是STM32cubeMX直接生成初始化代码,在这里直接用  HAL_RCC_GetHCLKFreq(void)来代替RCC_Clocks.HCLK_Frequency;

把得到的值赋给重装载值寄存器。

函数在HAL库文件stm32g4xx_hal_rcc.c(我这里用的是G4的芯片)

/**
  * @brief  Return the HCLK frequency.
  * @note   Each time HCLK changes, this function must be called to update the
  *         right HCLK value. Otherwise, any configuration based on this function will be incorrect.
  *
  * @note   The SystemCoreClock CMSIS variable is used to store System Clock Frequency.
  * @retval HCLK frequency in Hz
  */
uint32_t HAL_RCC_GetHCLKFreq(void)
{
  return SystemCoreClock;
}

 下面就是操控相应的寄存器,我们重点说控制寄存器:                                                                                 

首先是清空寄存器,定时器使能

 SysTick->CTRL=0X01:这里就第0位置位,使能了定时器。

接下来在 do  while()循环中不断读取CTRL寄存器,当前值寄存器(VAL)从设定的重装载值递减到0后,CTRL寄存器的第16位置位,(!(temp&(1<<16))表达式为假,此时就会跳出循环,延时结束,清空计数器,关闭定时器。

下面我们验算一下: 

假设我们 HCLK 频率 为 16 MHz 并且 8分频,nus为延时微秒

首先算出自动重装载值:  16000000/  8  /1000000 *nus ==2*nus;

                    SysTick->LOAD = HAL_RCC_GetHCLKFreq()/1000000/8*nus;

清空计数值,使能定时器:

                 SysTick->VAL=0X00;//清空计数器
                 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源

进入循环: 因为SysTick时钟频率为16000000/8 =2000000;他的计数器递减周期为   1/2000000

  ,所以从自动重装载值递减到0 用时:2*nus;*1/2000000 (s)=nus (us),递减到0后跳出循环,延时完成。

                

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值