DMA的地址怎么指向片内RAM?当完成一次传送后怎么才能知道完成了传送

2019-07-20 23:58发布

DMA的地址怎么执行片内RAM?当完成一次传送后怎么才能知道完成了传送

比如DMA读取了摄像头的数据后,怎么指向片内RAM,或者是不是不能将数据送给片内的RAM,只能送给外设?
当DMA完成了一次传送后怎么得知,完成了传送
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
likunxue
2019-07-21 02:34
你得先定义一个数组, 然后指向这个数组的首地址就行了
传输完成是你先定义一次传送多少个位,DMA转完你指定的数量后,会开启中断,你在DMA中断里处理你需要的数据就行了

比如:   u32 ADC_Buf[ADC_SIZE];                //这个存放ADC转换后的值
以下是DMA配置函数

/********************************************************************************************
函 数 名: DMA1 配置函数
调    用: MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
参    数: *DMA   DMA 结构数据指针
          cpar:外设地址
          cmar:存储器地址
          cndtr:数据传输量   
返 回 值: 无
********************************************************************************************/        
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
     {     
     RCC->AHBENR    |= 1<<0;              //开启DMA1时钟,使能DMA传输
     DMA1->IFCR     =  0x0000000F;    //将DMA的通道1寄存器重设为缺省值
     DMA_CHx->CCR   |= 1<<5;          //使能连续模式
     DMA_CHx->CCR   |= 1<<7;          //使能存储器增量模式
     DMA_CHx->CCR   |= 2<<8;          //外设数据宽度为32位
     DMA_CHx->CCR   |= 2<<10;         //存储器数据宽度32位
     DMA_CHx->CCR   |= 2<<12;         //高等优先级
     DMA_CHx->CPAR  = cpar;                //DMA1 外设地址
     DMA_CHx->CMAR  = (u32)cmar;      //DMA1,存储器地址
     DMA_CHx->CNDTR = cndtr;          //DMA1,传输数据量
     DMA_CHx->CCR   |= 1<<0;          //使能ADC TX DMA1 所指示的通道
     delay_ms(5);                      //等待DMA时钟稳定
     adc1_byte.FangXiang = 0;         //方向
     adc1_byte.JiShuQi = 0;           //计数器
     adc1_byte.XiShu = 128;           //滤波系数
     adc2_byte.FangXiang = 0;         //方向
     adc2_byte.JiShuQi = 0;           //计数器
     adc2_byte.XiShu = 128;           //滤波系数   
     MY_NVIC_Init(3,2,DMA1_Channel1_IRQn,4);//配置DMA中断配置
     DMA_CHx->CCR |= 1<<1;            //使能传输完成中断  
     }


这样调用就行了    MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)ADC_Buf,ADC_SIZE);//DMA1通道设置

ADC1->DR  是内是要读到的地址
ADC_Buf,是目的地址

ADC_SIZE  是每次传送的数量

一周热门 更多>