標(biāo)題: Nucleo-L031K6評(píng)測(cè) 硬件和軟件實(shí)驗(yàn) [打印本頁(yè)]

作者: 51hei大小    時(shí)間: 2016-6-17 17:17
標(biāo)題: Nucleo-L031K6評(píng)測(cè) 硬件和軟件實(shí)驗(yàn)
昨天收到蘇柚的評(píng)測(cè)通知,想必將要收到的板子應(yīng)該是NUCLEO-L031K6吧。昨天找到nucleo-L031的官網(wǎng),下了幾個(gè)資料!綨UCLEO-L031K6官網(wǎng)頁(yè)面】個(gè)人在意的有幾個(gè)資料:
1、【硬件手冊(cè)】 只有看懂硬件連接,才能更好的理解板子的設(shè)計(jì)和引腳的目的。
2、【Bom表】更簡(jiǎn)潔的告訴板子中涉及的芯片
3、【STM32L0系列產(chǎn)品列表】這個(gè)表告訴你一些事實(shí)就是L0X1的產(chǎn)品不帶USB等,稍后我再說(shuō)明。
4、【L31K6芯片主頁(yè)】請(qǐng)瀏覽這個(gè)主頁(yè)下載相關(guān)手冊(cè),比如這個(gè)【芯片數(shù)據(jù)表】
5、【cubeL0主頁(yè)】對(duì)于HAL庫(kù)編程的用戶cubeL0是必須的!綾ubeL0下載頁(yè)】
6、【ST-Link V2下載地址】這個(gè)想必大家都有


資料準(zhǔn)備好,之后又幾個(gè)概念需要先Highlight一下:
1、時(shí)鐘頻率最大32MHZ,內(nèi)核M0+
2、芯片封裝是LQFP32,不帶USB接口
3、帶一個(gè)LPUART接口,LPTIM接口
4、PA0口是完全的,從PA0-PA15
5、Flash:32K, RAM:8K ,EPROM:1K
6、SPI、I2C、UART、TIM等
7、自帶RTC晶振
8、ST-Link和nucleo64的主芯片毫無(wú)差別,還是芯片STM32F103CBT6來(lái)一張框圖表示一下這個(gè)產(chǎn)品的概況:


關(guān)于這個(gè)產(chǎn)品,我覺(jué)得最可惜的是不帶主芯片USB接口,這個(gè)也是幾乎所有nucleo的遺憾。對(duì)于nucleo64來(lái)說(shuō),芯片盡管沒(méi)有焊接出USB接口,好歹芯片是支持的。另外這些引腳也引出來(lái)了?墒菍(duì)于這個(gè)芯片就很遺憾了。因?yàn)楦緵](méi)有呀。那么后期有沒(méi)有那種可能性來(lái)更換測(cè)試芯片吶。請(qǐng)看下圖:


和下圖:

再結(jié)合我在上面提供的產(chǎn)品列表,你會(huì)發(fā)現(xiàn)F0522:都有LQFP32 7*7*1.4封裝。估計(jì)多數(shù)引腳也是兼容的,關(guān)于這一點(diǎn),后期還需要確認(rèn)一下。
所以應(yīng)該可以添加USB接口。
但是這仍然不夠完美,如果在后期的產(chǎn)品中不是一味的兼容Arduino的引腳,添加一些STM32真正有優(yōu)勢(shì)的接口,那樣會(huì)更好。這是我在nucleo身上一直以來(lái)的遺憾。你可能會(huì)說(shuō),USB有什么大不了的。我告訴你,我本來(lái)想用這家伙做個(gè)邏輯分析儀和hacker硬件。想一想,把這個(gè)設(shè)備偽裝成一個(gè)USB-HID設(shè)備,插到電腦上很easy的做一些操作,那又多酷。哎,只能說(shuō): What a pity!
但是沒(méi)事,STM32已經(jīng)給我們準(zhǔn)備好了芯片,其它的就靠我們自己了。

在開(kāi)始之前,硬件手冊(cè)需要細(xì)細(xì)研究一番。但是幸運(yùn)的是板子小,元件也并不太多。
在電路分許中,我意向的原則是先看電源,再看時(shí)鐘和燒錄接口,最后看外圍元件和接口。
這次也不例外,開(kāi)始了解一下電源吧。我一直認(rèn)為Nucleo的電源設(shè)計(jì)堪稱典范。我用簡(jiǎn)略的圖示來(lái)表示電源的流向。
VIN -->--> E5V -->]       [--->-->+3V3_ST_LINK{ST-Link主芯片U5供電}
                                                ]-->[
                        Vusb-->U5V-->]      [--->----->U5V_ST_LINK--->]
                                                                                                                         ]---> -->VO-->+3V3-->-->VDD-->磁珠->AVDD
                                                                                                             E5V -->]                                                        |
                                                                                                                                                                                 |/[目標(biāo)芯片U2供電]
因?yàn)榘婷嫦拗茮](méi)有提到+5V的位置,但是大家一看原理圖便知。大致可以從這個(gè)引腳對(duì)外輸出+5V

通常情況下電源的輸入位VIN和Vusb(micro-usb端口)。當(dāng)通過(guò)ST-LINK調(diào)試時(shí)由Vusb提供整個(gè)片子的電源。也可以從提供外部提供電壓范圍較廣的電源。大致范圍參考LD1117S50TR 可知為。而同樣是是5V轉(zhuǎn)3.3V卻使用LD39050PU33R和LD3985M33R兩塊芯片。這各種的緣故需要看芯片手冊(cè)確定。前者的最大電流是500ma,后者是150ma。像平時(shí)我做設(shè)計(jì)時(shí),一般就選大的。人家這是能省則省,這就是專業(yè)精神。當(dāng)然更有可能是省板子空間吧,哈哈~~~肖特基二極管也使用了兩款:STPS2L30A和BAT60JFILM兩款芯片。應(yīng)該也是基于電流、耐壓和體積的考量吧。(PS:手冊(cè)上的電流很奇怪)
另一點(diǎn)是ST-LINK的主芯片引腳PB15上連接的芯片,這次改變了。之前是個(gè)mos管,這次是一款名字為ST890CDR的芯片。這是一款官網(wǎng)稱作1.2 A current limited high side power switch with thermal shutdown的過(guò)熱保護(hù)電源開(kāi)關(guān)。應(yīng)該比之前一個(gè)簡(jiǎn)單的mos管要安全一些。

另外板子上用到的所有芯片(我沒(méi)有一個(gè)一個(gè)查)應(yīng)該都是ST生產(chǎn)的,這里要給意法半導(dǎo)體豎起大拇指。

這里先簡(jiǎn)單的做個(gè)大體了解,靜等板子到吧。


一、硬件分析
1.1 老生常談之一觸即發(fā)話說(shuō)三月七號(hào),快遞小哥送來(lái)了期待已久的小板子。
這是逛ST論壇近一年收到的第一塊板子,甚是激動(dòng)。
先上一張為拆裝的圖,盒子還是經(jīng)典的nucleo塑料盒子的包裝。甚是簡(jiǎn)介,可是不知這包裝能不能講解。好歹,咱nucleo也該有幾十萬(wàn)套發(fā)給用戶吧。

包裝的大小相對(duì)于傳統(tǒng)的nucleo64沒(méi)有太大的變化,后來(lái)才發(fā)現(xiàn)這樣做的原因可能是為了展示外包裝上的信息吧。
但還好在評(píng)測(cè)之前已經(jīng)提前了解了這塊板子,詳見(jiàn)我的上一篇帖子【寫在評(píng)測(cè)之前】。
這樣我就可以理性的評(píng)測(cè)這塊板子。首先是看看板子的大小。
有人說(shuō)這筆arduino的nano還小,不行的是我手邊是一個(gè)國(guó)產(chǎn)的nano。請(qǐng)看一下大小,不知道官方的大小如何。

但是,老實(shí)說(shuō)nucleo可是提供仿真調(diào)試的好吧。nano只有一個(gè)ft232虛擬出來(lái)的串口,除了能夠燒寫似乎沒(méi)什么用處。
從pcb板子的質(zhì)量上,nucleo的設(shè)計(jì)制造難度不是一丁點(diǎn)。
在上一張和硬幣比大小的圖片,你就看出到底nucleo有多小
。
看見(jiàn)沒(méi),比五毛錢小多了。我可沒(méi)用什么五毛錢的特效。這是貨真價(jià)實(shí)的小。
在盒子的包裝上印有mbed或者說(shuō)arduino nano的接口信息,請(qǐng)看:

我確認(rèn)是一樣的,所以設(shè)計(jì)者為了兼容簡(jiǎn)單架構(gòu)的avr也是蠻拼的。但是這里有一個(gè)問(wèn)題是,為什么非要兼容Arduino的nano吶。
如果你注意瞧,你就會(huì)發(fā)現(xiàn)D0,D1和D3/4/5...什么的不在一起,而且順序是反的。想必這也是當(dāng)年avr為了兼容之前的做出的妥協(xié)。咱完全不用這樣做。畢竟mbed有筆試Arduino,語(yǔ)法的復(fù)雜性和易用性都不在一個(gè)檔次。
老實(shí)說(shuō),這些年STM32如果做一個(gè)調(diào)查就會(huì)發(fā)現(xiàn)我們使用nucleo板用作mbed的設(shè)備比例一定非常少。我們購(gòu)買或者使用nucleo板子的原因是它便宜,簡(jiǎn)單易用。就像Discovery的板子,我們使用所謂的蝴蝶接口多嗎?
所以說(shuō)我建議ST不放根據(jù)自己芯片和引腳的特色,設(shè)定一套自己的板子接口。這樣更方便開(kāi)發(fā)者學(xué)習(xí)和使用。比如nucleo32/64/144的引腳和芯片特點(diǎn)制定三種引腳規(guī)則。引腳多的可以兼容引腳少的。使用這樣的方式,沒(méi)準(zhǔn)能夠更好的讓用戶掌握STM32獨(dú)特的接口。怎么使用DMA,怎么使用更復(fù)雜的TIM,SDIO,LTDC如何使用。這樣開(kāi)發(fā)者會(huì)根據(jù)接口安排自己的學(xué)習(xí)路徑,會(huì)不會(huì)更好吶?
上面只是我自己的看法,不知道各位蝴蝶粉沒(méi)有何看法?
在講L031K6拿出來(lái)的時(shí)候遇到點(diǎn)小麻煩,據(jù)你所知nucleo64板子比較大,靠?jī)蛇叺目ǹ劭壑鴷r(shí)很容易就能取下。但是nucleo32卻不是,需要從板子的后邊用力,擠壓包裝后才能取出。為此我擅做主張給Nucleo發(fā)了個(gè)紅腰帶。見(jiàn)下圖:
     正面                                            


背面
正面是不是也挺好看,背面很實(shí)用一拉板子就出來(lái)了!緉ucleo的設(shè)計(jì)師別打我】

然后就是連接上電腦了,出現(xiàn)兩個(gè)相關(guān)的設(shè)備枚舉。對(duì)了這次nucleo的USB口換成了micro-B的接口,之前的mini的。micro-B接口的線纜想必大家都不少吧,因?yàn)橹悄苁謾C(jī)在type C之前主要就是這種標(biāo)準(zhǔn)的線。(Type A to micro-B)

另外在磁盤中添加了一個(gè)40kb的空間,應(yīng)該是從f103片子的flash里面劃出來(lái)的。曾經(jīng)有人寫了一篇如何通過(guò)編寫一個(gè)類似nucleo這樣的方式燒寫程序的文章,大家可以搜索一下。個(gè)人覺(jué)得這樣的方式挺好的。在details的文件中還可以看到板子或者固件燒寫的日期。


1.2 板子的設(shè)計(jì)
下面再來(lái)說(shuō)說(shuō)板子的設(shè)計(jì),老實(shí)說(shuō)我最贊嘆的是布線師的技術(shù)。自己平時(shí)線一多就選擇自動(dòng)布線,然后取消布線根據(jù)布線的情況調(diào)整原件位置。接著再自動(dòng)布線,如此反復(fù)之后。再手動(dòng)布置一些主要的線,確認(rèn)設(shè)定的規(guī)則之后再自動(dòng)布線,后期對(duì)一些過(guò)孔和比較奇特的布線手動(dòng)做一些調(diào)整?偢杏X(jué)這樣的方法很不專業(yè)。不知道nucleo的設(shè)計(jì)師是如何搞得。起初我還以為他們會(huì)用六層板什么的,后來(lái)才發(fā)現(xiàn)他們用的是四層板。在官方的PCB圖紙上給出了明確的解釋,請(qǐng)看。

如果你看原理圖還會(huì)發(fā)現(xiàn)在電源層還根據(jù)電源的不同做出了一些分割。我覺(jué)得那些想學(xué)習(xí)繪制板子的,可以從這張圖開(kāi)始。
圖紙給的是用Altium Designer繪制的,這也是許多朋友最初學(xué)習(xí)繪制板子時(shí)用的軟件。PCB板子或者說(shuō)PCB工程做的非常專業(yè),必須多大學(xué)老師用的正規(guī)的多。這套圖的原理圖分成了三張,第一張是總圖用于將兩塊原理圖連接成一張大的原理圖。同時(shí)也讓接口關(guān)系更加明顯。
電源的設(shè)計(jì)也很專業(yè),朋友們注意一下官方對(duì)于電源的劃分和規(guī)則,在上一篇文章中我做了梳理,希望能幫到你。
另外BOM表原件也很全,官方實(shí)際上提供給大家一個(gè)設(shè)計(jì)參考的示例。
這里提供官方資料的下載,為了下到最新的資料,其實(shí)建議大家到官方搜索下載,這樣可以download一些自己需要的。
nucleo-32pins_bom.zip (33.55 KB, 下載次數(shù): 13) nucleo-32pins_sch.zip (2.92 MB, 下載次數(shù): 13)

1.3 芯片架構(gòu)的變化(相對(duì)于自己熟悉的F401)
STM32L031K6是Cotex-M0+的架構(gòu),而F401是Cotex-M4F架構(gòu)。兩者有區(qū)別是正常的。但是拋開(kāi)內(nèi)核不說(shuō)外圍的變化還是很顯著的。下面提供兩兩張來(lái)自官方文檔上的架構(gòu)圖,你會(huì)看出一些明顯的區(qū)別。在下面給給出自己看到的區(qū)別,朋友們還可以給點(diǎn)指點(diǎn),讓我們找出一些其它的變化。
F401框圖

F103框圖



L031框圖


仔細(xì)觀察三幅框圖會(huì)發(fā)現(xiàn)GPIOA/B...等幾個(gè)接口在三種架構(gòu)上的位置不同。
F401在AHB1總線上,F(xiàn)103在APB2上,L031在內(nèi)核上直接相連。這三種連接方式有何區(qū)別,請(qǐng)高手給一個(gè)解釋。
我猜測(cè)直接將L系列單獨(dú)將GPIO摘出來(lái)是低功耗的考慮。我私下里看了一下L476和L162的框圖,發(fā)現(xiàn)這兩者的GPIO端口都很獨(dú)特。請(qǐng)高手給指教一下架構(gòu)設(shè)計(jì)的要點(diǎn)和作用。

1.3 ADC變化說(shuō)明在后面的實(shí)驗(yàn)中我會(huì)用到ADC來(lái)做兩個(gè)實(shí)驗(yàn),所以先要了解一下ADC的架構(gòu)。忽然發(fā)現(xiàn)這里ADC的架構(gòu)還是有些變化的。
[1> 雙時(shí)鐘架構(gòu)]
在L031中ADC可以配置兩個(gè)時(shí)鐘,一個(gè)來(lái)自PCLK,被稱作同步模式,另一個(gè)時(shí)鐘源來(lái)自HSI,稱為異步模式。兩者的時(shí)鐘源都可以分頻,見(jiàn)下圖方便理解。

這兩個(gè)時(shí)鐘源的作用在參考手冊(cè)中有介紹,大致的意思是:
1> 同步模式下ADC模塊的時(shí)鐘是有APB驅(qū)動(dòng)的,在定時(shí)器timer觸發(fā)時(shí)可以保證時(shí)鐘的同步。
2> 異步模式下,不能保證于觸發(fā)源時(shí)鐘的同步,但是可以獲得更高的時(shí)鐘頻率。

1.4 低功耗部分
在外圍接口中有兩個(gè)比較明顯的低功耗接口,那就是LPUART和LPTIM接口。此外M0+的多種工作模式也保證了低功耗。
這里列舉一下L031為了保證低功耗采取的策略。
1、采用動(dòng)態(tài)的電壓定標(biāo)策略:
                                    1> VDD在 [1.71-3.6V] 范圍,CPU運(yùn)行頻率高達(dá)32MHZ
                                    2> VDD在 [full range] 范圍,高達(dá)16MHZ頻率
                                    3> VDD在 [full range] 范圍,高達(dá)4.2MHZ頻率
2、支持七種低功耗模式:
                                    1> sleep mode :CPU停止,外圍可以繼續(xù)工作,也可以喚醒CPU。
                                    2> Low-Power run mode:
                                    3> Low-Power sleep mode:
                                    4> Stop mode with RTC
                                    5> Stop mode without RTC
                                    6> Standby mode with RTC: standby mode是功耗最低的模式
                                    7> Standby mode without RTC
這幾種模式的介紹可以看STML031手冊(cè)的第16頁(yè)。

再來(lái)談一談LPUART和LPTIM吧。首先看上面的框圖可以了解,兩者都掛在APB1上。在這個(gè)時(shí)鐘源下還掛有RTC和IWDG。
LPUART可以在stop模式下喚醒CPU,在32.768khz時(shí)仍然能夠提供高達(dá)9600的波特率,這種模式在低功耗通訊時(shí)尤其重要。
LPTIM也可以在stop模式下喚醒設(shè)備。
其余的不同需要再細(xì)細(xì)研究一下。
因?yàn)楸酒L(zhǎng),后面還有一篇評(píng)測(cè)從軟件和實(shí)驗(yàn)上做一些評(píng)測(cè)。


二、軟件實(shí)驗(yàn)
2.1 ADC讀取實(shí)驗(yàn)
[1   ADC介紹]
[1.1> 讀取的三種模式]
ADC讀取的方式有三種:一種是所謂的連續(xù)模式,另一種是不連續(xù)模式,還有一種是單次模式。只看上面的名字似乎并不能搞清楚每種都是什么意思。假定我們要使用CH0,3,7這三個(gè)通道讀取ADC的數(shù)據(jù)。在采集過(guò)程中采集方向不發(fā)生改變,假定是升序采集。我通過(guò)軟件觸發(fā)或者硬件觸發(fā)來(lái)啟動(dòng)ADC轉(zhuǎn)換,在下面我直接稱這個(gè)過(guò)程叫做“觸發(fā)采集”。
連續(xù)模式的意思是,在觸發(fā)采集一次之后,ADC模塊自動(dòng)按照0-3-7-0-3-7的順序循環(huán)采集者三個(gè)通道的數(shù)據(jù)。在每個(gè)通道采集完觸發(fā)EOC事件,每一遍完成之后觸發(fā)EOSEQ事件。
單次模式是,觸發(fā)采集一次之后,ADC模塊自動(dòng)按照0-3-7的順序采集三個(gè)通道的數(shù)據(jù)。采集完成之后停止運(yùn)行,直到才一次觸發(fā)采集來(lái)引起對(duì)ADC的采集。相對(duì)于上面的區(qū)別是,新的一輪采集需要新的觸發(fā)采集事件。
不連續(xù)模式下,每次觸發(fā)采集動(dòng)作執(zhí)行一個(gè)通道的觸發(fā)。
因此你可以看出ADC的每個(gè)通道事實(shí)上不能單獨(dú)操作的。如果你這段時(shí)間使用通道0和1,下一段時(shí)間只是用通道2和3.那么你最好是在發(fā)生改變的時(shí)候重新配置ADC。在這種情況下cubemx就無(wú)能為力了,你只能先按照前者配置,在程序中在編寫這部分改變的代碼。
對(duì)了每次的EOC和EOSEQ都需要軟件來(lái)復(fù)位,否則不能執(zhí)行下一次采集。詳情見(jiàn)參考手冊(cè)RM0377中ADC部分.
[1.2> 數(shù)據(jù)處理的模式]
每一次轉(zhuǎn)換的結(jié)果都存儲(chǔ)在ADC_DR這個(gè)16位寄存器里面,因?yàn)锳DC的分辨率和對(duì)齊方向可以配置,所以具體的數(shù)據(jù)含義可以參考自己的設(shè)置。
下圖很形象的給出數(shù)據(jù)的排列含義:

因?yàn)樗型ǖ赖臄?shù)據(jù)采集是按照順序執(zhí)行的,而且數(shù)據(jù)采集的結(jié)果如果不讀取可能會(huì)被overwrite或者觸發(fā)overrun信號(hào)。如果及時(shí)的從ADC_DR中讀出數(shù)據(jù)并放到正確的位置是很重要的。采用DMA是一種方法,當(dāng)然另一種是不采用DMA。在轉(zhuǎn)換速度很慢切沒(méi)有其他任務(wù)需要緊急執(zhí)行時(shí)可以不適用DMA,而是用軟件輪訓(xùn)的方式來(lái)檢測(cè)EOC,不過(guò)這種方式還是有潛在的overrun的危險(xiǎn)。還有一種不用DMA的方式是將OVERMOD設(shè)置成1,然后每次讀取ADC_DR里面的數(shù)據(jù)時(shí)只獲取最新的數(shù)據(jù),數(shù)據(jù)的通道可能是轉(zhuǎn)換序列中的任何一個(gè),這種方式在一些特殊場(chǎng)景中有用。最好用的方式當(dāng)然是使用DMA了。但是采用DMA的方法技術(shù)也稍微復(fù)雜,可使用one-shot和circular模式。前者每完成DMA transfer之后就停止ADC的掃描序列等動(dòng)作,后者則更適合完成一系列的ADC轉(zhuǎn)換。
[1.3> 時(shí)鐘的配置]
在上個(gè)帖子中簡(jiǎn)單介紹了一下ADC時(shí)鐘來(lái)源的問(wèn)題。除了哪里介紹的同步和異步模式外,還需要注意的是:對(duì)于STM32L0 ADC模塊的最高時(shí)鐘頻率是16MHZ,因此在配置時(shí)鐘時(shí)無(wú)論同步異步在分頻后的頻率一定不能超過(guò)這個(gè)頻率。那異步模式來(lái)說(shuō),頻率是由HSI提供的而L031K6的HSI頻率是16MHZ。這個(gè)數(shù)據(jù)時(shí)剛好的。當(dāng)然你還可以2/4/8分頻,至于同步模式就一定要注意分頻的數(shù)目。
  1.     /* Blocking mode: Polling */
  2.     HAL_StatusTypeDef    HAL_ADC_Start(ADC_HandleTypeDef* hadc);
  3.     HAL_StatusTypeDef    HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
  4.     HAL_StatusTypeDef    HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);                 
  5.     HAL_StatusTypeDef    HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);
  6.                         
  7.     /* Non-blocking mode: Interruption */
  8.     HAL_StatusTypeDef    HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
  9.     HAL_StatusTypeDef    HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
  10.                         
  11.     /* Non-blocking mode: DMA */
  12.     HAL_StatusTypeDef    HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
  13.     HAL_StatusTypeDef    HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
復(fù)制代碼
上面是stm32Ll0xx_hal_adc.h中的一部分代碼。上面介紹了三種讀取方式。一種是堵塞式的,另外兩種是非堵塞式的。堵塞式的顧名思義是ADC讀取完之后返回讀取的數(shù)據(jù)。非堵塞式的就是發(fā)送讀取命令之后,等待讀取完成將數(shù)據(jù)返回給你。非堵塞式的也分為兩類。一種是中斷式的,另一種是DMA方式。這就涉及到處理完成之后如何得到數(shù)據(jù)。

[2   實(shí)驗(yàn)介紹]
我比較喜歡使用HAL變成,因?yàn)镾T的新硬件都是以HAL作為主要的驅(qū)動(dòng)平臺(tái)。ADC的使用除了按照我上面的介紹來(lái)設(shè)置外,還需要對(duì)API做一些簡(jiǎn)單的了解。稍后可以看我在cube里面的配置,但是程序?qū)ζ渑渲糜行┬薷。在?shí)驗(yàn)時(shí)遇到了一些問(wèn)題。在下面的介紹中做了詳細(xì)介紹。
首先,我在PA1、PA3上接上搖桿的XY軸電位器,另外打開(kāi)了溫度采集通道。當(dāng)然其它硬件連接也就緒了。通過(guò)UART2輸出信息,但是因?yàn)镾B3沒(méi)有接上0歐姆電阻所以通過(guò)STlink的USB并不能輸出直接輸出信息。所以如果需要開(kāi)通ST-Link的VCP通道需要焊接SB3上的電阻。具體可以看原理圖。
下面是連接的硬件,硬件原理圖可以看下一個(gè)實(shí)驗(yàn)的文檔,因?yàn)橛布B接差別不大。
實(shí)驗(yàn)內(nèi)容就是通過(guò)串口將ADC的數(shù)據(jù)輸出,ADC采樣通過(guò)DMA循環(huán)采樣,但是UART輸出和LD3閃動(dòng)同步,大約200毫秒輸出一次。下面是實(shí)驗(yàn)場(chǎng)景圖



這里說(shuō)明一下實(shí)驗(yàn)過(guò)程中遇到的幾個(gè)問(wèn)題。第一個(gè)問(wèn)題是溫度的ADC數(shù)據(jù)采集之后如何處理成溫度。第二個(gè)是DMA的數(shù)據(jù)如何接受,還有就是實(shí)驗(yàn)結(jié)束的標(biāo)志是什么。本實(shí)驗(yàn)沒(méi)有用到,按道理應(yīng)該是我需要的數(shù)據(jù)轉(zhuǎn)換結(jié)束后,通過(guò)中斷來(lái)調(diào)用ADC顯示任務(wù)。第三個(gè)問(wèn)題是ADC影響HAL_Delay()。第四個(gè)是ADC的串?dāng)_問(wèn)題。前兩個(gè)問(wèn)題不涉及具體實(shí)驗(yàn)現(xiàn)象問(wèn)題,可以通過(guò)搜索RM文檔找相關(guān)關(guān)鍵字找到解決辦法。這里具體講后兩個(gè)問(wèn)題。
第三個(gè)問(wèn)題起初的原因是這樣的我的配置打開(kāi)了ADC的continuous模式,就是說(shuō)我的ADC是采集完一輪之后再去轉(zhuǎn)換。DMA的優(yōu)先級(jí)我設(shè)置的比systick中斷高.ADC的一直運(yùn)行,ADC轉(zhuǎn)換的結(jié)果一直調(diào)用DMA處理新數(shù)據(jù)。所以Systick一直來(lái)不及處理Systick的中斷處理函數(shù)。所以最終的現(xiàn)象是我的LED一直處于亮起的狀態(tài),而不閃動(dòng)。在檢查代碼是我發(fā)現(xiàn)程序一直回調(diào)Delay的函數(shù)。解決辦法就是我在閃動(dòng)一次LED時(shí)采集一次,然后顯示。當(dāng)然這樣做只是為了測(cè)試ADC,后期我上RTOS的時(shí)候再設(shè)計(jì)一種更好的調(diào)用方式。
第三個(gè)問(wèn)題是第二路ADC對(duì)溫度采集有串?dāng)_。具體表現(xiàn)是第一路搖桿左右移動(dòng)時(shí),不影響第二路輸出,本身正常。但是第二路在前后移動(dòng)時(shí),影響溫度傳感器的輸出值,而且變化很大。我之前在用Arduino時(shí)遇到過(guò)這種問(wèn)題,但是沒(méi)有遇到過(guò)只是其中一路對(duì)下一路影響的。但是還是決定是串?dāng)_問(wèn)題,我自己也嘗試修改采樣時(shí)間,但改動(dòng)不大,溫度的輸出值變化還是有。直到我找到官方的一篇文章介紹之后,才發(fā)現(xiàn)自己的設(shè)置還是太小。
我將文檔上傳,請(qǐng)看: 掃描模式下 ADC 發(fā)生通道間串?dāng)_.pdf (148.99 KB, 下載次數(shù): 5)
除了修改采樣時(shí)間還可以修改時(shí)鐘,我最早是DIV1的現(xiàn)在改成DIV8,采樣時(shí)間不用太大也可以。具體看代碼。
然后我懷疑STM32內(nèi)部的溫度傳感器內(nèi)阻太大,而我外部的搖桿采樣內(nèi)阻很小,所以就產(chǎn)生了這種現(xiàn)象。

對(duì)了這是代碼: ADC_DMA_T1.7z (1.03 MB, 下載次數(shù): 8)

2.2 freeRTOS實(shí)驗(yàn)
[1    freeRTOS實(shí)驗(yàn)]
[1.1> 實(shí)驗(yàn)描述]下面是用CAD繪制的硬件連接圖,分圖層。為了方便沒(méi)有CAD的朋友,我轉(zhuǎn)成了PDF格式,用adobe reader可以關(guān)閉和打開(kāi)圖層。
先上兩張樣圖,然后附上PDF和CAD 的附件。這兩張樣圖分別提供了mbed接口和引腳連接信號(hào)圖。在提供的PDF和CAD中都有圖層的概念,你可以通過(guò)選擇開(kāi)關(guān)圖層。
      
PDF文件
L032KG-Model.pdf (116.81 KB, 下載次數(shù): 5)
CAD文件,2013版本的。因?yàn)楦袷絾?wèn)題,故封裝成壓縮包格式。
L032KG.rar (43.11 KB, 下載次數(shù): 5)


[1.2> 線程及通訊描述]
這個(gè)上系統(tǒng)的變成重點(diǎn)是安排線程中斷和各種數(shù)據(jù)結(jié)構(gòu),思想是重要的。平臺(tái)有時(shí)候沒(méi)有那么具有特定性,畢竟當(dāng)前的RTOS系統(tǒng)說(shuō)到底性能也許有差別,但是通常支持的技術(shù)是一致的。對(duì)于編程者來(lái)講,思想是更重要的。所以我們才會(huì)看到ARM設(shè)法用CMSIS-RTOS來(lái)統(tǒng)一化各個(gè)操作系統(tǒng)的接口。從長(zhǎng)期來(lái)看,我是看好這種變化的,但是目前選定一種RTOS是很有必要的,畢竟工作有時(shí)是需要熟練應(yīng)用所學(xué)的技術(shù)的。好了廢話不多說(shuō),看看我的線程調(diào)度和安排吧。
-

[2    RTX實(shí)驗(yàn)對(duì)比] (保留篇幅,之后再添加)

[3    freeRTOS不用CMSIS-RTOS會(huì)不會(huì)更合理] (保留篇幅,之后再添加)

2.2 低功耗模式實(shí)驗(yàn)(保留篇幅,之后再添加)


其實(shí)這篇幾天前就也開(kāi)始寫了,但是因?yàn)榘滋煲ッ嬖,所以斷斷續(xù)續(xù)。中途還去ST深圳參加了藍(lán)牙的培訓(xùn)。和一起培訓(xùn)的小伙伴聊天。他說(shuō)之前的培訓(xùn)都是ST自己辦的,干貨較多沒(méi)有板子送?墒沁@次是聚碼的小哥講的,送了塊板子,干貨很少,因?yàn)樗辉敢庵v怎么用st的blueNRG,只是簡(jiǎn)單講了自己的API怎么用。
不過(guò)感謝ST了,學(xué)習(xí)還要靠自己





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1