STM32庫函數之斷言
這個(gè)宏定義的作用就是檢查參數PERIPH(外圍),判斷參數PERIPH是否為GPIOX(A...G)基址中的一個(gè),只要有一個(gè)為真則其值為真,否則為假,不用多說(shuō),這是C語(yǔ)言中基本的邏輯運算。當然這個(gè)庫函數也用的很有意思,看:首先對PERIPH進(jìn)行取址,也就是求地址,&PERIPH,然后對這個(gè)地址強制轉化為32位的指針,即前面加(uint32_t *),然后通過(guò)*進(jìn)行訪(fǎng)問(wèn)這個(gè)地址(指針)中的內容。不多說(shuō)了,看幾遍就能明白。
#ifdef
#endif
這是一個(gè)預編譯文件,若是定義了USE_FULL_ASSERT這個(gè)文件,則執行后面的文件,我們在程序中一般都沒(méi)什么定義,即執行后面這個(gè)語(yǔ)句((void)0),這個(gè)語(yǔ)句不用多想,沒(méi)有定義USE_FULL_ASSERT就是什么也不執行。說(shuō)的明白點(diǎn),對上面的那個(gè)語(yǔ)句IS_GPIO_ALL_PERIPH(GPIOx)不執行任何操作。若是定義了USE_FULL_ASSERT它,我們調用這個(gè)函數assert_param時(shí),及對參數IS_GPIO_ALL_PERIPH(GPIOx)的正確性進(jìn)行檢查,通過(guò)一個(gè)C語(yǔ)言中的雙目運算符來(lái)判斷,若是返回1,執行語(yǔ)句(void)0,跟上面一樣,若是返回0,則執行后面的函數assert_failed((uint8_t *)__FILE__, __LINE__),函數的作用在庫函數中有解釋?zhuān)脕?lái)指示出錯的行數和文件。注意:__FILE__, __LINE__是標準庫函數中的宏定義!切記
void assert_failed(uint8_t* file, uint32_t line);剛開(kāi)始沒(méi)看明白為什么加在這里,仔細一想是在頭文件的函數聲明。至于函數實(shí)體呢?我們從官方文件的模板中main.c中可以找到。如下:
{
while (1) { }
} 英文注釋也說(shuō)明了怎么應用,通過(guò)輸入參數來(lái)確定位置,最簡(jiǎn)單的方法就是串口打印了,這個(gè)函數的主要思想是在輸入參數有問(wèn)題的時(shí)候,但是有編譯不出來(lái),它可以幫你檢查參數的有效性,好處不必多言,自己領(lǐng)悟就行。

我們可以在整個(gè)工程中進(jìn)行搜索USE_STDPERIPH_DRIVER,通過(guò)頭文件可以看出,是使用標準外設文件。在stm32f10x.h文件中我們可以搜索到如下情況:
#endif
#ifdef USE_STDPERIPH_DRIVER
#endif
可以很容易看出來(lái),我們不在那里添加,這個(gè)頭文件中也給我們設置了開(kāi)關(guān),只要把第一個(gè)的注釋去掉,就不用在配置中添加USE_STDPERIPH_DRIVER了,在第二個(gè)文件中我們可以知道怎樣包含這個(gè)控制開(kāi)關(guān)文件了,呵呵。我們也明白為什么我們在寫(xiě)程序的時(shí)候只要包含stm32f10x.h就能很容易的包含所有的文件文件了吧,我們只要在stm32f10x_conf.h配置一下就能包含所需要的庫文件了。
評論