硬汉嵌入式论坛

 找回密码
 立即注册
查看: 669|回复: 1
收起左侧

[DMA] stm32h750 DMA HAL库

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2024-11-7 21:40:55 | 显示全部楼层 |阅读模式
那个大神可不可以帮我看看,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);
//}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2024-11-8 09:35:47 | 显示全部楼层
1、搬运的那个地址空间,这个比较重要,有些空间,DMA2不支持搬运
2、init里面调用一次HAL_DMA_Start,dma_enable_transmit里又调用了一次HAL_DMA_Start,这个是出于什么考虑
3、最重要的是,你DMA后,没有等待DMA传输完毕就去打印数据了,这个不行。

参考下我的简单测试吧

STM32H7的MDMA,DMA2D和DMA性能测试出来了,DMA2D和MDMA有一拼,DMA1和2的性能太挫
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=94058
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 16:17 , Processed in 0.050812 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表