【问题标题】:Delay in HAL Library (HAL_Delay())HAL 库中的延迟 (HAL_Delay())
【发布时间】:2018-02-14 04:07:10
【问题描述】:

我正在尝试让我的 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);
}

【问题讨论】:

    标签: arm keil stm32f4discovery hal


    【解决方案1】:

    函数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()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多