Hal库delay函数的实现原理并不是很复杂,主要是通过定时器来实现的。一般来说,嵌入式系统中会有一个或多个定时器,通过配置这些定时器的时钟源和计数值,我们可以实现不同的精度和延时时间。在Hal库中,我们使用的是TIM6定时器,其时钟源为APB1总线,计数值为4-2。 在调用Hal库delay函数时,函数会首先获取当前系统的...
代码的书写过程中经常用到延时,这里主要讲述一下HAl延时,HAL库之HAL_Delay()函数在72M主频,STM32CUBEMX自动生成情况下,默认为延时1ms单位,即HAL_Delay(500)表示500ms延时,这是因为在默认状态下,SysTick()默认设置为1ms中断,下面就原理进行叙述。 Systick定时器延时原理 Systick(滴答时钟)是一个24位,向下计数的...
HAL_Delay()函数的实现原理是利用了系统滴答定时器(SysTick)来进行计时。SysTick是一个24位的计数器,其频率为内核时钟频率。在STM32系列单片机中,SysTick默认的频率为HCLK/8,即内核时钟频率除以8。 当调用HAL_Delay()函数时,该函数会获取当前SysTick计数器的值,并将其与需要延时的时间相加得到目标值。然后进入一...
while(1){HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOF,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10,GPIO_PIN_RESET);delay(1000);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOF,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10,GPIO_PIN_SET);delay(...
它通过计算机的时钟周期来实现,可以实现非常精确的延时操作。在hal库中,微秒延时函数的命名为"delay_us",通过传入一个参数来指定需要延时的微秒数。 使用hal库的微秒延时函数非常简单。首先,需要将hal库添加到项目中,并包含相应的头文件。然后,在需要进行延时操作的地方调用"delay_us"函数,并传入需要延时的微秒数...
代码实现: main.c void HAL_Delay_us(uint32_t us) { HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000); HAL_Delay(us-1); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); } 实现原理: 假设我们的时钟频率设为了180MHz HAL_RCC_GetHCLKFreq()用于获取当前系统中的计数值 HAL_SYSTICK_...
static void DelayUs (uint16_t delay) { __HAL_TIM_SET_COUNTER(&htimx, 0); while (__HAL_TIM_GET_COUNTER(&htimx) < delay); } 5、工作原理:用于毫秒级us延时的定时器在初始化代码部分启动,一旦启动就不再停止。用户需要延时时,直接调用DelayUs函数,入口参数为us。在函数内部,先把定时器的计数值...
一、实例实现 实例简介:主函数控制LED2进行闪烁,中断控制LED0开关 我们先使用CubeMX创建项目文件: 1、在System Core中配置外部时钟,这里视板子的不同而改变,我这里只有外部高速晶振,所以开启外部高速晶振。 2、配置时钟树,如图: 3、配置GPIO,原理图如下: ...
我们在上一节流水灯使用了HAL_Delay()函数,函数原型如下。 __weakvoidHAL_Delay(uint32_t Delay){uint32_t tickstart=HAL_GetTick();uint32_t wait=Delay;/* Add a freq to guarantee minimum wait */if(wait<HAL_MAX_DELAY){wait+=(uint32_t)(uwTickFreq);}while((HAL_GetTick()-tickstart)<wait...