下列哪个库函数是利用滴答定时器进行延时?A
A.HAL_Delay();
B.HAL_GetTick();
C.HAL_RCC_GetSysClockFreq();
D.HAL_Init();
答:
HAL库之HAL_Delay()函数在72M主频,STM32CUBEMX自动生成情况下,默认为延时1ms单位,即HAL_Delay(500)表示500ms延时,这是因为在默认状态下,SysTick()默认设置为1ms中断。
Systick 定时器延时原理:Systick(滴答时钟)是一个24位,向下计数的定时器,当倒计时完成后,定时器可以产生一个中断,所以,当频率一定,计数个数一定时,这个中断就会以一定的时间间隔发生,如果每个中断发送后调用的中断函数中给一个变量累加,这样我们就可以获得一个与时间相关的变量。
HAL_Delay()延时函数的使用:如果你使用STM32CubeMx来生成一个工程,那么使用Systick来延时是非常方便的,你只需要调用HAL库的一个虚函数,它的原型如下:
__weak void HAL_Delay(__IO uint32_t Delay),可以看到,HAL_Delay()是一个虚函数,这表明用户可以在其它的位置重定义,如果这样,新的函数将会取代它,编译 过程中也不会出现重定义的错误。该函数只有一个32位的参数,明显的,这个形参指定了延时的时间,它的单位是毫秒(ms)。
HAL_RCC_GetSysClockFreq(),函数原型uint32_t HAL_RCC_GetSysClockFreq (void ),返回系统时钟(SYSCLK)频率。
注意:
该函数计算系统频率并非芯片的真实系统频率。它是根据预定义值以及所选的时钟源:
若系统时钟源为HSI,函数返回值是基于HSI_VALUE(),该常数预定义在stm32f4xx_hal_conf.h文件,默认值为16MHz,但是真实参数会随着电压和温度变化。
若系统时钟源为HSE,函数返回值是基于HSE_VALUE(),该常数预定义在stm32f4xx_hal_conf.h文件,默认25MHz,用户必须保证该值与实际使用晶振频率一致,否则该函数将计算出错。
若系统时钟源为PLL,函数返回值是基于HSE_VALUE(**)或者HSI_VALUE(*)和PLL配置参数。
当HSE晶体频率不是整数值时,该函数返回值不正确。
该函数可以用于计算外设通信的脉宽或者计算其他的参数。
每当系统时钟改变时,则需要重新调用该函数更新系统时钟值。否则,基于该函数配置将会出错。