arm - HAL 库中的延迟 (HAL_Delay())

标签 arm keil stm32f4discovery hal

我试图在我的 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()

  • 所以如果你想使用默认的延迟机制,你不应该在你的代码中实现这些功能!

    关于arm - HAL 库中的延迟 (HAL_Delay()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46062122/

    相关文章:

    c++ - 我可以在 BlackBerry 10 中使用 Xcode 编译的 armv7/armv7s .so 库吗?

    c++ - 如何通过 c_str() 库 API 使用 C++ 流。

    c - STM32 usart中断无法将正确的数据转换为其他函数

    c - 如何使用中断?

    c - 在STM32F407中断处理程序中禁用中断

    arm - Bootrom与Bootloader在ARM系统上的区别是什么

    c - 我在哪里可以了解微 Controller (例如 ARMv7)上 C 语言的最佳数学运算?

    ios - Mach-O 符号 stub (IOS)

    将指针的地址转换为 int

    stm32l476 ADC 没有准备好