ADC设备用户开发
基础BSP配置--以STM32为例
工程及使用说明
如果在提供的OneOS源码中已经有适合的工程DEMO工程,则可以直接使用;如果没有请参照快速上手中的操作指南,新建一个合适的工程。 针对STM32的ADC多个系列区别较大的情况,驱动设计时只进行了基本的ADC支持,包括ADC单通道模式、单ADC多通道扫描模式、多ADC多通道扫描模式。如有其他使用需求,客户可参考进行修改或者定制。
注意事项:
ADC单通道模式只支持每个ADC只有一个通道的使用;
多个ADC多通道使用时仅支持规则通道扫描,必须打开DMA使用,同时主ADC1必须使用,否则该模式没有意义!
特别注意!!!!!
不同系列的情况不尽相同,如果需要采集多通道数据,建议使用单ADC多通道模式,同时建议使用循环模式,不要频繁开关ADC,避免可能的ADC通道顺序异常问题,因不同系列的区别较大,请谨慎使用该拓展功能。
针对1、2的情况设备注册时进行了合并,对外只提供一个ADC设备:1模式中通道0对应ADC1;2通道对应ADC2……;2模式中不论开通通道数量,按照STM32的数据映射规则,进行数据和通道映射,使用时需要自己清楚配置后的数据顺序;0通道对应第一个数据,1通道对应第二个数据……;
ADC的通道号需要使用者保证,数据的对应关系使用者要自己根据配置去获得;内部提供了调试的的宏定义方式,使用者可以根据数据情况判断配置是否符合预期(ADC的配置较为多样,但目前系统支持有限,请按规则使用);
ADC多通道模式下的通道转换时间不要设定的太小,测试在1.5周期下会出现DMA处理不过来的情况,长时间运行导致溢出错误;(主要原因:DMA的优先级是低于指令读取等FLASH操作的,响应不过来就会触发QVRN错误)
ADC的多重模式需要注意各个系列不同,部分系列不支持三重模式,甚至于不支持双重模式,具体请参考芯片手册或者STM32CubeMX的配置。
ADC仅支持10、12、14、16位模式,以及右对齐方式!多个ADC必须保证ADC的数据宽度一致;
ADC的位数宽度会根据配置自动识别,但是参考电压在注册(drv_adc.c)时直接设定,不再动态修改;
不同系列的配置差异并不能全部列出,使用时请参考ST官方的教程和用例,保证ADC的模式配置是正确的,以下仅以万耦一代开发板使用的STM32L475VGT6为例,给出相应的配置及注意事项说明,仅供参考。
STM32CubeMX配置
打开oneos\projects\xxxxx(project文件夹)\board\CubeMX_Config下的STM32CubeMX工程文件,按照具体的需求进行配置,以下示例均以万耦一代开发板为例:
ADC单通道模式
ADC单通道模式下,可以开启多个ADC,但是每个ADC只能打开一个通道,如打开了三个ADC,按照ADC1、ADC2、ADC3的顺序进行注册,每个ADC的通道对外为ADC设备的0、1、2通道,可以开启一个或者多个ADC,注册顺序一致。 配置ADC通道,并配置ADC通道参数:
- Analog标题下是模拟外设信息,选择ADC外设;
- Mode标题下是通道信息,选择通道模式;
- Configuration->Parameter->ADCs_Common_Settings: 设置ADC共用的通用设置,请根据实际使用正确设置。
- Configuration->Parameter->ADC_Settings: 主ADC1的常规ADC参数设置,请根据实际使用正确设置。
- Configuration->Parameter->ADC_Regular_ConversionMode: 常规ADC通道参数设置,请根据实际使用正确设置。
- 右侧的芯片示意图上根据需要配置硬件引脚;
注意事项:
- 扫描模式配置必须把扫描模式,连续转换模式等全部关闭,否则会导致ADC异常,详细的配置可以参考ST官方教程或用例。
- 此模式下ADC工作在阻塞模式下,每次获得数据都会等待ADC转换完成但会数值。
- 其他可选参数配置,如转换时间,模拟看门狗,矫正电压等,自行根据需要进行配置。
单ADC多通道模式
单ADC多通道模式只支持ADC1,因为STM32的多个系列的ADC并不一致,部分较早的系列只支持ADC1作为主ADC使用,拥有唯一DMA,为兼容全系列做此限定。此模式下顶层adc设备的有效通道值为ADC配置通道数量,顺序为RANK中定义的顺序。
主ADC配置
配置注意事项:
- Configuration->Parameter->ADCs_Common_Settings->Mode = Independent mod: 将ADC配置为独立模式,此时不共用DMA;
- Configuration->Parameter->ADC_Settings: 此项配置为ADC的基本配置,针对扫描模式需要注意打开图中的Scon Conversion Mode、Countinuous Conversion Mode、DMA Continuous Requests;部分设置是和通道数相关的,需根据Configuration->Parameter->ADC_Regular_ConversionMode中RANK配置的通道数量才能进行设置;
- Configuration->Parameter->ADC_Regular_ConversionMode: 配置ADC的通道参数,包括通道的数量和顺序,每个通道的转换时间等参数,根据需要自行配置。
DMA配置
配置注意事项:
DMA Request Settings中的Mode配置,Normal为单次模式,Circular为循环模式;Data Width中的两项都设置为Half Word( 不能配置错误! );
Circular模式下,如果ADC的转换速度过快,如ADC时钟过快,转换周期过短可能会导致ADC数据无法及时通过DMA转移,会导致OVR错误,将会导致ADC停止工作。此时会给出错误提示,不进行自主恢复。解决该问题的方法: i、在Clock Configuration中修改ADC的输入频率(此方法不推荐使用); ii、在Configuration->Parameter->ADC_Settings中设置Clock Prescaler,增大分频系数(优先考虑此方法); iii、在Configuration->Parameter->ADC_Regular_ConversionMode中配置Sampling Time,增加ADC通道的转换时间(根据实际应用的要求进行配置)。
配置为Circular模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为开启状态;
Normal模式下,每次要刷新数据必须先调用一次os_device_open指令打开设备,经过设定的转换时间后会更新出数据,此时客户能够去获得数据(不建议使用该模式,该模式不提供转换完成的自动处理,但提供转换完成的中断回调,客户需要自己注册中断回调函数进行管理,如当前是否完成数据转换等);
配置为Normal模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为关闭状态;
循环模式下,请不要尝试多次调用设备打开指令,此时会直接返回错误,设备无法打开,因为底层ADC一直处于运行状态,不能重复打开;
多ADC多通道模式
多ADC多通道模式至少要包含ADC1,因为STM32的多个系列的ADC并不一致,部分较早的系列只支持ADC1作为主ADC使用,拥有唯一DMA,为兼容全系列做此限定。此模式下顶层adc设备的有效通道值为ADC数量乘上最大配置通道数量的两倍,顺序为RANK中定义的顺序结合ADC的数量配置得到,参考下图:
注意事项:
ADC的多重模式作为拓展功能,使用时必须保证以下关系:ADC的开启数量和ADC的通道数量最大值满足一定的关系,能够实现完整的循环转换,否则数据会位置不固定。示例:如果是双重ADC模式,ADC1开启3个通道,ADC2开启2个通道,那么实际启用DAM时会设置一个2(ADC数量)*3(单个ADC通道的最大值)*2共计12的缓存空间,数据顺序为:1.1--2.1--1.2--2.2--1.3--2.1--1.1--2.2--1.2--2.1--1.3--2.2;此时能够完成循环,数据准确稳定。如果是三重ADC模式,如果ADC1开启2个通道,ADC2和ADC3各开启3个通道,此时会出现3*3*2共计18个缓存,此时会出现不能按照途中的顺序完成整周期转换,那么数据会出现循环错位,ADC1的转换缓存中的数据和通道不是唯一确定的,读数不稳定,需要在配置时保证,程序不进行相应的维护。
ADC及DMA配置
注意事项:
- 多ADC使用时先完成每个ADC的基础配置,如ADC_Settings、ADC_Regular_ConversionMode等; 再进行部分通用配置,如DMA相关的配置,否则会出现无法进行选择的情况;
- 多个ADC配置完成后,修改Configuration->Parameter->ADCs_Common_Settings中的Mode,根据使用的是双重还是三重ADC模式进行配置;DMA Access Mode 必须选择为DMA access mode enabled,才能打开共用DMA模式;
- 在主ADC1的Configuration->Parameter->ADC_Settings中根据通道数配置相关的扫描选项,并把DMA Continuous Requests打开。
注意事项:
DMA Request Settings中的Mode根据需要进行配置,Normal为单次模式,Circular为循环模式;Data Width中的两项都设置为Word;
不同系列的ADC多重模式差异,部分系列不支持ADC三重模式,甚至不支持双重模式,此时不能使用该模式。
Circular模式下,如果ADC的转换速度过快,如ADC时钟过快,转换周期过短可能会导致ADC数据无法及时通过DMA转移,会导致OVR错误,将会导致ADC停止工作。此时会给出错误提示,不进行自主恢复。解决该问题的方法: i、在Clock Configuration中修改ADC的输入频率(此方法不推荐使用); ii、在Configuration->Parameter->ADC_Settings中设置Clock Prescaler,增大分频系数(优先考虑此方法); iii、在Configuration->Parameter->ADC_Regular_ConversionMode中配置Sampling Time,增加ADC通道的转换时间(根据实际应用的要求进行配置)。
配置为Circular模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为开启状态;
Normal模式下,每次要刷新数据必须先调用一次os_device_open指令打开设备,经过设定的转换时间后会更新出数据,此时客户能够去获得数据(不建议使用该模式,该模式不提供转换完成的自动处理,但提供转换完成的中断回调,客户需要自己注册中断回调函数进行管理,如当前是否完成数据转换等);
配置为Normal模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为关闭状态;
循环模式下,请不要尝试多次调用设备打开指令,此时会直接返回错误,设备无法打开,因为底层ADC一直处于运行状态,不能重复打开;
多ADC多通道模式下存在转换顺序问题,请注意转换的通道的实际顺序是和用户配置紧密相关
配置和生成工程
- 点击Clock Configuration检查时钟配置,然后点击GENARATE CODE生成STM32CubeMX工程代码;
- 在对应的oneos\projects\xxxxx(project文件夹) 目录下打开OneOS-Cube工具,在命令行输入menuconfig打开可视化配置界面;
- 如下图示,通过空格或向右方向键选择 Top) → Drivers→ MISC 下的 Using ADC device drivers 选项;
Top) → Drivers→ MISC OneOS Configuration [*] Using generic GPIO device drivers [*] Using push button device drivers [*] Using led device drivers [ ] Using buzzer device drivers [*] Using ADC device drivers [ ] Using DAC device drivers [ ] Using PWM device drivers [ ] Using Input Capture device drivers [ ] Using Pulse Encoder device drivers
- 通过Esc退出配置界面,退出时选择保存。
- 在命令行输入scons --ide=mdk5命令,构建工程;
工程编译及实现
- 打开对应的oneos\projects\xxxxx(project文件夹)目录下的project.uvprojx工程文件;
- 在工程中将原有或自己编写的adc test文件加入到application子文件夹中;
- 编译并下载工程,运行程序;
- 打开串口工具如xshell等,通信成功后,即可通过输入adc_sample指令获得相关的调试指令,根据提示和设置进行输入和ADC测试;
- 通过硬件调节电压,即可观察到不断回读ADC采样电压值(电压值单位mv);