Mục tiêu
- Học cách cấu hình UART với DMA
- Học cách generate Code và sử dụng HAL function
- Tạo ví dụ đơn giản loopback với DMA
Kết quả
- Cấu hình UART và generate code
- Gửi và nhận data thông qua UART với DMA
- Xác thực lại hoạt động
Cấu hình
Tạo project
- Cách làm tương tự như bài hướng dẫn trước File > New > STM32 Project
- Chân PA9, và PA10 mặc định sẽ được lựa chọn theo với USART1 tương tự như bài UART trước
Cấu hình clock
- Set clock với tần số tối đa, giống như bài trước
Cấu hình UART
- Các thông số có thể cấu hình được cho UART là BaudRate,World length,Parity,Stop bits,Data direction, Oversampling tương tự như bài trước luôn
Cấu hình DMA
- Chọn TAB>DMA Settings sau đó ấn ADD
- USART configuration DMA Tx setting
- USART configuration DMA Rx setting
Cấu hình NVIC
Mặc định sẽ tự set NVIC với Force DMA channel interrupt cho ta như hình
Save lại để generate code thôi.
Workflow
HAL Library UART với DMA RX flow
Code
- Viết code trong
main.c
giữa /* USER CODE BEGIN 2*/và /* USER CODE END 2*/
2 hàm được dùng cho truyền và nhận là
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
Các bước thực hiện
- Định nghĩa buffer
- Gửi và nhận data với DMA
- Kiểm tra callback hoàn thành bằng cách đặt breakpoint vào NOP để xem nếu chúng ta nhận xong buffer.
/* USER CODE BEGIN 0 */
uint8_t tx_buff[]={0,1,2,3,4,5,6,7,8,9};
uint8_t rx_buff[10];
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1,rx_buff,10);
HAL_UART_Transmit_DMA(&huart1,tx_buff,10);
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
__NOP();//check if we receive all data
}
/* USER CODE END 4 */
Source code tham khảo bạn có thể xem tại đây