stm32 双adc 采集问题 dma数据有一个没有 adc2为0

发布者:mb5362443最新更新时间:2016-07-27 来源: eefocus关键字:stm32  双adc  采集问题  dma数据 手机看文章 扫描二维码
随时随地手机看文章
配置那些就不说了,我这里是同步规则采样,共4通道:

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. /* Regular ChannelÉèÖòɼ¯Ë³ÐòºÍʱ¼ä.ÉèÖóÉË«adcºó,dmaÓÃ32bit´«Êä,µÍ16bitÊÇadc1ͨµÀ,¸ß16bitÊÇadc2ͨµÀ */  
  2.     ADC_RegularChannelConfig(ADC1, CH0_ADL1,   1, ADC_SampleTime_13Cycles5);//0  
  3.     ADC_RegularChannelConfig(ADC1, CH1_ADL2,    2, ADC_SampleTime_13Cycles5);// 2  
  4.     ADC_RegularChannelConfig(ADC1, CH8_ADR1, 3, ADC_SampleTime_13Cycles5);// 4  
  5.     ADC_RegularChannelConfig(ADC1, CH9_ADR2,   4, ADC_SampleTime_13Cycles5);//6  
  6.   
  7.   
  8.     /* Regular Channel */  
  9. ADC_RegularChannelConfig(ADC2, CH9_ADR2,1, ADC_SampleTime_13Cycles5);// 1  
  10. ADC_RegularChannelConfig(ADC2, CH8_ADR1,  2, ADC_SampleTime_13Cycles5);// 3  
  11.     ADC_RegularChannelConfig(ADC2, CH1_ADL2,    3, ADC_SampleTime_13Cycles5);//5  
  12.     ADC_RegularChannelConfig(ADC2, CH0_ADL1, 4, ADC_SampleTime_13Cycles5);//7  


 

使用的是ac连续采样,dma连续搬运模式。注意点如下:

1、数组要定义为u32的,例如u32 buf[4],不要定义为u16 buf[8],经过测试,如果使用 u16 buf[8] 最后一个16bit buf[7]会为0,不知道为什么。

2、adc2有2种方式可以启动,一种是:

ADC_ExternalTrigConvCmd(ADC2,ENABLE);   /*adc2¹æÔòͨµÀÍⲿ´¥·¢ */

另一种是:

ADC_SoftwareStartConvCmd(ADC2,ENABLE);

这2种方法会带来一个不同的结果,细分析如下:

如上所述转换序列,正常情况是buf32[0] & 0xFFFF与(buf32[3]>>0xFFFF)是同一组数据,拿buf16[8]来说就是buf16[0]、buf[7]是一组数据,可是改变adc2的触发方式有什么区别呢?

================使用buf16[8] + ADC_SoftwareStartConvCmd(ADC2,ENABLE);方式===============

此组合可以得到正确的数组对应方式,即dma搬来的数据与我们预期的是对应的。但是buf16[7]=0

 

================使用buf16[8] + ADC_ExternalTrigConvCmd(ADC2,ENABLE);方式===============

此组合不可以得到正确的数组对应方式,即dma搬来的数据与我们预期的是不对应的。而且buf16[7]=0

 

================使用buf32[4] + ADC_SoftwareStartConvCmd(ADC2,ENABLE);方式===============

此组合不可以得到正确的数组对应方式,即dma搬来的数据与我们预期的是不对应的。

================使用buf32[4] + ADC_ExternalTrigConvCmd(ADC2,ENABLE);方式===============

此组合可以得到正确的数组对应方式,即dma搬来的数据与我们预期的是对应的。


好,这就是我的调试心得,大家避免注意下就好了。

这里有一个单ADC同步规则+同步注入的例子:http://www.csdn123.com/html/itweb/20130801/33722_33714_33696.htm。

貌似单个ADC好用,两个的同步注入有问题????

 

===========继续补充20160419================

之前的注入通道数据有问题,把他的采样率该慢点就可以了,视自己情况而定,慢慢调试吧!

关键字:stm32  双adc  采集问题  dma数据 引用地址:stm32 双adc 采集问题 dma数据有一个没有 adc2为0

上一篇:STM32的两个.bin文件如何合并?
下一篇:stm32 ADC的规则通道和注入通道混合使用

推荐阅读最新更新时间:2024-03-16 15:01

stm32入门笔记(三)RT-Thread 当中spi和SFUD的移植问题解决方案
系统的方便性,让我开始了rtt的学习。 但是在添加spi来读取外部FLASH的时候,遇到了一些情况。 例如,找不到设备,或者说无法读取FLASH的ID。 下面通过介绍一套完整的流程来帮助大家熟悉。 首先。 cube mx。配置spi 2为打开 然后在menuconfig当中实现对驱动的定义和添加。 最后在里面添加,关于spi的驱动和sfud。 然后生成工程。 最后添加代码测试:https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/ 可以得到结果。
[单片机]
<font color='red'>stm32</font>入门笔记(三)RT-Thread 当中spi和SFUD的移植<font color='red'>问题</font>解决方案
STM32--堆栈空间
函数的局部变量,都是存放在 栈 里面,栈的英文是:STACK. STACK的大小,可以在STM32的启动文件里面设置,以战舰开发板为例,在startup_stm32f10x_hd.s里面: Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp Heap_Size EQU 0x00000200 Stack_Size EQU 0x00000400 表示栈大小
[单片机]
STM32学习笔记之EXTI(外部中断)
一:EXTI(外部中断)说明 =========================================分割线========================================= 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置 输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独 立的屏蔽。挂起寄存器保持着状态线的中断要求。 =========================================分割线========================================= 19个中断如下:
[单片机]
<font color='red'>STM32</font>学习笔记之EXTI(外部中断)
STM32--今天下午遇到了两个BUG
1、栈溢出 调试时发现有个调节PWM占空比的参数会莫名其妙的乱跳。观察代码,求这个系数的函数只在系统初始化的时候求过一次,之后就再也没有调用过。 单步执行代码,发现初始化时第一次运行时求出的系数是对的,但是全速运行后,这里面的系数就变了。 既然我没有调用函数来修改这个值,那肯定是被别的区域的值覆盖了。 打开map文件,看一下Trans_1_BaseStructre这个结构体周围都有哪些数据 ModbusSend这数组是用来发送串口数据的,空运行的时候里面全是0,那只可能是__initial_sp影响了。而__initial_sp是栈底地址,所以应该是栈溢出了。 想起来之前因为某种原因把栈空间改成512字节,
[单片机]
STM32--今天下午遇到了两个BUG
基于STM32的队列与栈
使用ESP8266接收云端传输数据,云端下发数据可能为好几组数据同时下发,而下位机处理只能单个依次进行,因此需要建立一个缓冲数组,接收云端数据,然后一个个依次处理-- 队列。 队列: 顺序队列:建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置 数据结构之顺序队列(C实现) 循环队列: 基于stm32串口环形缓冲队列处理机制—入门级(单字节) 栈: https://jingyan.baidu.com/article/6c67b1d6a09f9a2786bb1e4a.html 这里
[单片机]
基于<font color='red'>STM32</font>的队列与栈
STM32学习笔记(十) CAN通讯测试(环回模式)
1.CAN通讯的理解  想学习CAN通讯,那么要对通讯协议有一定的认知。通讯协议是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。  CAN通讯全称控制器局域网通讯,是用来在局域网中高效传输,处理信息的一种通讯方式。它采用数据块编码的方式,数据块根据帧类型的不同有四种格式,可使不同的节点接收到相同的数据,然后再根据各节点内CAN配置选择处理还是丢弃该信息(这与TCP/IP协议栈的链路层的MAC地址过滤很相似,是可以互通理解的),CAN的位流是按照非归零(NRZ)码方式编码,一个完整的位电平有显性和隐性两种方式。显性和隐性
[单片机]
<font color='red'>STM32</font>学习笔记(十) CAN通讯测试(环回模式)
再造STM32---第十六部分:SysTick—系统定时器
本章参考资料《ARM Cortex™-M4F 技术参考手册》 -4.5 章节 SysTick Timer(STK), 和4.48 章节 SHPRx,其中 STK 这个章节有 SysTick 的简介和寄存器的详细描述。因为SysTick 是属于 CM4 内核的外设,有关寄存器的定义和部分库函数都在 core_cm4.h 这个头文件中实现。所以学习 SysTick 的时候可以参考这两个资料,一个是文档,一个是源码。 16.1 SysTick 简介: SysTick—系统定时器是属于 CM4 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSC
[单片机]
再造STM32---第十六部分:SysTick—系统定时器
STM32速成笔记(3)—按键检测
一、按键 检测 原理 按键检测原理比较简单,按键按下和不按下,其连接引脚的电平是不一样的,按键检测正是通过检测按键引脚的电平变化来实现的。比如按键未按下时引脚电平为高电平,按键按下后为低电平。我们在检测按键时只需要检测按键引脚是否变为低电平来确定按键是否按下。 二、 硬件 连接 按键的硬件连接决定了我们在配置按键IO时IO的状态。以我们使用的普中核心板为例,上面有三个按键 普中核心板按键硬件电路图 其中K1一端接VCC,另一端接单片机。K2和K3一端接地,另一端接单片机。硬件电路不同,导致他们在进行按键检测时IO的配置不同。 针对K1这种按键电路,按键按下时, 单片机 的引脚接到VCC,因此在未按下的情况下该引脚的默认电平
[单片机]
<font color='red'>STM32</font>速成笔记(3)—按键检测
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved