900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > stm32cubeide 多通道adc_STM32L0开发——ADC多通道采集 IDE和IAR开发注意事项

stm32cubeide 多通道adc_STM32L0开发——ADC多通道采集 IDE和IAR开发注意事项

时间:2021-11-06 10:04:34

相关推荐

stm32cubeide 多通道adc_STM32L0开发——ADC多通道采集 IDE和IAR开发注意事项

keil开发L0系列是免费的,官方提供许可的。因此建议Keil开发,

L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库)。

0、起初,可以参考官方库中自带的例程,有LL例程,MIX(LL+HAL混合)例程,HAL例程,snippets(基于L053)例程。

建立自己的工程,如果不太熟悉L0系列,可以使用cubemx来进行配置,生成最基本的工程模板,然后可以再结合例程,移植到工程当中,

1、使用cubemx新建LL库的基本例程,可以把GPIO+UART的配置可以完成。

2、LL库中有ADC_MultiChannelSingleConversion的例程,目录在\STM32Cube_FW_L0_V1.11.0\Projects\NUCLEO-L073RZ\Examples_LL\ADC\ADC_MultiChannelSingleConversion\,这个开发板的例程最多了。

例程中使用ADC+DMA采样一路外部引脚+vref+tsen,自己可以修改为采集两路外部引脚。

3、例程中有adc+dma的中断处理,我们可以暂时不用,先完成两路采集,因此方案有:单次转换模式,连续转换模式 可以完成。

4、具体的配置可以参考LL例程,首先以单次转换模式为例,使用systick作为系统的定时器,每隔10ms开启一次ADC软件转换,同时在adc配置中使用LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_SINGLE);

注意,不需要关闭ADC转换开关,mcu在一次转换完成后,硬件自动关闭转换的。具体可以参考《基于超低功耗 STM32L0x3 高级 ARM ® 的32 位 MCU》参考手册的ADC部分——14.5.5 时序图示例(单次/ 连续模式硬件/ 软件触发)内容,有详细的时序图,参考手册有中文版。

这样,每次转换完,DMA搬运两路AN的数据,串口显示数据。不用担心数据搬运不及时,DMA的搬运数据是很快的,ADC采样速率也是很快的,10ms打开一次软件转换,不会导致数据溢出。只不过存放ADC值的数组,内容会经常被DMA覆盖为最新值。

5、以连续转换模式为例,初始化中,就开启软件转换,且使用LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_CONTINUOUS);连续转换模式。这样ADC等系统运行后,一直采样,DMA一直搬运数据。

6、总结,stm32L0针对两种方法都可以轻松应对,相比较而已,每10ms打开一次软件转换,相对来说比较低功耗。实际应用中,都可以应用两种ADC多通道采样方案。

7、cubemx导出的工程实例中,preprocessor symbols会自动添加如下宏定义:

keil版本

USE_FULL_LL_DRIVER,HSE_VALUE=8000000,HSE_STARTUP_TIMEOUT=100,LSE_STARTUP_TIMEOUT=5000,LSE_VALUE=32768,MSI_VALUE=2097000,HSI_VALUE=16000000,LSI_VALUE=37000,VDD_VALUE=3300,PREFETCH_ENABLE=0,INSTRUCTION_CACHE_ENABLE=1,DATA_CACHE_ENABLE=1,STM32L011xx

iar版本:

USE_FULL_LL_DRIVER

HSE_VALUE=8000000

HSE_STARTUP_TIMEOUT=100

LSE_STARTUP_TIMEOUT=5000

LSE_VALUE=32768

MSI_VALUE=2097000

HSI_VALUE=16000000

LSI_VALUE=37000

VDD_VALUE=3300

PREFETCH_ENABLE=0

INSTRUCTION_CACHE_ENABLE=1

格式稍许不同

!!别忘记了头文件的路径

8、keil工程中,会自动加载flash算法,iar也会加载icf文件,工程不大,可以自己根据导出的模板,重新建立一个工程。

9、KEIl中最好选中C99模式。IAR中自动选择C11模式。

10、生成HEX文件,两个IDE均需手动选择生成,否则仅仅编译而已。其他配置基本是默认即可。

11、在LL库中,stm32l0xx_ll_utils.h和core_cm0plus.h文件中都定义了__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

两者IDE通过层层调用,首先调用stm32l0xx_ll_utils.h文件中的SysTick_Config函数,而这个函数中,是没有开启SysTick_CTRL_TICKINT_Msk的。因此和core_cm0plus.h是有所区别的。

!!而HAL库会直接调用core_cm0plus中的SysTick_Config,因为外部没有实现,会默认使用系统内核core_cm0plus.h的SysTick_Config函数

#if (__Vendor_SysTickConfig == 0U)

/**

\brief System Tick Configuration

\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.

Counter is in free running mode to generate periodic interrupts.

\param [in] ticks Number of ticks between two interrupts.

\return 0 Function succeeded.

\return 1 Function failed.

\note When the variable__Vendor_SysTickConfigis set to 1, then the

functionSysTick_Configis not included. In this case, the filedevice.h

must contain a vendor-specific implementation of this function.

*/

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

{

if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)

{

return (1UL); /* Reload value impossible */

}

SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */

NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */

SysTick->VAL = 0UL; /* Load the SysTick Counter Value */

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk |

SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */

return (0UL); /* Function successful */

}

12、因此在我的工程中,使用LL库,把stm32l0xx_ll_utils.h属性去掉只读,修改函数和core_cm0plus.h一样,开启中断使能,如此一来可以用systick定时器,做一个基本的延时函数。同时可以用systick实现时间片的框架。

void Delay_ms(__IO uint32_t nTime)

{

TimingDelay = nTime;

while (TimingDelay != 0);

}

void TimingDelay_Decrement(void)

{

if (TimingDelay != 0x00)

{

TimingDelay--;

}

}

注意事项。stmL0的ADC一定要进行自校准,否则采样出来的值是不准确的。

STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)

一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:/qq_24815615/arti ...

第30章 &Tab;ADC—电压采集—零死角玩转STM32-F429系列

第30章 ADC—电压采集 全套200集视频教程和1000页PDF教程请到秉火论坛下载: 野火视频教程优酷观看网址:/fireg ...

EFM32在使用IAR开发环境配置ICf文件以及指定程序存储地址空间

EFM32在IAR开发环境下指定代码,数据的存储空间 为了便于后续的项目升级,管理,需要对代码,数据的存储空间加以设定,也在网上找下相关的资料,笔者水平有限, 如下内容不一定完全正确,如有错误之后,还 ...

Hi3518EV200平台ADC多通道采样

Hi3518EV200平台ADC多通道采样流程 Hi3518EV200 ADC 本文针对Hi3518EV200平台处理器,通过ADC单次采样方式,实现对多通道(1~4通道)ADC进行采样控制.本文仅仅 ...

scala IDE for Eclipse开发Spark程序

1.开发环境准备 scala IDE for Eclipse:版本(4.6.1) 官网下载:http://scala-/download/sdk.html 百度云盘下载:链接:http: ...

STM32 ADC多通道转换

描述:用ADC连续采集11路模拟信号,并由DMA传输到内存.ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ.在每次转换结束后,由DMA循环将转换的数据传输到内存中.ADC可以连续采集N ...

STM32开发(一):简介及开发环境

1. 背景 STM32是意法(ST)公司开发的基于ARM Cortex-M系列的一系列微控制器(MCU). 有两种库 标准外设库(StdPeriph_Driver.Standard Periphera ...

Android游戏开发实践&lpar;1&rpar;之NDK与JNI开发02

Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

随机推荐

【codeforces 749E】 Inversions After Shuffle

/problemset/problem/749/E(题目链接) 题意 给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l.对连续段重新进行等概率 ...

java中Set&comma;Map&comma;Stack一些简单用法

import java.util.Iterator; import java.util.Stack; import java.io.*; import java.util.Set; import ja ...

hashMap的数据结构

HashMap底层实现还是数组,只是数组的每一项都是一条链.

sql datetime操作

Sql Server中的日期与时间函数 SQL中的时间函数非常有用,特别是在我们进行初始赋值.复杂查询的时候,就显得特别方便. 1.获得系统当前时间 select getdate() 2.DateN ...

web classpath 路径说明

classpath路径在每个J2ee项目中都会用到,即WEB-INF下面的classes目录,所有src目录下面的java.xml.properties等文件编译后都会在此,所以在开发时常将相应的xm ...

Dynamic Animator 、 CollectionViewLayout

1 给视图添加重力效果 1.1 问题 当给某个视图加上UIGravityBehavior重力行为之后,这个视图就具有重力,会如同掉入了无底洞,不断地下坠,不断的加速,本案例使用UIGravityBeh ...

XML巩固

一.XML基础 1.XML区分大小写, 2.XML属性值必须有引号(单引双引均可) 3.XML必须有根元素 4.一些特殊字符的需要用实体引用来替换 < < 小于 > > 大于 ...

Oracle历史记录

请问如何查询ORACLE的历史操作记录!!!!!------解决方案-------------------- 有一个专门存储操作的数据库表..select t.SQL_TEXT, t.FIRST_LO ...

win10 uwp 车表盘 径向规

车表盘就是有刻度的圆盘加上针,这个控件可以直观让用户知道当前的速度或其他 看名字不知道是什么,我就放一张图 使用很简单,在Nuget,Radial Gauge 要使用大神做的,简单,在使用我们需要在N ...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。