Site icon TAPIT

Sử dụng Uart Interrupt RX với Cube MX trên MCU STM32F103C8T6

Việc nhận dữ liệu liên tục trong vòng while như vậy khiến cho MCU không thể làm được việc khác được. Vì vậy, chúng ta sẽ sử dụng chức năng ngắt UART để nhận dữ liệu. Ở trong vòng lập while(1) chúng ta sẽ làm nhiệm vụ cố định nào đó, khi có dữ liệu đến chân Rx của UART thì sẽ nhảy vào hàm ngắt UART để nhận dữ liệu. Sau khi thực hiện xong tác vụ ngắt, MCU sẽ quay về chương trình chính trong vòng lập while(1) để lại hoạt động bình thường.

[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

Bước 1:

Cấu hình chân GPIO_Output

Bước 2:

Cấu hình UART1 ở mode Asynchorous. Chọn tốc độ baudrate thông dụng là 9600

Bước 3:

Chọn thanh NVIC Settings -> Enabled

Bước 4:

Cấu hình chân nạp code

Bước 5:

Setting project

Đặt tên cho project và chọn công cụ IDE là MDK-ARM V5

Bước 6:

Chọn những thư viện thật sự cần thiết cho project này. Cấu hình xong và sinh code.

Bước 7:

Khai báo mảng char Rx_data[2]; để nhận dữ liệu.

Hàm ngắt nhận dữ liệu UART:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

}

Vì chip STM32F103C8T6 có đến 3 UART vì vậy trong hàm ngắt chúng ta phải kiểm tra, hiện tại chúng ta nhận dữ liệu từ UART nào:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

            if(huart->Instance == UART1){

  }

}

huart->Instance == UART1 là thực thể chúng ta truyền vào để xác nhận đang nhận ngắt ở UART1

+ Ở hàm main: Trước khi vào hàm while(1){} chúng ta sẽ khai báo ngắt nhân bằng hàm HAL_UART_Receive_IT(&huart1, (uint8_t*) Rx_data, 1);

Có 3 thông số truyền vào hàm này bao gồm:

&huart1: UART1 chúng ta đang sử dụng

(uint8_t*) Rx_data: Truyền vào địa chỉ của mảng Rx_data để nhận dữ liệu, còn (uint8_t *) dùng để ép kiểu dữ liệu

Size = 1: Số kí tự chúng ta nhận vào khi xảy ra ngắt

+ Ở trong hàm ngắt: Chúng ta sẽ kiểm tra sẽ kiểm tra kí tự hiện tại nhận được có phải là kí tự ‘a’ hay không, nếu đúng là kí tự ‘a’ thì chúng ta sẽ đảo trạng thái led, đồng lời truyền ngược lại kí tự ‘a’ đã nhận lên trên máy tính và khai báo lại hàm ngắt nhận HAL_UART_Receive_IT(&huart1, (uint8_t*) Rx_data, 1);. Sau mỗi lần ngắt xảy ra, chúng ta phải khai báo lại hàm ngắt này để lần ngắt tiếp theo được thực thi, nếu không khai báo lại hàm ngắt này trong chương trình ngắt thì chúng ta chỉ vào chương trình ngắt đúng 1 lần.

Chúc các bạn thành công!

Xem thêm: Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây