OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3131|回复: 3

关于DMA一次性传输多个数据的问题

[复制链接]

9

主题

53

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-5-18
在线时间
35 小时
发表于 2020-6-19 11:26:09 | 显示全部楼层 |阅读模式
11金钱
求助各位大神如果我想让DMA存够4个数据再进中断应该配置哪些参数啊。有没有大神提供一下HAL库的参考例程。
我配置的只能检测一个数据就输出了,有没有大神解决一下。

我理解的是          HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_ConvertedValue,4)  ; 这个4是检测4次数据,但是我差的这个应该是数据长度。
希望有大佬能帮我解决一下这个问题。

DMA有关配置如下:
用的STM32F411

void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
        if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
        {
        __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能       
        }else
        {
        __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
        }

    // DMA配置
    ADC1TxDMA_Handler.Instance=DMA_Streamx;                            //数据流选择
    ADC1TxDMA_Handler.Init.Channel=chx;                                //通道选择
    ADC1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    ADC1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    ADC1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    ADC1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;    //外设数据长度:32位
    ADC1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;       //存储器数据长度:32位
    ADC1TxDMA_Handler.Init.Mode=DMA_CIRCULAR;                            //循环模式
    ADC1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    ADC1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    ADC1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    ADC1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    ADC1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
          ADC1TxDMA_Handler.XferCpltCallback = HAL_DMA_IRQHandler;
       
          HAL_DMA_DeInit(&ADC1TxDMA_Handler);   
    HAL_DMA_Init(&ADC1TxDMA_Handler);
                HAL_NVIC_SetPriority(DMA2_Stream0_IRQn,0,0);    //抢占优先级为2,子优先级为2
          HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);      // 使能中断线  0
          HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_ConvertedValue,4)  ;
          __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1TxDMA_Handler);    //将DMA与ADC1联系起来(发送DMA)  
}
        void DMA2_Stream0_IRQHandler(void)
                {
                HAL_DMA_IRQHandler(&ADC1TxDMA_Handler);
                printf("%d,%d,%d,%d\r\n",ADC_ConvertedValue[0],ADC_ConvertedValue[1],ADC_ConvertedValue[2],ADC_ConvertedValue[3]);
        }
       

最佳答案

查看完整内容[请看2#楼]

你这是开启DMA发送中断,貌似没啥用处,我也不清楚这个HAL库为啥清除不了。但是我可以给你发个通过查询状态的方式发送DMA,这个我已经调通了。 DMA_HandleTypeDef UART1TxDMA_Handler; //DMA句柄 //DMAx的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器->外设模式/8位数据宽度/存储器增量模式 //DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7 //chxMA通道选择,@Ref DMA_chan ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-6-19 11:26:10 | 显示全部楼层
你这是开启DMA发送中断,貌似没啥用处,我也不清楚这个HAL库为啥清除不了。但是我可以给你发个通过查询状态的方式发送DMA,这个我已经调通了。
DMA_HandleTypeDef  UART1TxDMA_Handler;      //DMA句柄

//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chxMA通道选择,@Ref DMA_channel DMA_CHANNEL_0~DMA_CHANNEL_7
void MYDMA2_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
        if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
        {
        __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能       
        }else
        {
        __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
        }
   
    __HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);    //将DMA与USART1联系起来(发送DMA)
   
    //Tx DMA配置
    UART1TxDMA_Handler.Instance=DMA_Streamx;                            //数据流选择
    UART1TxDMA_Handler.Init.Channel=chx;                                //通道选择
    UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
    UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
    UART1TxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设流控模式
    UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
   
    HAL_DMA_DeInit(&UART1TxDMA_Handler);   
    HAL_DMA_Init(&UART1TxDMA_Handler);

//                HAL_NVIC_SetPriority(DMA2_Stream7_IRQn,3,0);                        //抢占优先级3,子优先级0
//                HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);                                //使能DMA2_Stream7中断通道
}

void DMA2_Init(void)
{
        //DMA2,STEAM7,CH4,外设为串口1,存储器为SendBuff,长度为:SEND_BUF_SIZE.
  MYDMA2_Config(DMA2_Stream7,DMA_CHANNEL_4);
}

void DMA2_Enable(UART_HandleTypeDef *huart, u8 *pData, u16 Size)
{
        HAL_UART_Transmit_DMA(huart,pData,Size);
        while(!__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7)){};//等待DMA2_Steam7传输完成
        __HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7传输完成标志
        HAL_UART_DMAStop(&UART1_Handler);      //传输完成以后关闭串口DMA        
}       

void DMA2_Stream7_IRQHandler(void)
{
        HAL_DMA_IRQHandler(&UART1TxDMA_Handler);
}
回复

使用道具 举报

9

主题

53

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-5-18
在线时间
35 小时
 楼主| 发表于 2020-6-22 10:22:51 | 显示全部楼层
jiangyy 发表于 2020-6-19 11:26
你这是开启DMA发送中断,貌似没啥用处,我也不清楚这个HAL库为啥清除不了。但是我可以给你发个通过查询状态 ...

你好,咱们这个有程序文件吗,我想再仔细研究一下
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-6-22 11:19:55 | 显示全部楼层
s5448827 发表于 2020-6-22 10:22
你好,咱们这个有程序文件吗,我想再仔细研究一下

正点原子F407和F767的HAL库,有例程代码的。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-1 07:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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