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

GitHub - hocarm/STM32F4-Discovery-Tutorial at stm32cubeide_f4
Các ví dụ lập trình STM32F4 Discovery dùng CubeMX. Contribute to hocarm/STM32F4-Discovery-Tutorial development by creating an account on GitHub.