J20航模遙控器開源項目系列教程(三)開發說明 | 想要自己改造程序,擴充功能,怎么實現?



我們的開源宗旨:自由 協調 開放 合作 共享

擁抱開源,豐富國內開源生態,開展多人運動,歡迎加入我們哈~

和一群志同道合的人,做自己所熱愛的事!

項目開源地址:https://github.com/J20RC/STM32_RC_Transmitter

碼雲(Gitee)地址:https://gitee.com/J20RC

QQ交流群:1091996634 【密碼:J20】

這篇文章一方面是為了方便初學者閱讀修改程序,另一方面是便於團隊成員快速了解程序框架,做到心中有數。

受限於篇幅,這里只是對程序做一個簡要的介紹,要做更深入的了解還是要通讀源代碼的,畢竟數千行代碼無法一五一十地講解。

一. KEIL5使用技巧

1. 美化編輯界面

keil默認的主題是白色的,比較傷眼且不美觀。

先來看美化后的效果,黑色的主題看起來舒服多了~

 

 

下載文件 https://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. 按鍵檢測

使用有限狀態機識別按鈕的短按、長按,這樣做可以避免延時消抖帶來的阻塞問題,具體可參考筆者的這篇博客 https://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結構體的變量值,再將結構體寫入寄存器即可。

如圖兩行代碼實現以上操作。

注意程序的總大小不能超過63k字節,即Code+RO Data+RW Data會燒錄進FLASH中,18140+9468+2124=29732(再除以1024,約29k)

程序運行的時候:RW Data + ZI Data。

5. 多級菜單

同樣使用狀態機的思想,定義結構體如下,其中最后一個函數指針即是要顯示的界面函數。

OLED屏幕每一個界面都對應着一個顯示函數,也擁有唯一的索引值(這里是0-13),可繼續擴充。

具體可參考筆者這篇博客:https://blog.csdn.net/weixin_42268054/article/details/107613192

 

 

寫在最后

首先感謝項目中所有的貢獻者!(截止2020.12.06)

 * 蔡子CaiZi(B站up主)  https://space.bilibili.com/349576976
 * A-XIN;
 * 小何;
 * ZL_Studio(B站up主)https://space.bilibili.com/364251289
 * 王天天@WangTiantian139  https://wangtiantian139.github.io/
 * 劉桶桶;
 * 簡繁;
 * 王博;
 * 與非門;
 * Talons;
 * 大米粥;
 * P a S S ||;
* 佚名;
* 小吳;

特別感謝正點原子提供的STM32例程和開源社區http://www.openedv.com/

由於筆者學業繁忙,時間有限,無法投入過多的精力,所以歡迎更多學有余力的模友,加入到項目的開發和維護工作中哈,現在基礎的程序框架已經搭建完成,剩下的要做的就是填充、優化和擴展了,有意願的模友加群后請私聊群主喔~

QQ交流群:1091996634 【密碼:J20】


 

本文歡迎轉載,請注明出處哈~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM