31. I/O実践 31
ここから、I/Oを使用する場合のユーザ処理を追加していきます。
STM32CubeMXで生成したコードには、
/* USER CODE BEGIN XXX */ と /* USER CODE END XXX */と
の記載があり、このコメントの範囲内にユーザコードを追加していき
ます。
ここで追記したユーザーコードは、再度CubeMXにてコード生成した
場合でも保護されます。
今回追記する箇所は、3か所となります。
※配布されたファイル類のIO実践フォルダ内のmain.cに今回追加分のソースコードが格納
されています。こちらから追記部分をコピーください。
32. I/O実践 32
追記箇所①
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
変数を追記します。割込み入力の判定に使用する変数となります。
/* USER CODE BEGIN 0 */
__IO uint8_t Pushed;
/* USER CODE END 0 */
追記箇所②
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループ処理を追加します。スイッチ押下の割込みを待ち、スイッチ入
力時にGPIOをトグルします。
/* USER CODE BEGIN 3 */
Pushed = 0;
while (Pushed == 0)
{
;
}
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
}
/* USER CODE END 3 */
33. I/O実践 33
追記箇所③
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
割込みのコールバック関数を追記します。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_13)
{
Pushed = 1;
}
}
58. UART実践 58
ここから、UARTを使用する場合のユーザ処理を追加していきます。
STM32CubeMXで生成したコードには、
/* USER CODE BEGIN XXX */ と /* USER CODE END XXX */と
の記載があり、このコメントの範囲内にユーザコードを追加していき
ます。
ここで追記したユーザーコードは、再度CubeMXにてコード生成した
場合でも保護されます。
今回追記する箇所は、3か所となります。
※配布されたファイル類のUART実践フォルダ内のmain.cに今回追加分のソースコードが
格納されています。こちらから追記部分をコピーください。
59. UART実践 59
追記箇所①
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
変数を追記します。
送受信状態フラグと送受信のバッファを定義します。
/* USER CODE BEGIN 0 */
uint8_t uart_status;
uint8_t uartbuff[8];
/* USER CODE END 0 */
60. UART実践 60
追記箇所②
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループ処理を追加します。
/* USER CODE BEGIN 3 */
uart_status = 0;
memset( uartbuff, 0x00, sizeof(uartbuff) );
if( HAL_UART_Receive_IT( &huart1, uartbuff, 1 ) == HAL_OK ) {
/* wait */
while( uart_status != 3 ) {
switch( uart_status ) {
case 0:break;/* recive complete wait */
case 1:
/* recive complete.*/
uart_status = 2;
HAL_UART_Transmit_IT( &huart1, uartbuff, strlen(uartbuff) );
break;
case 2:break;/* transmit complete wait */
case 3:break;/* end */
}
}
}
}
/* USER CODE END 3 */
94. I2C&Timer実践 94
追記箇所①
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
変数を追記します。
/* USER CODE BEGIN 0 */
extern void TestHTS221( I2C_HandleTypeDef *hi2c, int16_t *Temperature );
__IO uint8_t Tim2Expire;
__IO int16_t Temperature;
/* USER CODE END 0 */
追記箇所②
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
タイマの起動を行います。
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */
95. I2C&Timer実践 95
追記箇所③
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループ処理を追加します。1秒に1回、温度情報を取得します。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Tim2Expire= 0;
while (Tim2Expire== 0)
{
;
}
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
TestHTS221(&hi2c2, (int16_t *)&Temperature);
}
/* USER CODE END 3 */
96. I2C&Timer実践 96
追記箇所④
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
割込みのコールバック関数を追記します。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim2.Instance)
{
Tim2Expire = 1;
}
}
119. ADC実践 119
追記箇所①
/* USER CODE BEGIN PV */
/* USER CODE END PV */
A/D変換値を格納する変数を定義します。
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint32_t analogValue;
/* USER CODE END PV */
120. ADC実践 120
追記箇所②
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
ループにAD取得処理を追加します。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
if( HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK )
{
analogValue = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
}
/* USER CODE END 3 */