STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE
SPI通信の終了時に割り込みを発生させる方法です。
非同期なのでSPI通信中はペリフェラルに仕事を任せてその間MPUは他のことができます。今回は、割り込みでSPI通信を行い、メインループではLチカを行います。
Nucleo-F446REのPin機能の割り当て
MX(Device Configuration Tool)の設定
今回はSPI2を使い、MXのデフォルトのピンアサインにしてみます。Hardware NSSは使っていませんが同じピン割り当てにしました。
Pinout
ピン割り当て
ピン名 | 機能 |
---|---|
PB10 | SPI2_SCK |
PC1 | SPI2_MOSI |
PB12 | SPI2_CS (Software) |
PA5 | LD2(LED) |
SPIの設定
Prameter Settingsで基本的なパラメータを設定します。
NVIC Settingsで割り込みベクタを設定します。
変更点
Connectivity
SPI2
Parameter Settings
Prescaler (for Bud Rate) 256
NVIC Settings
SPI2 global interrupt Enabled ✓
GPIOの設定
CS(PB12)をSoftware制御するためにGPIOを設定します。
LD2(ボード上のLED)はMXでBoardを指定して初期化すれば、自動的に設定されます。
変更点
System Core
GPIO
PB12
GPIO output level: High // CSはActive Lowのため初期値はHigh
Maximum output speed: Very High
User Label: SPI2_CS
main.cにコードを追加
初期化
/* USER CODE BEGIN PV */ uint8_t data[2] = { 0x55, 0xAA }; /* USER CODE END PV */
送信するデータを定義します。
/* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET); // CS線をLowに if (HAL_SPI_Transmit_IT(&hspi2, data, 2) != HAL_OK) { Error_Handler(); } // SPI通信が終わっていないのでここではCS線をHighにしない /* USER CODE END 2 */
割り込みを発生させるにはHAL_SPI_Transmit_IT()を使います。
メインループ
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // SPI通信と非同期にLチカ HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); HAL_Delay(100); } /* USER CODE END 3 */
メインループ内ではGPIOを100msごとにH/Lさせます。これによってSPI通信が非同期に行われていることが確認できます。
割り込み処理ルーチン
/* USER CODE BEGIN 4 */ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) { HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); // SPI通信が完了したのでCS線をHighに HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET); // 次のSPI通信のためにCS線をLowに if (HAL_SPI_Transmit_IT(&hspi2, (uint8_t*)data, 2) != HAL_OK) { Error_Handler(); } // SPI通信が終わっていのでここではCS線をHighにしない } /* USER CODE END 4 */
割り込み処理ルーチン内で再度SPI通信を開始します。繰り返しSPI通信が行われることになります。
出力信号の観測
Analog Discovery 2のScope機能でLチカの波形、Logic機能でSPI信号とLチカの様子を見ています。
メモ:
STM32CubeIDEのTextEditorではコメントの日本語が文字化けするようです。日本語は使わないほうが無難だと思います。
0 件のコメント:
コメントを投稿