如果在提供的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为例,给出相应的配置及注意事项说明,仅供参考。
打开oneos\projects\xxxxx(project文件夹)\board\CubeMX_Config下的STM32CubeMX工程文件,按照具体的需求进行配置,以下示例均以万耦一代开发板为例:
ADC单通道模式下,可以开启多个ADC,但是每个ADC只能打开一个通道,如打开了三个ADC,按照ADC1、ADC2、ADC3的顺序进行注册,每个ADC的通道对外为ADC设备的0、1、2通道,可以开启一个或者多个ADC,注册顺序一致。 配置ADC通道,并配置ADC通道参数:
注意事项:
单ADC多通道模式只支持ADC1,因为STM32的多个系列的ADC并不一致,部分较早的系列只支持ADC1作为主ADC使用,拥有唯一DMA,为兼容全系列做此限定。此模式下顶层adc设备的有效通道值为ADC配置通道数量,顺序为RANK中定义的顺序。
配置注意事项:
配置注意事项:
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多通道模式至少要包含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的转换缓存中的数据和通道不是唯一确定的,读数不稳定,需要在配置时保证,程序不进行相应的维护。
注意事项:
注意事项:
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多通道模式下存在转换顺序问题,请注意转换的通道的实际顺序是和用户配置紧密相关
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