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

  1. Pinout
  2. Connectivity – USART2
  3. NVIC settings (ustawienia przerwań)
  4. znznaczamy USART2 global interrupt
  5. zapisujemy – Generate Code

STM32IDE

  1. Tworzymy zmienną (globalną)
    1
    2
    3
    4
    /* USER CODE BEGIN PFP */
    uint8_t byte;
    //... reszta kodu
    /* USER CODE END PFP */
  2. 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 */
  3. 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);
  }
}