Mục tiêu

  • Học cách cấu hình DMA transfer với interrupt trong CubeMX
  • Tạo transfer DMA memory này sang memory khác, từ RAM sang RAM

Kết quả

  • Sinh code với DMA
  • Học cách cấu hình DMA trong HAL
  • Xác thực lại độ chính xác của các chứng năng bằng cách so sánh các buffer transfer

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
  • Với DMA thì chúng ta không cần cấu hình bất kỳ chân nào

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 DMA

Cấu hình tương tự bài DMA M2M trước

  • Thẻ Pinout & Configuration > DMA > DMA2 > Add
  • Chọn MEMTOMEM DMA request
  • Normal mode, Increment Address source memory và destination memory
  • Dùng FIFO
  • Byte data width
  • Burst size là single

Thêm cấu hình interrupt trong

  • NVIC
  • Enable DMA2 Stream interrupt

Xong các bước cấu hình, giờ thì generate code bằng cách save lại thôi

Workflow

Code

Giờ thì code, mở file main.c lên quất thôi

  • Code sẽ được viết vào trong đoạn /* USER CODE BEGIN 2 /và / USER CODE END 2 */
  • Cần thêm tên của DMA callback function vào DMA structure
  • Hàm HAL cho DMA được sử dụng HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
  • Tạo 2 buffer chứa data gửi và data nhận
  • Trước khi start DMA  với interrupt ta cần set callback vào DMA structure, sau đó thì dùng HAL_DMA_Start_IT để bắt đầu transfer DMA
/* USER CODE BEGIN 0 */
//two buffers One with source data, Second as destination buffer
uint8_t Buffer_Src[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
uint8_t Buffer_Dest[10];
//DMA callback creation function prototype
void XferCpltCallback(DMA_HandleTypeDef *hdma);
/* USER CODE END 0 */

/* USER CODE BEGIN 2 */
//DMA Start
  hdma_memtomem_dma2_stream0.XferCpltCallback = &XferCpltCallback;
  HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0, (uint32_t)Buffer_Src, (uint32_t)Buffer_Dest, 10);
/* USER CODE END 2 */

/* USER CODE BEGIN 4 */
//DMA complete callback with nop where we can put breakpoint
void XferCpltCallback(DMA_HandleTypeDef *hdma)
{
  __NOP(); //we reach this only if DMA transfer was correct
}
/* USER CODE END 4 */

Chương trình tham khảo

GitHub - hocarm/STM32F4-Discovery-Tutorial: Các ví dụ lập trình STM32F4 Discovery dùng CubeMX
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.