STM32入口引數檢查

2021-07-15 01:19:31 字數 2325 閱讀 6394

發表於:2015-4-1

閱讀:3,372次

使用stm32庫函式的時候,你會發現帶引數的庫函式前面都有assert_param語句。

例如我們隨便看乙個庫函式,如下所示:

這個函式是3.5版本庫函式stm32f10x_tim.c中的定時器復位函式。

assert_param語句的作用?

assert_param語句是用於程式開發的時候,除錯用的檢測語句。預設是不開啟的,你可以無視它的存在。但是,當你在除錯程式的時候,可以開啟這個檢測機制,除錯完了再關閉。

怎麼使assert_param起作用?

檢視assert_param的定義,位於stm32f10x_conf.h檔案,你會發現它實際上是個巨集,看它的條件編譯語句,你會發現,把use_full_assert定義後,即可開啟assert_param這個引數檢測機制。use_full_assert這個巨集定義已經在檔案中隱掉,我們把它的注釋符號去掉即可。

看上圖中第59行**,是個條件編譯語句,意思是:如果定義了use_full_assert,就把assert_param定義為乙個三目運算的結構(第68行),否則(第71行),就把assert_param定義成((void)0)(第72行)。也就是說,你只有定義了use_full_assert,assert_param才會起作用,這個作用就是通過乙個三目運算結構(如下)來判斷的。關於三目運算的基礎知識,請看

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__file__, __line__))
assert_param語句的作用是檢測函式的引數是否符合該函式的要求,例如上面的函式中的引數就是timx,我們找到is_tim_all_periph這個定義,可以看到timx中的x的範圍是1~17,也就是說,你要是把函式寫成tim_deinit(tim1);assert_param的結果就是(void)0,如果你把函式寫成tim_deinit(tim18);就會呼叫assert_failed函式。

#define is_tim_all_periph(periph) (((periph) == tim1) || \

((periph) == tim2) || \

((periph) == tim3) || \

((periph) == tim4) || \

((periph) == tim5) || \

((periph) == tim6) || \

((periph) == tim7) || \

((periph) == tim8) || \

((periph) == tim9) || \

((periph) == tim10)|| \

((periph) == tim11)|| \

((periph) == tim12)|| \

((periph) == tim13)|| \

((periph) == tim14)|| \

((periph) == tim15)|| \

((periph) == tim16)|| \

((periph) == tim17))

assert_failed函式怎麼寫?

如上,當你定義了use_full_asset之後,你立即編譯,編譯器會報錯,提示assert_failed函式沒有定義。我們把assert_failed這個函式放到mian.c檔案中,如下定義:

void assert_failed(uint8_t* file, uint32_t line)

上面函式的意思就是,如果引數出錯,輸出出錯的檔名稱和行號。結果是輸出到串列埠,用串列埠除錯助手可以看到輸出結果。注意,編譯器build output欄是不會報錯的。

下面給出乙個例程,故意寫錯引數,通過stm32串列埠1把錯誤引數的檔名稱和行數發到串列埠,你開啟串列埠除錯助手即可看到結果。

我是瑞生,毫無保留的給大家透露電子設計經驗,不定時分享實用的落地的電子設計技巧,希望能夠幫助到大家。有什麼寫的不對的地方,還請指出!

STM32 程式入口

stm32的啟動需要依賴啟動檔案,不同編譯器的啟動檔案不同,這裡以startup stm32f407xx.s為例,它主要進行了以下工作 復位子程式是系統上電後第乙個執行的程式 reset handler reset handler proc export reset handler weak imp...

STM32中PWM的引數配置

我們引用st官方給出的f10xstd3.5的庫中的tim pwm output中的例程來舉例 可以看出配置pwm引數主要是倆個函式 prescalervalue uint16 t systemcoreclock 24000000 1 time base configuration tim timeb...

預熱2 什麼是STM32?認識STM32

1 什麼是stm32 stm32是由arm公司設計,意法半導體 st 公司生產的基於 arm cortex m 核心的32 位的mcu 系列。2 stm32能做什麼?stm32 屬於乙個微控制器,適用於控制類,自帶了各種常用通訊介面,比如 usart i2c spi 等,可接非常多的感測器,可以控制...