在ST官網上下的固件包,用STM32F10x_StdPeriph_Lib_V3.4.0/Project/STM32F10x_StdPeriph_Template裡的工程,編譯正確。以下嘗試了兩種新建工程的方法,均失敗:
1。 將固件包裡的例程和相應的CMSIS、StdPeriph_Driver拷到工程下,修改target options裡的C/C++ include paths項為「../;../Src/App;../Src/CMSIS;../Src/Lib」,編譯報錯「D:/Keil/ARM/INC/ST/STM32F10x/stm32f10x_type.h(23): error: #256: invalid redeclaration of type name "s32" (declared at line 470 of "Src/App/stm32f10x.h")」等。
本文引用地址:http://www.eepw.com.cn/article/201611/317052.htm2。 若在工程中添加的文件為固件包中的連結(而不是拷貝),完全按照template裡的結構,並將include paths按照template進行修改,編譯報錯「Keil/ARM/INC/ST/STM32F10x/stm32f10x_conf.h(147): warning: #47-D: incompatible redefinition of macro "HSE_Value" (declared at line 511 of "STM32F10x_StdPeriph_Lib_V3.4.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h")」等。
KEIL安裝目錄下的為舊版lib,工程中使用的為新版,兩者代碼結構上有所不同。而編譯器在編譯了工程文件的同時,自動連結了KEIL安裝目錄下的文件,造成衝突。但是在選項中沒有找到配置是否連結KEIL安裝目錄下LIB的地方。
問題原理:
對照固件包中模板工程的連結情況,逐個對比模板工程和自建工程中,各原始碼連結的所需庫的位置。若模板中連結的是固件包中的文件,如system_stm32f10x.h 或 stm32f10x_config.h,即新版lib;而自建工程中連結的相應文件位置為Keil安裝目錄,說明工程設置中沒有包含該庫的路徑,使編譯器自動尋找安裝目錄中的舊版文件。由於庫代碼結構不同,造成編譯錯誤。因此需要在工程設置的include paths欄中添加新版lib的路徑。
問題解決:
對於第二種建立工程的步驟,通過報錯的信息很容易看出,編譯過程連結了keil安裝目錄下的conf.h,而實際需要使用固件包中的該文件。因此,在include paths中添加固件包conf.h所在目錄,即可解決問題。
對於第一種建立工程的步驟,stm32f10x_type.h不是工程原始碼中直接需要包含和應用的頭文件,不容易找到未設定的連結路徑。因此,採用「問題原理」中的辦法,逐一連結庫對比,修改連結路徑,也可以找到未包含的位置,解決問題。
還需要注意區分的是,路徑中的「../」意為工程文件上一級目錄,「./」為工程文件的同級目錄。我們在一些論壇上看到別人貼的自己的路徑中,第一個即為"../",不是必須的。另外,編譯器只能在當前目錄下搜索文件,不會進入下一級目錄,因此指定的路徑需要很具體。
出現這個問題時,搜了不少論壇,也在論壇上問過大牛,大致都是配置路徑有問題,卻沒有說到具體的解決辦法,自己摸索了好一陣。的確是這個原因,以後如果我遇到相同的提問,估計也會是這麼回答。不過,理論和具體實踐還是有距離的。