STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项
keil開發(fā)L0系列是免費(fèi)的,官方提供許可的。因此建議Keil開發(fā),
L011F3由于flash只有8K,因此不建議HAL庫,建議使用cubemx+LL(或snippets庫)。
0、起初,可以參考官方庫中自帶的例程,有LL例程,MIX(LL+HAL混合)例程,HAL例程,snippets(基于L053)例程。
建立自己的工程,如果不太熟悉L0系列,可以使用cubemx來進(jìn)行配置,生成最基本的工程模板,然后可以再結(jié)合例程,移植到工程當(dāng)中,
1、使用cubemx新建LL庫的基本例程,可以把GPIO+UART的配置可以完成。
2、LL庫中有ADC_MultiChannelSingleConversion的例程,目錄在\STM32Cube_FW_L0_V1.11.0\Projects\NUCLEO-L073RZ\Examples_LL\ADC\ADC_MultiChannelSingleConversion\,這個(gè)開發(fā)板的例程最多了。
例程中使用ADC+DMA采樣一路外部引腳+vref+tsen,自己可以修改為采集兩路外部引腳。
3、例程中有adc+dma的中斷處理,我們可以暫時(shí)不用,先完成兩路采集,因此方案有:單次轉(zhuǎn)換模式,連續(xù)轉(zhuǎn)換模式 可以完成。
4、具體的配置可以參考LL例程,首先以單次轉(zhuǎn)換模式為例,使用systick作為系統(tǒng)的定時(shí)器,每隔10ms開啟一次ADC軟件轉(zhuǎn)換,同時(shí)在adc配置中使用LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_SINGLE);
注意,不需要關(guān)閉ADC轉(zhuǎn)換開關(guān),mcu在一次轉(zhuǎn)換完成后,硬件自動(dòng)關(guān)閉轉(zhuǎn)換的。具體可以參考《基于超低功耗 STM32L0x3 高級 ARM ? 的32 位 MCU》參考手冊的ADC部分——14.5.5 時(shí)序圖示例(單次/ 連續(xù)模式硬件/ 軟件觸發(fā))內(nèi)容,有詳細(xì)的時(shí)序圖,參考手冊有中文版。
這樣,每次轉(zhuǎn)換完,DMA搬運(yùn)兩路AN的數(shù)據(jù),串口顯示數(shù)據(jù)。不用擔(dān)心數(shù)據(jù)搬運(yùn)不及時(shí),DMA的搬運(yùn)數(shù)據(jù)是很快的,ADC采樣速率也是很快的,10ms打開一次軟件轉(zhuǎn)換,不會(huì)導(dǎo)致數(shù)據(jù)溢出。只不過存放ADC值的數(shù)組,內(nèi)容會(huì)經(jīng)常被DMA覆蓋為最新值。
5、以連續(xù)轉(zhuǎn)換模式為例,初始化中,就開啟軟件轉(zhuǎn)換,且使用LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_CONTINUOUS);連續(xù)轉(zhuǎn)換模式。這樣ADC等系統(tǒng)運(yùn)行后,一直采樣,DMA一直搬運(yùn)數(shù)據(jù)。
6、總結(jié),stm32L0針對兩種方法都可以輕松應(yīng)對,相比較而已,每10ms打開一次軟件轉(zhuǎn)換,相對來說比較低功耗。實(shí)際應(yīng)用中,都可以應(yīng)用兩種ADC多通道采樣方案。
7、cubemx導(dǎo)出的工程實(shí)例中,preprocessor symbols會(huì)自動(dòng)添加如下宏定義:
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工程中,會(huì)自動(dòng)加載flash算法,iar也會(huì)加載icf文件,工程不大,可以自己根據(jù)導(dǎo)出的模板,重新建立一個(gè)工程。
9、KEIl中最好選中C99模式。IAR中自動(dòng)選擇C11模式。
10、生成HEX文件,兩個(gè)IDE均需手動(dòng)選擇生成,否則僅僅編譯而已。其他配置基本是默認(rèn)即可。
11、在LL庫中,stm32l0xx_ll_utils.h和core_cm0plus.h文件中都定義了__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
兩者IDE通過層層調(diào)用,首先調(diào)用stm32l0xx_ll_utils.h文件中的SysTick_Config函數(shù),而這個(gè)函數(shù)中,是沒有開啟SysTick_CTRL_TICKINT_Msk的。因此和core_cm0plus.h是有所區(qū)別的。
!!而HAL庫會(huì)直接調(diào)用core_cm0plus中的SysTick_Config,因?yàn)橥獠繘]有實(shí)現(xiàn),會(huì)默認(rèn)使用系統(tǒng)內(nèi)核core_cm0plus.h的SysTick_Config函數(shù)
#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 <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屬性去掉只讀,修改函數(shù)和core_cm0plus.h一樣,開啟中斷使能,如此一來可以用systick定時(shí)器,做一個(gè)基本的延時(shí)函數(shù)。同時(shí)可以用systick實(shí)現(xiàn)時(shí)間片的框架。
void Delay_ms(__IO uint32_t nTime)
{
TimingDelay = nTime;
while (TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
注意事項(xiàng)。stmL0的ADC一定要進(jìn)行自校準(zhǔn),否則采樣出來的值是不準(zhǔn)確的。
轉(zhuǎn)載于:https://www.cnblogs.com/CodeWorkerLiMing/p/10477104.html
總結(jié)
以上是生活随笔為你收集整理的STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有没有哪位网友知道什么软件可以查看国标电
- 下一篇: 颙琰怎么读