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

2023-07-19  

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)


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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。