web-dev-qa-db-ja.com

HALライブラリの遅延(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);
}
3
Reactionic

関数HAL_IncTick();は、通常はstm32f4xx_it.cファイルに実装されているSysTick_Handler割り込みから呼び出す必要があります。この関数をコードから呼び出さないでください。

_void SysTick_Handler(void)
{
    HAL_IncTick();
}
_

関数HAL_Init(); 1msでSysTickタイマーを初期化し、割り込みを有効にします。したがって、HAL_Initの後、HAL_Delayは正しく機能するはずです。

注:STM32HALはオーバーライド(キーワード__weakを参照)関数を許可します:HAL_InitTick、HAL_IncTick、HAL_GetTick HAL_Delay。したがって、デフォルトの遅延メカニズムを使用する場合は、これらの関数をコードに実装しないでください。

3
denis krasutski