STM32的ADC1+ADC3 16路采集 DMA传输 数据不错位
来源:互联网 发布:2015全国交通事故数据 编辑:程序博客网 时间:2024/06/05 14:08
1) ADC多通道采集:(多通道采集必须用扫描模式,扫描模式时规则组的通道共用一个寄存器,so必须用DMA传输;为防止数据错位,不能用连续模式,而应在查询或中断中先关闭ADC转换,再开启ADC转换)so应采用扫描、非连续的方式、DMA正常模式,DMA的EOC中断或查询;
上述的配置下,ADC运行流程如下:
每个规则通道采集之后,每个ADC_DR会更新,这个更新会启动一次DMA,同时会产生EOC,然后DMA会传输此数据,DMA的传输会清除EOC标志,然后DMA的传输量计数器--,so,每一组规则通道转换完成后也不会产生EOC(详情看英文版STM32手册V15版本-Page220,而非V9版本),so利用这个EOC产生ADC中断或查询时,标志位已为RESET,so根本就办不到,但可利用DMA正常模式,DMA_EOC标志被置位在中断或查询中ADC转换先关闭,对应的DMACmd关闭,然后重新写入DMA的传输数据量CNDTR,再打开DMACmd,再清除DMA标志位,再打开ADC转换,同时,存储模拟量的变量或数组需要用volatile修饰
DMA查询的代码如下
if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET) //ÅжÏͨµÀ1´«ÊäÍê³É
{
ADC_SoftwareStartConvCmd(ADC1,DISABLE);
DMA_Cmd(DMA1_Channel1,DISABLE);
DMA_SetCurrDataCounter(ADC1_DMA_CHANNLE,ADC1_DMA_BUFFER_SIZE); DMA_Cmd(DMA1_Channel1,ENABLE);
DMA_ClearFlag(DMA1_FLAG_TC1);//
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
同时也可以ADC1、ADC3同时使用,ADC3利用PF6-9,可复用为Channel4-7,页要为扫描模式,非连续模式;代码如下:
ADC_InitStructure.ADC_NbrOfChannel = 4;
ADC_Init(ADC3, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC3,ADC_Channel_4,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC3,ADC_Channel_5, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC3,ADC_Channel_6, 3, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 4,ADC_SampleTime_239Cycles5 );
ADC_DMACmd(ADC3, ENABLE);
ADC_Cmd(ADC3,ENABLE);
ADC_ResetCalibration(ADC3);
while(ADC_GetResetCalibrationStatus(ADC3));
ADC_StartCalibration(ADC3);
while(ADC_GetCalibrationStatus(ADC3));
ADC_SoftwareStartConvCmd(ADC3, ENABLE);
- STM32的ADC1+ADC3 16路采集 DMA传输 数据不错位
- stm32 非DMA方式 多路ADC ADC1,ADC3两种方式求助
- STM32的ADC1采集多条通道,可以不使用DMA功能吗?
- STM32采集多路ADC到DMA的方法
- STM32硬件IIC之DMA传输数据
- STM32的UART DMA传输总结
- STM32F030 ADC1的DMA采样问题
- STM32F030 ADC1的DMA采样问题
- STM32F030 ADC1的DMA采样问题
- STM32 DMA传输
- STM32:ADC采集数据实例(采用DMA模式)
- 针对stm32 DMA传输AD数据,在完成中断后如何复位的问题的思考
- 针对stm32 DMA传输AD数据,在完成中断后如何复位的问题的思考
- 在STM32上实现使用DMA+USART3传输数据
- STM32 ADC—DMA传输
- STM32通过DMA方式采集多路AD
- STM32的SPI采用DMA方式传输测试
- STM32输入捕获加DMA传输的解决方案
- SQL语言操作mysql数据库
- Visual Studio手动升级旧版本程序
- [转]Linux下使用system()函数一定要谨慎
- 【codevs 1373】 射命丸文
- No.001内存空间分几部分:代码段、数据段,栈,堆 (收集整理)
- STM32的ADC1+ADC3 16路采集 DMA传输 数据不错位
- MediaCodec文档翻译
- 那些过分的关心,其实不是关心
- 问题 E: 捡石子(哈夫曼树思想)
- 经典的二分法
- 为什么程序员一定要会用Google和Stack Overflow?
- AIDL实践二:自定义数据类型
- java基本概念-验证码
- Linux中的lo回环接口