STM32G473CBT6单片机在浮点运算,信号采集、数据处理方面有很大的用途。因相关的资料较少,特此做一下笔记,方便后期使用。STM32CubeMX软件比较强大,兼容IAR和keil方便直接生成代码文件,但相关的库不熟悉,好东西用起来较苦恼。
ADC是STM32的一大外设资源,可以方便数据采集。但ADC的调用和ADC采集的方式较多,暂时列出常用的使用方法。
Scan Conversion Mode:ADC的采集通道很多,其支持单通道采集和多通道采集。多通道数据采集时,需要选择此标签为Enable,才能采集扫描其他的数据通道。
Continuous Scan Conversion Mode:ADC采集时如果采集一次就停止,则选择Disable;如果需要周期性的连续的采集数据,则选择Enable。
DMA Continuous Requests:当需要选择DMA进行数据转运时,需要关注此标签,选择Enable,表示DMA通道数据转运完成后,继续请求dma进行数据转运,相当于连续转运。
一、ADC获取数据的方式
ADC完成数据采集后,有两种方式进行获取结果,第一种轮询方式,此原理是ADC采集完成后,MCU查询采集完成状态,之后获取采集结果。此种方式因MCU需要等待采集完成,因此较耗费资源;第二种方式是DMA方式,当ADC采集完成后,DMA处理器将结果转运到内存中,我们直接访问内存即可获取结果,应用较广泛,MCU该干啥干啥,不占用资源。第三种方式是中断,因我不常用就不详述。
二、ADC轮询采样:
2.1设置时钟,因我的硬件是采用外置8M晶振。因此选择如下:
2.2 选择串口调试模式
2.3 设置系统主频为72M
2.4 设置ADC输入管脚,本人硬件上是ADCIN4单通道采集,所以选择如下:
Clock为8分频,因ADC采集最高速率不应超过14M的限制。
2.5 Rank的采样时间尽可能长些,这样会准一些。本文设置为92.5cycles。
2.6 之后即可生成代码。在自己写的代码中调用以下函数可以实现周期性的轮询adc的结果。
三、ADC+DMA采样:
设置时钟等就不在赘述,在此直接上关键设置。
3.1 DMA的设置,mode 改为circular,可以周期性的循环搬运数据。
3.2 adc的设置 continueous conversion mode 需要改为enable,才能adc连续采集;dma continuous requests改为enable,dma才能连续搬运数据。
3.3 生成代码,程序中增加如下函数即可。
四、ADC+DMA+定时器采样:
设置时钟等就不在赘述,在此直接上关键设置。
4.1 设置tim3,定时周期为(14400)*50000/72M=10s
4.2 adc触发选择tim3,连续转换模式必须关闭,等待定时器触发
4.3 生成代码后,主函数中调用如下函数即可