Port szeregowy można obsłużyć za pomocą przerwań (np. przychodzących znaków z konsoli), odciąża to bardzo procesor.
STM32CubeMX
W programie musimy ustawić przerwanie dla portu
- Pinout
- Connectivity – USART2
- NVIC settings (ustawienia przerwań)
- znznaczamy USART2 global interrupt
- zapisujemy – Generate Code
STM32IDE
- Tworzymy zmienną (globalną)
1
2
3
4/* USER CODE BEGIN PFP */
uint8_t byte;
//... reszta kodu
/* USER CODE END PFP */ - W funkcji main() przypinamy zmienną byte do UART przed rozpoczęciem głównej pętli while(1)
1
2
3
4/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2, &byte, 1); //wczytanie 1 bajtu do zmiennej byte
//...
/* USER CODE END 2 */ -
Tworzymy obsługę przerwania otrzymania sygnału Rx (Receiver) z USART
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15/*USER CODE 4 BEGIN*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART2) //FX: if our USART2 port
{
/* Transmit one byte with 100 ms timeout */
HAL_UART_Transmit(&huart2, &byte, 1, 100);
/* Receive one byte in interrupt mode */
HAL_UART_Receive_IT(&huart2, &byte, 1);
}
}
//...
/*USER CODE 4 END*/
Sterowanie klawiszami PC na przerwaniu
Oczywiście zamiast wysyłać (wypisywać) znaki można sterować klawiszami np. diodą, alternatywna funkcja do powyższej:
Dodajemy zmienną globalną
1 | uint8_t greenLedStatus=0; |
i podmieniamy funkcję
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART2){ /* Transmit one byte with 100 ms timeout */ if (byte>=97 && byte <=122) byte-=32; //convert to uppercase a-z only if (byte == 65) //A letter { HAL_GPIO_WritePin(greenLed_GPIO_Port, greenLed_Pin, greenLedStatus ? GPIO_PIN_RESET : GPIO_PIN_SET); greenLedStatus = !greenLedStatus; //remember the state } HAL_UART_Transmit(&huart2, &byte, 1, 100); /* Receive one byte in interrupt mode */ HAL_UART_Receive_IT(&huart2, &byte, 1); } } |