J20航模遙控器開源項目系列教程(三)開發說明 | 想要自己改造程式,擴充功能,怎麼實現?
- 2020 年 8 月 20 日
- 筆記
- J20航模遙控器開源項目, STM32
我們的開源宗旨:自由 協調 開放 合作 共享
擁抱開源,豐富中國開源生態,開展多人運動,歡迎加入我們哈~
和一群志同道合的人,做自己所熱愛的事!
項目開源地址://github.com/Cai-Zi/STM32_RC_Transmitter
QQ交流群:1091996634 【密碼:J20】
這篇文章一方面是為了方便初學者閱讀修改程式,另一方面是便於團隊成員快速了解程式框架,做到心中有數。
受限於篇幅,這裡只是對程式做一個簡要的介紹,要做更深入的了解還是要通讀源程式碼的,畢竟數千行程式碼無法一五一十地講解。
一. KEIL5使用技巧
1. 美化編輯介面
keil默認的主題是白色的,比較傷眼且不美觀。
先來看美化後的效果,黑色的主題看起來舒服多了~
下載文件 //files.cnblogs.com/files/cai-zi/global.zip,解壓後得到global.prop文件;
將其複製到keil5安裝目錄(筆者的是D:\Keil_v5\MDK\UV4\global.prop),重啟keil即可。
2. 斷點調試程式碼
工具欄中點擊魔法棒圖標,選擇Debug窗口,選擇下載器為ST-Link Debugger;
將ST-Link V2下載器與STM32連接,USB端連接電腦。
GND 電源地
3V3 接3.3v
SWCLK 接DCLK
SWDIO 接DIO
每次修改完程式,需要先編譯,通過後再點擊序號3圖標,進入調試。
在行數旁邊點擊滑鼠左鍵,打斷點,然後點擊序號2圖標,運行程式,程式會在斷點處停止;
此時可查看程式運行的時長,各個變數當前的值等等。
3. 查看變數值
有時候變數結構過於複雜,並且想要實時查看,不適合通過串口輸出,這時就要用調試手段了。
完成第2步操作,進入調試後,選擇某個變數名(以PWMvalue數組為例),點擊滑鼠右鍵,如圖選擇,即可在Watch1中查看變數。
4. 查看GPIO狀態
GPIO的狀態實際上是由暫存器控制的,所以查看對應的暫存器的值就可以了,這裡以PC13的高低電平為例。
完成第2步操作,進入調試後,如圖選擇。
先運行程式至斷點。選擇ODR13,勾選代表暫存器的數值為1,未勾選為0。
勾選與否能夠控制LED燈的亮滅,可以嘗試一下哈~
5. 快速查找變數定義
選擇函數名或者變數名,按F12即可快速到達其定義的位置。
打開.h文件方法如下:
二. 程式框架說明
1. ADC取樣
設置GPIO為模擬輸入,應先查看晶片數據手冊的引腳定義,看是否支援ADC。
2. 按鍵檢測
使用有限狀態機識別按鈕的短按、長按,這樣做可以避免延時消抖帶來的阻塞問題,具體可參考筆者的這篇部落格 //blog.csdn.net/weixin_42268054/article/details/107393669
若要添加按鈕,在key.h文件中增加按鈕名(寫在KEY_NUM之前),在key.c文件中添加初始化程式。
中斷服務程式裡面只進行變數的讀寫操作,不要添加耗時的程式!
3. 旋轉編碼器
使用上升沿觸發中斷,在中斷服務程式裡面檢測旋轉方向,而旋轉編碼器的按鈕則當作普通的按鍵處理。
4. 永久存儲用戶數據(FLASH模擬EEPROM)
先捋一捋這三個概念:
FLASH快閃記憶體(程式存儲空間)是C程式的存儲位置。
SRAM是程式在運行時創建和操縱變數的地方。
EEPROM是可以用來存儲長期資訊的存儲空間。
FLASH和EEPROM存儲器是非易失性的(電源關閉後該資訊仍然存在),SRAM是易失性的,重啟後會丟失。(FLASH快閃記憶體存儲器(PROGMEM)只能在程式刻錄時填充。程式開始運行後,您將無法更改快閃記憶體中的值。)
由於STM32F103C8T6晶片中只有64k的FLASH,而沒有EEPROM,所以我們使用FLASH的最後1頁(64k分成了64頁,所以1頁是1k位元組的存儲空間)來永久存儲數據。
我們把用戶數據都存儲在了setData結構體中,程式開始運行時,從最後一頁的地址中讀取對應位元組至setData結構體中,就可以獲取到用戶數據了。
每次用戶更改數據,直接修改setData結構體的變數值,再將結構體寫入暫存器的地址即可。
如圖兩行程式碼實現以上操作。
5. 多級菜單
同樣使用狀態機的思想,定義結構體如下,其中最後一個函數指針即是要顯示的介面函數。
OLED螢幕幕每一個介面都對應著一個顯示函數,也擁有唯一的索引值(這裡是0-13),可繼續擴充。
具體可參考筆者這篇部落格://blog.csdn.net/weixin_42268054/article/details/107613192
寫在最後
首先感謝項目中所有的貢獻者!(截止2020.08.20)
* 蔡子CaiZi(B站up主) //space.bilibili.com/349576976
* A-XIN;
* 小何;
* ZL_Studio(B站up主)//space.bilibili.com/364251289
* 王天天@WangTiantian139 //wangtiantian139.github.io/
* 劉桶桶;
* 簡繁;
* 王博;
* 與非門;
* Talons;
* 大米粥;
* P a S S ||;特別感謝正點原子提供的STM32常式和開源社區//www.openedv.com/
由於筆者學業繁忙,時間有限,無法投入過多的精力,所以歡迎更多學有餘力的模友,加入到項目的開發和維護工作中哈,現在基礎的程式框架已經搭建完成,剩下的要做的就是填充、優化和擴展了,有意願的模友加群後請私聊群主喔~
QQ交流群:1091996634 【密碼:J20】
本文歡迎轉載,請註明出處哈~