HAL 库延迟 (HAL_Delay())
Delay in HAL Library (HAL_Delay())
我正在尝试使我的 stm32f4 发现上的 LED 闪烁。它以某种方式停留在延迟功能上。我已将 SysTick 中断优先级更改为 0 并添加了 IncTick()
、GetTick()
函数。我错过了什么?
#include "stm32f4xx.h" // Device header
#include "stm32f4xx_hal.h" // Keil::Device:STM32Cube HAL:Common
int main(){
HAL_Init();
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15, GPIO_PIN_SET);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_IncTick();
HAL_GetTick();
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15, GPIO_PIN_RESET);
}
函数HAL_IncTick()
从SysTick_Handler()
中断调用,通常在stm32f4xx_it.c
中实现。您没有从您的代码中调用此函数!
void SysTick_Handler(void)
{
HAL_IncTick();
}
函数HAL_Init()
将SysTick 计时器初始化为1ms 间隔并启用关联的中断。因此,在调用 HAL_Init()
后,函数 HAL_Delay()
应该可以正常工作。
注意:STM32 HAL 允许您覆盖(参见关键字__weak
)函数:
HAL_InitTick()
HAL_IncTick()
HAL_GetTick()
HAL_Delay()
所以如果你想使用默认的延迟机制,你不应该在你的代码中实现这些功能!
我正在尝试使我的 stm32f4 发现上的 LED 闪烁。它以某种方式停留在延迟功能上。我已将 SysTick 中断优先级更改为 0 并添加了 IncTick()
、GetTick()
函数。我错过了什么?
#include "stm32f4xx.h" // Device header
#include "stm32f4xx_hal.h" // Keil::Device:STM32Cube HAL:Common
int main(){
HAL_Init();
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15, GPIO_PIN_SET);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_IncTick();
HAL_GetTick();
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15, GPIO_PIN_RESET);
}
函数HAL_IncTick()
从SysTick_Handler()
中断调用,通常在stm32f4xx_it.c
中实现。您没有从您的代码中调用此函数!
void SysTick_Handler(void)
{
HAL_IncTick();
}
函数HAL_Init()
将SysTick 计时器初始化为1ms 间隔并启用关联的中断。因此,在调用 HAL_Init()
后,函数 HAL_Delay()
应该可以正常工作。
注意:STM32 HAL 允许您覆盖(参见关键字__weak
)函数:
HAL_InitTick()
HAL_IncTick()
HAL_GetTick()
HAL_Delay()
所以如果你想使用默认的延迟机制,你不应该在你的代码中实现这些功能!