標(biāo)題: 關(guān)于STM32 MDK中USE_STDPERIPH_DRIVER問(wèn)題及 STM32F10X_LD STM32F10X_MD STM32F10X... [打印本頁(yè)]

作者: WisdomYang    時(shí)間: 2017-5-17 21:38
標(biāo)題: 關(guān)于STM32 MDK中USE_STDPERIPH_DRIVER問(wèn)題及 STM32F10X_LD STM32F10X_MD STM32F10X...
我之前更改了stm32f103的芯片型號(hào),編譯無(wú)法通過(guò)。  c8t6->rct6
解決步驟:
1.“C/C++”選項(xiàng)卡框中的STM32F10X_MD 更換為  STM32F10X_HD
2.工程中相應(yīng)的添加 startup_stm32f10x_hd.s
3.如果提示Error:Undefined symbol SystemInit  在工程中添加system_stm32f10x.c即可。


一.關(guān)于STM32 MDK中USE_STDPERIPH_DRIVER問(wèn)題

初學(xué)STM32,在RealView MDK 環(huán)境中使用STM32固件庫(kù)建立工程時(shí),初學(xué)者可能會(huì)遇到編譯不通過(guò)的問(wèn)題。出現(xiàn)如下警告或錯(cuò)誤提示:
  warning: #223-D: function "assert_param" declared implicitly;assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  這時(shí)候我們需要在“Target Options”

中的“C/C++”選項(xiàng)卡中如圖-2所示紅框中添加USE_STDPERIPH_DRIVER、STM32F10X_HD。這樣才能使編順利通過(guò)。

圖-2
  知其然了,我們還得知其所以然。下面就聽(tīng)Herison給大家一一道來(lái)。我們知道,程序的執(zhí)行是從“main.c”文件開(kāi)始的,其中必須包含有頭文件“stm32f10x.h”。我們打開(kāi)“stm32f10x.h”,按下“Ctrl+F”鍵,查找USE_STDPERIPH_DRIVER,在“Find What”欄中輸入“USE_STDPERIPH_DRIVER”。如圖-3所示。點(diǎn)擊“Find Next”,出現(xiàn)“USE_STDPERIPH_DRIVER”對(duì)應(yīng)的代碼行,重復(fù)上邊操作三次,第三次的時(shí)候我們能在第8296-8298行找到如圖-4所示代碼段。

圖-3



圖-4
  這段代碼的意思是,只有用預(yù)編譯指令預(yù)定義了“USE_STDPERIPH_DRIVER”,才會(huì)將"stm32f10x_conf.h"包含進(jìn)“stm32f10x.h”中,從而被"main.c"用到。這就解釋了,為什么我們沒(méi)有在“main.c”中包含"stm32f10x_conf.h",而在編譯之后卻被包含進(jìn)了"main.c"中,出現(xiàn)如圖-5所示的情況!       "stm32f10x_conf.h"文件相當(dāng)于一個(gè)開(kāi)關(guān)文件,如果要用到STM32固件庫(kù)驅(qū)動(dòng)標(biāo)準(zhǔn)外設(shè),則外設(shè)驅(qū)動(dòng)頭文件是必不可少的,如“stm32f10x_gpio.h”。在"stm32f10x_conf.h"中我們通過(guò)代碼#include
"stm32f10x_gpio.h"來(lái)實(shí)現(xiàn)這個(gè)操作。

圖-5
  說(shuō)到這兒估計(jì)大家已經(jīng)對(duì)“USE_STDPERIPH_DRIVER”的來(lái)龍去脈有個(gè)清晰的認(rèn)識(shí)了吧?其實(shí)單從字面意思理解就是“使用標(biāo)準(zhǔn)外設(shè)驅(qū)動(dòng)”,在C/C++預(yù)定義中加入“USE_STDPERIPH_DRIVER”就是允許“使用標(biāo)準(zhǔn)外設(shè)驅(qū)動(dòng)”了。至于加入的“STM32F10X_HD“同樣能在文件”stm32f10x.h“通過(guò)如上所述的方法通過(guò)功能查找來(lái)進(jìn)行解釋?zhuān)鋵?shí)它也是對(duì)于對(duì)應(yīng)硬件的某些定義起開(kāi)關(guān)作用罷了。
二. STM32F10X_LD STM32F10X_MD STM32F10X_HD STM32F10X_CL宏定義的選擇
如果你使用stm32f10x_stdperiph_lib,會(huì)發(fā)現(xiàn)在stm32f10x.h文件會(huì)有一段關(guān)于宏選擇的代碼,如:
[cpp] view plaincopy
#if !defined (STM32F10X_LD) && !defined (STM32F10X_MD) && !defined (STM32F10X_HD) && !defined (STM32F10X_CL)
/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
#define STM32F10X_CL /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif
至于要使用哪個(gè)宏,則需要根據(jù)具體的芯片來(lái)進(jìn)行選擇。那么,這些宏又對(duì)應(yīng)著哪些具體的芯片呢?其實(shí)我們可以在《Reference manual》的第九章中找到答案,如文檔截圖:

這段話(huà)的意思很明顯,如果是STM32F105xx和STM32F107xx,是Connectivity Line Devices,則宏定義選擇的是STM32F10X_CL;如果是別的型號(hào),則根據(jù)FLASH的容量來(lái)進(jìn)行選擇?赡芪淖謱(xiě)的有點(diǎn)不太清楚,還是以表格來(lái)說(shuō)明:




MCU 型號(hào)
FLASH大小
STM32F10X_LD
STM32F101xx
STM32F102xx
STM32F103xx
16 ~ 32 Kbytes
STM32F10X_MD
STM32F101xx
STM32F102xx
STM32F103xx
64 ~ 128 Kbytes
STM32F10X_HD
STM32F101xx
STM32F103xx
256 ~ 512 Kbytes
STM32F10X_CL
STM32F105xx
STM32F107xx
忽略
這些參數(shù),和MDK的設(shè)備參數(shù)一致,如圖所示:







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1