STM32程序移植專題

一,概括
程序的移植包括以下幾步
1.觀察待移植程序調用了哪些文件,將這些文件放入移植的工程當中
2.在keil當中添加這些文件,並且添加.h文件的路徑
3.處理頭文件及軟件版本匹配的問題

二,詳解
步驟一:
1.觀察待移植程序調用了哪些文件,將這些文件放入移植的工程當中。
2.最好是新建一個文件夾專門存儲這些文件。
3.不建議移植STM32系統文件,可以將系統的頭文件改成移植工程當中的系統文件。如果有哪些東西缺失,單獨用宏定義添加。
步驟二:
1.在keil當中添加這些文件,並且添加.h文件的路徑
步驟三
1.處理頭文件及軟件版本匹配的問題
2.儘量利用宏定義,把一些移植後沒有定義的量寫在一個文件裏面。

三,如何調試?
不要對別人的程序盲目的信任,可能會爆出很多的錯誤。如果錯誤過多,需要重新調試。
1.將代碼功能模塊單獨拆下來,單獨進行實驗,尤其是在出現大量錯誤的時候。
2.一段程序的移植可能涉及以下方面
時鐘
中斷系統
GPIO管腳的配置

四,例子
比如我想用OLED液晶顯示器,它的一些編程可以從商家那裏得到。
在這裏插入圖片描述
打開目錄下的工程文件。發現該工程中運用的是STM32f103C8,而我的單片機也正是這個。

但是,不要高興太早。我想新建一個工程,然後把有用的文件放到工程當中。
這是我的工程模板,有了這個模板,以後就不用新建工程,直接複製粘貼到新的地方就可以使用了
在這裏插入圖片描述
1.接下來開始移植操作,先要找到我們要移植哪些文件。從商家給的工程裏面的main.c所調用的頭文件中判斷。
在這裏插入圖片描述
在分別從這幾個頭文件的.c文件當中看看還需要什麼文件。
把這些.c和.h文件一起拷貝到你的工程當中
這裏我拷貝了delay.h,delay.c,sys.c,sys.h,oled.c,oled.h,bmp.h,oledfont.h,usart.c,usart.h
我沒有拷貝系統文件,我也不建議拷貝系統文件,因爲很可能會出現大量重複定義的東西,尤其是你所用的固件庫的版本和商家給的工程文件的固件庫版本不一致的時候。如果出現了問題,咱們再處理。
在這裏插入圖片描述
2.打開我們的工程添加這些文件
在這裏插入圖片描述
還要添加頭文件的目錄
在這裏插入圖片描述
3.打開商家的工程,把main.c裏的語句拷過來試試。
編譯一下,發現錯誤
在這裏插入圖片描述
4.這個錯誤出在了系統文件裏面,不建議修改系統文件。這個錯誤很可能是版本不兼容所致。
我們需要反過來看看,哪個文件調用了系統文件。打開所有移植過來的文件。
經過查找,發現sys.h當中,調用了"stm32f10x.h"這個系統文件,但是這個系統文件不是我的程序這個版本所需要的。我們原來工程當中的系統文件是stm32f10x_lib.h,索性直接讓sys.h調用這個stm32f10x_lib.h文件

5.再次,編譯。
還是有錯誤,這次錯誤更新了。
User\OLED\delay.c(61): error: #20: identifier “SystemCoreClock” is undefined
User\OLED\delay.c(121): error: #20: identifier “SysTick_CTRL_ENABLE_Msk” is undefined
User\OLED\delay.c(141): error: #20: identifier “SysTick_CTRL_ENABLE_Msk” is undefined
這些錯誤統統都出來了delay.c文件上。這個也是版本兼容的問題,我的工程當中調用的固件庫裏面,無法識別SystemCoreClock及SysTick_CTRL_ENABLE_Msk,我們需要知道它們是什麼意思。前者代表系統時鐘,後者代表systick使能。
如果你願意花費時間去翻閱固件庫手冊修改這兩個內容的話也可以,但是我建議直接自己別寫一個類似的文件,方便以後的工程移植。因爲delay.c的內容基本是一致的:利用systick進行ms或者us的延遲。這個自己編寫出來並不困難。所以我直接把這個文件刪了,自己編寫了一個,需要保證函數名和函數功能一致即可。

6.再次編譯,還是報錯
User\OLED\usart.c(109): error: #20: identifier “USART1_IRQn” is undefined
是這句話有誤:NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
這個是在NVIC當中的錯誤,也是版本兼容的問題,我的版本當中沒有這個宏。
在這裏插入圖片描述
在上下文找到我們版本下的USART1的通道的表達形式,並將其複製回來。
在這裏插入圖片描述
再次編譯,發現有些函數重複定義了,我們根據情況把函數內容合併就可以了。
注意,要註釋掉stm32f10x_t.c下的使用到的中斷函數。

7.編譯後,還是有錯誤,耐心一點,成功就在前方。
在這裏插入圖片描述
這些錯誤,都是與USART有關的,其實我們前面就應該注意到,我們移植的時候還要加入相關官方的功能性.c文件,比如這裏的stm32f10x_usart.c,是因爲這個文件沒加所以才引起的錯誤。這個錯誤在一開始就需要避免,你加入了什麼功能,就需要用到什麼樣的文件。

再次編譯,就沒有錯誤了,希望大家能從這次演示當中學得一些有用的技巧。

發佈了17 篇原創文章 · 獲贊 4 · 訪問量 5562
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章