0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F1的ADC2如何使用DMA功能 USART过载错误Overrun error

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-14 14:42 次阅读

ADC2如何使用DMA功能

上一篇文章说了关于ADC使用DMA的功能,单ADC(只使用ADC1,或者只使用ADC2)采集多条通道,可以使用规则多利用DMA功能实现。

但是,只有ADC1和ADC3拥有DMA功能,而ADC2没有DMA功能,如何实现使用DMA功能采集数据呢?

这个问题大家不必担心,ST这么大的公司,这种基本的功能,肯定是有办法解决的。

其实这问题在参考手册中都能找到答案。答案简单概括就是:使用双ADC模式,由ADC2转化的数据可以通过双ADC模式,利用ADC1的DMA功能传输。

在有2个或以上ADC模块的产品中,可以使用双ADC模式。在双ADC模式里,根据ADC1_CR1寄存器中UALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从的交替触发或同步触发。

STM21F1的ADC2转换的结果也是保存在ADC_DR寄存器中,这种是在双模式下(像F4还有三重模式)。

假如上一篇文章的采集通道换成如下顺序:ADC2的通道3、ADC1的通道8、ADC2的通道2,则需要软件配置:

ADC_RegularChannelConfig(ADC2,ADC_Channel_3, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_8, 2, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC2,ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);

说到这里,相信都应该明白了吧。

USART过载错误Overrun error

这一节内容,也有点算是网友问的问题,只是问的方式不同,也算是一个问题点吧。

这个问题的来源就是:频繁的接收UART数据,没有及时的读取USART_DR中的数据,使其会发生过载错误。

这种情况一般是发生在我们不使用中断接收UART数据,在某些RTOS中,我们使用getchar来读取数据,但由于有更高优先级任务打断了接收的任务,而这个时候UART又有许多数据发过来,这时,过载错误就会发生了。

而过载错误就会导致接收的数据异常,这个时候,解决的办法很简单:通过读取USART_SR,再读取USART_DR即可清除。

这个时候也可以使用过载错误中断,但是,配置的时候需要注意软件的配置:USART_ITConfig(USART1,USART_IT_ERR, ENABLE);而有的人配置成:USART_IT_ORE.

USART_IT_ORE这个确实存在,但不能使用在这里,USART_ITConfig这个函数明确要求了配置的参数。这个用于处理中断判断标志:if(USART_GetITStatus(USART1,USART_IT_ORE) != RESET)

好了,今天就讲述上面两点,希望对你们有所帮助。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    98971
  • USART
    +关注

    关注

    1

    文章

    186

    浏览量

    30371
  • STM32F10
    +关注

    关注

    0

    文章

    43

    浏览量

    15520
  • ADC2
    +关注

    关注

    0

    文章

    2

    浏览量

    1451
收藏 人收藏

    评论

    相关推荐

    STM32F302差分ADC异常,采集跳动的原因?如何解决?

    ); ADC_SelectDifferentialMode(ADC2, ADC_Channel_5, ENABLE); /* Configures the ADC
    发表于 04-18 08:06

    STM32F303xC系列ADC校准一直不通过的原因?

    _DMAMode_Circular); /* Enable the ADC DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable
    发表于 04-11 08:26

    STM32 ADC+DMA多通道转换数据错位的原因?怎么解决?

    ]​,即为ADC采样的值。 2、​HAL库配置:​ ​扫描模式使能,连续转换模式使能,DMA连续转换请求使能 3、DMA2_CH1中断不使能(目的为了减少进出中断时间)​ 4、whi
    发表于 04-10 07:24

    请问STM32G4的ADC1,ADC2,ADC3,ADC4可以同时工作在独立模式吗?

    咨询下各位: STM32G4的ADC1,ADC2,ADC3,ADC4可以同时工作在独立模式吗?每个ADC
    发表于 04-10 06:01

    STM32 USART中断与ADC DMA中断冲突造成硬件错误的原因?

    使用STM32USART与主机设备通讯,主机设备每隔50ms会与STM32USART通讯一次,使用ADC
    发表于 04-02 06:26

    STM32 UART中断接收每次都出现overun错误,为什么?

    现在使用的STM32G031开发程序。对方设备是收发一体的UART(半双工),我是发完之后立刻切换到中断接收模式。数据量不大,但是每次都有overrun错误。不清楚到底是什么原因导致的。 (最初
    发表于 04-01 06:03

    STM32G070 ADC配置检测3个通道,DMA传输长度为1,OVR标志不会置1为什么?

    ADC配置检测3个通道,DMA传输长度为1,OVR标志不会置1,为什么? 不知道自己哪里理解错误了,求指教 if (HAL_
    发表于 03-29 07:32

    STM32H750VBT6 ADC1,ADC2,ADC3,加DMA为什么ADC3回调函数不能正常工作?

    STM32H750VBT6ADC1,ADC2,ADC3,加DMA为什么ADC3回调函数不能正常工作 AD
    发表于 03-29 07:23

    使用CubeMX生成STM32F103C8T6的DMA ADC代码为什么无效?

    (); MX_ADC1_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf(\"-
    发表于 03-29 06:08

    求助,STM32F1慢速交叉模式中两个ADC采集和转换时间的问题求解

    前提: 1.目前正在学习HAL库的双ADC慢速交叉模式(DMA版),用PC0采集通道电压值; 2.main.c中只有延时1秒循环打印采集到的
    发表于 03-28 08:32

    stm32F1 ADC采样有尖刺跟什么有关?

    在使用stm32F1时,一个4mVDC信号经过运放后输出80mV DC信号,由ADC采样,但在测试中发现,ADC采样时会产生一个向上的尖刺,初步判断应为ADC采样时
    发表于 03-20 06:22

    stm32接收ad7903链模式、无忙指示时ADC1ADC2连接顺序问题求解

    使用stm32接收AD7903链模式、无忙指示器采集到的数据,数据手册中链模式的结构如下,ADC1的输入接地,输出接入ADC2的输入,ADC2的输出作为
    发表于 12-05 07:00

    STM32F2直接存储器访问DMA

    /unpack 突发传输模式 通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理
    发表于 09-13 07:02

    基于STM32H563 USART演示DMA链表功能

    STM32H563芯片上的USART3与板载STLINK的VCP相连,通过PC端串口助手软件先后发送3串字符给MCU,MCU的USART3通过DMA以链表模式依次接收并存到相应内存,同
    发表于 08-11 09:11 652次阅读
    基于<b class='flag-5'>STM32</b>H563 <b class='flag-5'>USART</b>演示<b class='flag-5'>DMA</b>链表<b class='flag-5'>功能</b>

    STM32F1DMA使用

    在前面我们提到过 DMA,这一章我们就来学习 STM32F1DMA 使 用。要实现的功能是:通过 K_UP 按键控制 DMA 串口 1
    的头像 发表于 06-22 10:23 1470次阅读
    <b class='flag-5'>STM32F1</b>的<b class='flag-5'>DMA</b>使用