得吐槽一下這個標(biāo)題字?jǐn)?shù),我都寫不全了
應(yīng)用篇-在STM32L051上使用RT-Thread 第二篇,使用STM32CubeMX 進(jìn)行對應(yīng)外設(shè)配置,同時做一些簡單測試。
目錄
- 前言
- 一、使用 STM32CubeMX 配置
- 1.1 基礎(chǔ)步驟
- 1.2 修改配置
- 1.3 踩坑記錄
- 二、初始簡單測試
- 2.1 基本設(shè)計思路
- 2.2 外設(shè)簡單測試
- 三、時刻關(guān)注占RAM大小
- 結(jié)語
前言
上篇文章我們僅僅是開了個頭,使用 RT-Thread Studio 新建了一個基于 STM32L051 的 RT-Thread Nano 工程,本文我們就在在這個工程的基礎(chǔ)上使用 STM32CubeMX 做STM32的基本配置。
??
本 RT-Thread 專欄記錄的開發(fā)環(huán)境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)
RT-Thread記錄(二、RT-Thread內(nèi)核啟動流程 — 啟動文件和源碼分析)
??
RT-Thread 內(nèi)核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數(shù)及線程管理與FreeRTOS的比較)
RT-Thread記錄(四、RT-Thread 時鐘節(jié)拍和軟件定時器)
RT-Thread記錄(五、RT-Thread 臨界區(qū)保護(hù))
RT-Thread記錄(六、IPC機(jī)制之信號量、互斥量和事件集)
RT-Thread記錄(七、IPC機(jī)制之郵箱、消息隊列)
RT-Thread記錄(八、理解 RT-Thread 內(nèi)存管理)
RT-Thread記錄(九、RT-Thread 中斷處理與階段小結(jié))
??
在STM32L051C8 上使用 RT-Thread 應(yīng)用篇系列博文連接:
RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread (一、無線溫濕度傳感器 之 新建項(xiàng)目)
一、使用 STM32CubeMX 配置
STM32CubeMX 配合 RT-Thread Studio 使用的方法在我的博文:《RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)》
的第三小節(jié)有說明:
配置我們需要根據(jù)原理圖進(jìn)行,本應(yīng)用所用到的外設(shè)原理圖如下(無線通訊模塊沒有放進(jìn)來,使用的是串口TXD3和RXD3,另外使用的外部8Mhz):
1.1 基礎(chǔ)步驟
點(diǎn)擊 CubeMX Setting,然后選擇芯片類型,點(diǎn)擊OK即可打開STM32CubeMX,如下圖:
進(jìn)入CubeMX 后設(shè)置步驟就很基礎(chǔ)了。
我們按照 時鐘,調(diào)試接口,串口,GPIO,定時器,工程選項(xiàng) 依次配置,下面就簡單列一下步驟:
時鐘:
RCC選項(xiàng),外部高速時鐘 選擇使用外部晶振:
選擇完時鐘就可以在 Clock Configuration 中配置系統(tǒng)時鐘,直接把系統(tǒng)時鐘改成最大的 32Mhz,點(diǎn)擊確定,系統(tǒng)會自動修改好時鐘樹:
調(diào)試接口:
SYS選項(xiàng),在 Debug Serial Wire 前打勾,表示使用SWD接口:
串口:
串口一已經(jīng)用作了打印串口,在工程 drivers 文件夾里的drv_usart.c 文件中已經(jīng)使用INIT_BOARD_EXPORT(rt_hw_usart_init); 初始化了,所以我們這里不需要使能。
我們直接設(shè)置一下我們需要和無線通訊模塊 通信的 串口,原理圖上是串口3,在L051上是LPUART1(STM32F103C8 和 STM32L051C8是 pin to pin 的):
GPIO:
普通GPIO設(shè)置,2個按鍵輸入,一個LED輸出,2個IO口做軟件I2C:
定時器:
我們設(shè)置兩個硬件定時器,一個1S,一個1ms,我們可以根據(jù)自己使用不使用選擇初始化。
設(shè)置為1S的定時器 TIM2:
設(shè)置為1ms的定時器 TIM21:
工程選項(xiàng):
最后在 Project Manager 中做最后的配置,生成工程:
完成上述步驟,點(diǎn)擊CubeMX右上角 GENERATE CODE 生成工程。
根據(jù)我以前的博文說明,生成好了以后,不要打開,直接關(guān)閉CubeMX即可,然后回到 RT-Thread Studio,出現(xiàn)下面的彈框點(diǎn)擊確定即可。
完成以后多了cubemx 文件夾,然后編譯一下,正常結(jié)果如下(其實(shí)我自己走流程的時候,出過一次問題,后面小節(jié)會說明):
1.2 修改配置
還是根據(jù)《RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)》中的記錄,修改一下SConscript
文件,使得包含我們 CubeMX 生成的 GPIO 、串口和定時器設(shè)置:
修改完成以后不要忘了同步 scons 配置!!再重新構(gòu)建!
這里要特別說明一下stm32f1xx_it.c
這個文件:
在《RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)》中我建議不需要添加,因?yàn)槔锩嬗行┲袛囗憫?yīng)函數(shù), RT-Thread 內(nèi)核有自己的實(shí)現(xiàn)方式。但是這里我還是添加了, 但是要把stm32f1xx_it.c 文件中 一些中斷響應(yīng)函數(shù)的給注銷了,因?yàn)樵赗T-Thread 內(nèi)核有其他地方有實(shí)現(xiàn)!
我的做法是,除了下圖自己后面程序設(shè)計需要使用到的,其他的都給刪除了,注意這里方便說明用的是函數(shù)聲明部分,需要在stm32f1xx_it.c
文件中函數(shù)實(shí)現(xiàn)部分刪除:
配置完成以后再次進(jìn)行編譯,結(jié)果如下:
完成上面配置后我們就可以開始設(shè)計我們的程序了。
1.3 踩坑記錄
按照上面 1.1 小節(jié)的基礎(chǔ)步驟設(shè)置 ,完成以后,在CubeMX最后一步生成工程的時候居然卡死了,我只能強(qiáng)制退出CubeMX任務(wù),重新點(diǎn)擊CubMX Settings 打開CubeMX進(jìn)行配置。
完成以后發(fā)現(xiàn)左邊CubeMX里面的文件列表不是和當(dāng)時我文章記錄的一樣:
居然沒有SConscript
,編譯報錯了,即便我重新復(fù)制進(jìn)去,也沒有用……
一般來說,如果編譯除了問題,我們應(yīng)該從編譯結(jié)果去查找問題,然后分析解決,但是對于這種軟件聯(lián)動的自動化配置,我還是建議重新操作嘗試解決。所以我把工程全部刪除,然后重新來一遍看看。
因?yàn)榭紤]到CubeMX卡死過一次,項(xiàng)目出問題了,兩個軟件沒有成功的關(guān)聯(lián),所以我是重新操作了一次正常了。
而且有一個系列操作,在我們點(diǎn)擊 RT-Thread Studio 打開CubeMX以后,最好是等待 RT-Thread Studio 的一個彈框消失以后再進(jìn)行操作:
二、初始簡單測試
完成上面的配置,我們的基本框架就已經(jīng)搭建好了,剩下的就是實(shí)現(xiàn)應(yīng)用程序了,那么在實(shí)際的操作之前,我們先簡單驗(yàn)證一下整體的框架沒有問題,簡單測試下LED和按鍵,串口的話要單獨(dú)一篇文章分析。
2.1 基本設(shè)計思路
首先我們得在 main.c 文件中包含必備頭文件,和在main線程中做基本的初始化:
其實(shí)這個步驟就和裸機(jī)一樣,我們完全可以把 main 當(dāng)成裸機(jī)中的main函數(shù),所有的程序在main中實(shí)現(xiàn),也是可以。 這種方式就類似于 ESP32-C3 使用ESP-IDF 開發(fā)環(huán)境中,大部分操作都在 app_main 任務(wù)中實(shí)現(xiàn), app_main 也不過是 FreeRTOS 啟動時候創(chuàng)建的一個任務(wù)。
記得在上一篇博文中我們提到過 一個main 線程就占用了 2K,這個2K不能浪費(fèi),要么我們在main里面多做一些工作,要么就是到時候把main線程的大小改小。
我們一個單品溫濕度傳感器,有幾個主要的工作:
- I2C 數(shù)據(jù)采集,這個部分需要移植一下代碼,然后采集實(shí)現(xiàn)部分需要用一個線程來實(shí)現(xiàn),計劃是定時器到了一定的計數(shù)之后,發(fā)送一個信號量使得線程喚醒采集一次;
- 無線模塊串口通訊,這個部分是和上一步聯(lián)動的,定時器到了定時時間,通知傳感器采集數(shù)據(jù),然后把數(shù)據(jù)放置無線通訊協(xié)議中發(fā)送出出去,這個部分還得用一個線程實(shí)現(xiàn),串口的通訊;
- LED燈,其實(shí)可有可無,但是作為我們第一個基礎(chǔ)應(yīng)用,還是加上也沒關(guān)系,LED的切換,到時候可以隨意加在哪里,比如采集到了數(shù)據(jù)成功發(fā)送以后,LED燈閃爍一次;
- 按鍵,按鍵其實(shí)也可有可無,但是還是因?yàn)槲覀兊牡谝粋€基礎(chǔ)應(yīng)用,我想把我常用的按鍵驅(qū)動移植過來試一試,根據(jù)以往經(jīng)驗(yàn),按鍵驅(qū)動也需要一個線程,而且這個線程至少需要512字節(jié)的空間;
- 定時器,根據(jù)產(chǎn)品所需要的的定時時間釋放信號量,使得數(shù)據(jù)采集線程開始工作,定時器是硬件定時器,使用中斷實(shí)現(xiàn)不用額外線程;
這里思路暫時先這樣,后期如果使用過程中有新的改動,再來更新。
2.2 外設(shè)簡單測試
然后我們把一些外設(shè)需要的宏定義設(shè)置一下:
LED:
然后在主函數(shù)中寫一個LED燈切換的邏輯(此部分太簡單了,所以截個圖看看就行了):
按鍵:
然后新建一個線程,給到時候按鍵驅(qū)動移植使用,這里就用簡單的按鍵處理方式,大小設(shè)定為512字節(jié)。
值得注意的是,我們新建任務(wù)只能用靜態(tài)初始化的方式,因?yàn)槲覀儧]有定義使用heap,新建的線程大小直接影響RAM空間大小。
定時器:
我們有一個1S的定時,我們也來簡單測試一下,具體的測試方式和我們在記錄九中的一致:
《RT-Thread記錄(九、RT-Thread 中斷處理與階段小結(jié))》
但是這次我們加了stm32f1xx_it.c 文件,所以我們這次直接在stm32f1xx_it.c 文件中修改(再次說明,實(shí)際使用中中斷響應(yīng)函數(shù)中不要添加打印操作,這里只是測試測試?。。。?/strong>
所有改完以后編譯一下:
OK!編譯沒問題,下載查看測試結(jié)果:
三、時刻關(guān)注占RAM大小
在小內(nèi)存芯片上使用操作系統(tǒng),程序運(yùn)行占用的RAM大小我們不容忽略,我們在應(yīng)用中務(wù)必學(xué)會觀察內(nèi)存占用情況:
完成CubeMX基礎(chǔ)步驟以后,默認(rèn)只添加了兩個.c文件,與初始工程的比較:
修改完配置,表示著我們的基礎(chǔ)框架基本搭建好了,我們多添加了GPIO、串口,和定時器的驅(qū)動程序:
說明!上面幾張圖因?yàn)閯傞_始,所以貼了和初始工程的比較,往后的比較我不可能從初始工程開始貼圖,只能與上一次工程完善的結(jié)果做比較:
本文的簡單測試,程序運(yùn)行時候需要占用 RAM的大?。?1536+5184= 6720 字節(jié),我們的芯片 RAM:8192字節(jié)。
結(jié)語
本文依然還處于工程配置階段,再次手把手做了次教學(xué),如何使用 STM32CubeMX 配合 RT-Thread Studio開發(fā)。
我們詳細(xì)的說明了配置步驟,同時在初始測試小節(jié)寫好了本應(yīng)用的的設(shè)計思路。做了基本框架設(shè)計 和 初步的測試說明。
現(xiàn)在看來,這系列應(yīng)用篇還真算得上保姆級的教程了 = =!我自己現(xiàn)在都覺得真的細(xì)……
下一篇的內(nèi)容應(yīng)該是把 I2C 讀寫的程序移植過來,到時候看看篇幅,如果又有很多細(xì)節(jié)那就這一個內(nèi)容,如果內(nèi)容篇幅簡單到時候看情況添加。
好了,本文就到這,謝謝大家!
-
STM32
+關(guān)注
關(guān)注
2270文章
10910瀏覽量
356634 -
Studio
+關(guān)注
關(guān)注
2文章
190瀏覽量
28733 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1296瀏覽量
40244 -
CubeMx
+關(guān)注
關(guān)注
0文章
31瀏覽量
1351
發(fā)布評論請先 登錄
相關(guān)推薦
評論