STM32 F401RE 遅延関数
開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
遅延関数をシステム・タイマ 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をつけて点滅している様子。
20160915の記事