web-dev-qa-db-fra.com

Délai dans la bibliothèque HAL (HAL_Delay ())

J'essaie de faire clignoter les leds sur ma découverte stm32f4. D'une certaine manière, il est resté sur la fonction de retard. J'ai changé la priorité d'interruption SysTick à 0 et ajouté des fonctions IncTick(), GetTick(). Qu'est-ce que je rate?

#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

La fonction HAL_IncTick(); doit être appelée à partir d'une interruption SysTick_Handler, généralement implémentée dans le fichier stm32f4xx_it.c, vous n'appelez pas cette fonction à partir de votre code!

void SysTick_Handler(void)
{
    HAL_IncTick();
}

La fonction HAL_Init(); Initialise le temporisateur SysTick sur 1 ms et active l'interruption. Donc, après HAL_Init, HAL_Delay devrait fonctionner correctement.

REMARQUE: STM32HAL autorise les fonctions de substitution (voir le mot clé __weak): HAL_InitTick, HAL_IncTick, HAL_GetTick HAL_Delay. Donc, si vous souhaitez utiliser le mécanisme de retard par défaut, vous ne devez pas implémenter ces fonctions dans votre code!

3
denis krasutski