zoukankan      html  css  js  c++  java
  • 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.0ProjectsNUCLEO-L073RZExamples_LLADCADC_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)

    /**
    rief 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.
    eturn 0 Function succeeded.
    eturn 1 Function failed.
    ote When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
    function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
    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一定要进行自校准,否则采样出来的值是不准确的。

  • 相关阅读:
    【Django总结】Django警告Not Found: /favicon.ico
    【性能学习】Windows自带性能监控工具perform
    【Linux学习】定时任务和后台运行相关命令
    【Python学习】Python 写Windows Service服务程序
    【Django总结】ORM
    【Python学习】Python requests.post方法中data与json参数区别
    【Pycharm学习】Pycharm散记
    【Pycharm学习】离线安装插件
    【Mysql学习】索引操作
    [HG]奋斗赛G
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/10477104.html
Copyright © 2011-2022 走看看