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.