|
那个大神可不可以帮我看看,stm32h750的DMA搬运数据的代码,HAL库的,他没有办法正常搬运,哪里有问题
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
void dma_init(void);
void dma_enable_transmit(uint16_t cndtr);
void dma_check_complete(void);
DMA_HandleTypeDef g_dma_handler;
volatile uint8_t srt_buf[10] = {0,1,2,3,4,5,6,7,8,9};
volatile uint8_t dest_buf[10];
int main(void)
{
// sys_cache_enable(); /* 打开L1-Cache */
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(192, 5, 2, 4);/* 设置时钟, 480Mhz */
delay_init(480); /* 延时初始化 */
usart_init(115200);
dma_init();
dma_enable_transmit(10);
//dma_check_complete();
for(int i ; i < 10;i++)
{
printf("dest_buf[%d]=%d\n",i,dest_buf[i]);
printf("srt_buf[%d]=%d\n",i,srt_buf[i]);
}
while(1)
{}
}
void Error_Handler(void)
{
while(1)
{}
}
void dma_init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE(); // 开启DMA2时钟
g_dma_handler.Instance = DMA2_Stream1;
g_dma_handler.Init.Request = DMA_REQUEST_MEM2MEM; // 请求MEM2MEM模式
g_dma_handler.Init.Mode = DMA_NORMAL;
g_dma_handler.Init.Direction = DMA_MEMORY_TO_MEMORY; // 内存到内存传输
g_dma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 数据字节对齐
g_dma_handler.Init.MemInc = DMA_MINC_ENABLE; // 源地址递增
g_dma_handler.Init.MemBurst = DMA_MBURST_SINGLE; // 内存突发模式:单次突发
g_dma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐
g_dma_handler.Init.PeriphInc = DMA_PINC_ENABLE; // 目标地址递增
g_dma_handler.Init.PeriphBurst = DMA_PBURST_SINGLE; // 外设突发模式:单次突发
g_dma_handler.Init.Priority = DMA_PRIORITY_MEDIUM;
g_dma_handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
g_dma_handler.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // FIFO阈值:满
HAL_DMA_DeInit(&g_dma_handler); // 先反初始化
if (HAL_DMA_Init(&g_dma_handler) != HAL_OK)
{
Error_Handler(); // 初始化失败时调用错误处理函数
}
// 传输的长度应当是 10
HAL_DMA_Start(&g_dma_handler, (uint32_t)srt_buf, (uint32_t)dest_buf, 10); // 初始化并开始DMA传输
}
void dma_enable_transmit(uint16_t cndtr)
{
// 确保传输启动
HAL_DMA_Start(&g_dma_handler, (uint32_t)srt_buf, (uint32_t)dest_buf, cndtr); // 启动DMA传输
}
//void dma_check_complete(void)
//{
// // 轮询检查DMA传输是否完成
// while (__HAL_DMA_GET_FLAG(&g_dma_handler, DMA_FLAG_TCIF1_5) == RESET)
// {
// // 等待DMA传输完成
// }
//
// // 清除传输完成标志
// __HAL_DMA_CLEAR_FLAG(&g_dma_handler, DMA_FLAG_TCIF1_5);
//}
|
|