CCWO Embedded Space

CCWOの日々の開発を発信するブログ

STM32 F401RE 遅延関数

開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本

遅延関数をシステム・タイマ System tick timerを使って実現する。
システム・タイマのコールバック関数 HAL_SYSTICK_Callback(void)に割り込み処理は定義されています。
SystemClock_Config関数内のHAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);で1msの割り込みに必要なカウント数を取得し、System tick timerのカウントクリア値に設定することで1msの割り込みが発生します。
これを利用してvoid delay_ms(int cnt)関数を作成して、LEDを500msで点滅させるプログラムがこちら。

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
volatile int msCnt = 0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
void HAL_SYSTICK_Callback(){
	if(msCnt) msCnt--;
}

void delay_ms(int cnt){
	msCnt=cnt;
	while(msCnt);
}

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
	  delay_ms(500);
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
 	  delay_ms(500);
  }
  /* USER CODE END 3 */

}

しかし、HAL LibraryではHAL_Delay(ms);がもともと宣言されているのでこちらを使うほうが簡単そう。
PC0に赤色LEDをつけて点滅している様子。
f:id:CCWO:20160915103631j:plain
f:id:CCWO:20160915103802j:plain

20160915の記事