OpenEdv-开源电子网

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

DMA双缓存模式,CPU在DMA中断中如何选择缓存数组

[复制链接]

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
发表于 2020-3-26 17:15:00 | 显示全部楼层 |阅读模式
1金钱
RT,我的设置是这样的
  1. void MYDMA2_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
  2. {
  3.   NVIC_InitTypeDef NVIC_InitStructure;
  4.         DMA_InitTypeDef  DMA_InitStructure;
  5.         
  6.         if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
  7.         {
  8.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
  9.                
  10.         }else
  11.         {
  12.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
  13.         }
  14.   DMA_DeInit(DMA_Streamx);
  15.         
  16.         while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置
  17.         
  18.   /* 配置 DMA Stream */
  19.   DMA_InitStructure.DMA_Channel = chx;  //通道选择
  20.   DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址
  21.   DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址
  22.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//存储器到外设模式
  23.   DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量
  24.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  25.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
  26.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位
  27.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位
  28.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式
  29.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;//中等优先级
  30.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  31.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  32.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
  33.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
  34.   DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream
  35.         DMA_DoubleBufferModeConfig(DMA2_Stream0,(uint32_t)(u16 *)(uAD_Buff_B),DMA_Memory_0);    //DMA_Memory_0首先被传输 memory_0是uAD_Buff_A
  36.   DMA_DoubleBufferModeCmd(DMA2_Stream0,ENABLE);
  37.                
  38.     NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;  //DMA2_Stream0中断
  39.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  //抢占优先级1
  40.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;        //子优先级1
  41.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
  42.     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化NVIC寄存器   
  43.                
  44.     DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TC); //清除中断标志   
  45.     DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE); //传输完成中断                                       
  46.     DMA_Cmd(DMA2_Stream0, ENABLE); //使能DMA
  47. }
复制代码
初始化是这样的
  1. MYDMA2_Config(DMA2_Stream0,DMA_Channel_0,(u32)&ADC1->DR,(u32)uAD_Buff_A,DMA_BuffSize);
复制代码

中断中的程序是这样的

  1. void DMA2_Stream0_IRQHandler(void)  
  2. {
  3.         
  4.          DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
  5.          //数据转移程序
  6.          if(DMA_GetCurrentMemoryTarget(DMA2_Stream0) == DMA_Memory_0)
  7.          {
  8.              ADC_ConvertedValueptr = uAD_Buff_B;//指针指向uAD_Buff_B
  9.          }
  10.          else
  11.          {
  12.              ADC_ConvertedValueptr = uAD_Buff_A;
  13.          }
  14. }
复制代码
我的疑问在这里:当if(DMA_GetCurrentMemoryTarget(DMA2_Stream0) == DMA_Memory_0时
ADC_ConvertedValueptr 指针是指向uAD_Buff_B还是uAD_Buff_A?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
 楼主| 发表于 2020-3-26 17:16:56 | 显示全部楼层
本帖最后由 h418452224 于 2020-3-26 17:18 编辑

实际操作中指针指向uAD_Buff_A和指向uAD_Buff_B两种情况都不影响程序运行结果也就是说随便指有点懵
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2020-9-3
在线时间
27 小时
发表于 2021-2-24 13:15:47 | 显示全部楼层
按逻辑是该写指向B,主要还是看你定义的缓存区大小实验结果明显不明显。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 18:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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