日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]我們?cè)趯W(xué)STM32的時(shí)候函數(shù)assert_param出現(xiàn)的幾率非常大,上網(wǎng)搜索一下,網(wǎng)上一般解釋斷言機(jī)制,做為程序開(kāi)發(fā)調(diào)試階段時(shí)使用。下面我就談一下我對(duì)這些應(yīng)用的看法,學(xué)習(xí)東西抱著知其然也要知其所以然。4 斷言機(jī)制函數(shù)a

我們?cè)趯W(xué)STM32的時(shí)候函數(shù)assert_param出現(xiàn)的幾率非常大,上網(wǎng)搜索一下,網(wǎng)上一般解釋斷言機(jī)制,做為程序開(kāi)發(fā)調(diào)試階段時(shí)使用。下面我就談一下我對(duì)這些應(yīng)用的看法,學(xué)習(xí)東西抱著知其然也要知其所以然。
4 斷言機(jī)制函數(shù)assert_param
我們?cè)诜治鰩?kù)函數(shù)的時(shí)候,幾乎每一個(gè)函數(shù)的原型有這個(gè)函數(shù)assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));為例說(shuō)一下我的理解,函數(shù)的參數(shù)IS_GPIO_ALL_PERIPH(GPIOx),我們可以尋找到原型
#define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH)) == GPIOA_BASE)||
((*(uint32_t*)&(PERIPH)) == GPIOB_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOC_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOD_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOE_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOF_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOG_BASE))
這個(gè)宏定義的作用就是檢查參數(shù)PERIPH,判斷參數(shù)PERIPH是否為GPIOX(A...G)基址中的一個(gè),只要有一個(gè)為真則其值為真,否則為假,不用多說(shuō),這是C語(yǔ)言中基本的邏輯運(yùn)算。當(dāng)然這個(gè)庫(kù)函數(shù)也用的很有意思,看:首先對(duì)PERIPH進(jìn)行取址,也就是求地址,&PERIPH,然后對(duì)這個(gè)地址強(qiáng)制轉(zhuǎn)化為32位的指針,即前面加(uint32_t *),然后通過(guò)*進(jìn)行訪問(wèn)這個(gè)地址(指針)中的內(nèi)容。不多說(shuō)了,看幾遍就能明白。
下面我們?cè)倩氐絘ssert_param這個(gè)函數(shù),這個(gè)函數(shù)是哪里的呢?在stm32f10x_conf.h尋找到原型如下:
#ifdef USE_FULL_ASSERT

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t*)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
這是一個(gè)預(yù)編譯文件,若是定義了USE_FULL_ASSERT這個(gè)文件,則執(zhí)行后面的文件,我們?cè)诔绦蛑幸话愣紱](méi)什么定義,即執(zhí)行后面這個(gè)語(yǔ)句((void)0),這個(gè)語(yǔ)句不用多想,沒(méi)有定義USE_FULL_ASSERT就是什么也不執(zhí)行。說(shuō)的明白點(diǎn),對(duì)上面的那個(gè)語(yǔ)句IS_GPIO_ALL_PERIPH(GPIOx)不執(zhí)行任何操作。
若是定義了USE_FULL_ASSERT它,我們調(diào)用這個(gè)函數(shù)assert_param時(shí),及對(duì)參數(shù)IS_GPIO_ALL_PERIPH(GPIOx)的正確性進(jìn)行檢查,通過(guò)一個(gè)C語(yǔ)言中的雙目運(yùn)算符來(lái)判斷,若是返回1,執(zhí)行語(yǔ)句(void)0,跟上面一樣,若是返回0,則執(zhí)行后面的函數(shù)assert_failed((uint8_t *)__FILE__,__LINE__),函數(shù)的作用在庫(kù)函數(shù)中有解釋,用來(lái)指示出錯(cuò)的行數(shù)和文件。注意:__FILE__,__LINE__是標(biāo)準(zhǔn)庫(kù)函數(shù)中的宏定義!切記
void assert_failed(uint8_t* file, uint32_t line);剛開(kāi)始沒(méi)看明白為什么加在這里,仔細(xì)一想是在頭文件的函數(shù)聲明。至于函數(shù)實(shí)體呢?我們從官方文件的模板中main.c中可以找到。如下:
void assert_failed(u8* file, u32 line)
{ /* User can add his own implementation to report the file name and linenumber,
ex: printf("Wrong parameters value: file %s on line %drn", file,line) */
/* Infinite loop */
while (1) { }
} 英文注釋也說(shuō)明了怎么應(yīng)用,通過(guò)輸入?yún)?shù)來(lái)確定位置,最簡(jiǎn)單的方法就是串口打印了,這個(gè)函數(shù)的主要思想是在輸入?yún)?shù)有問(wèn)題的時(shí)候,但是有編譯不出來(lái),它可以幫你檢查參數(shù)的有效性,好處不必多言,自己領(lǐng)悟就行。
繼續(xù)說(shuō)明如下: assert_param是怎樣包含進(jìn)去的呢?我們?cè)趕tm32f10x_conf.h這個(gè)頭文件中定義的函數(shù)聲明還是宏定義,怎么在其它文件中都能應(yīng)用呢?也很多網(wǎng)上朋友在剛開(kāi)始學(xué)習(xí)的時(shí)候都遇到編譯不過(guò)去的問(wèn)題出現(xiàn),最后通過(guò)在文件中添加USE_STDPERIPH_DRIVER來(lái)解決的:


我們可以在整個(gè)工程中進(jìn)行搜索USE_STDPERIPH_DRIVER,通過(guò)頭文件可以看出,是使用標(biāo)準(zhǔn)外設(shè)文件。在stm32f10x.h文件中我們可以搜索到如下情況:
#if !defined USE_STDPERIPH_DRIVER
/**
* @brief Comment the line below if you will not use the peripherals drivers.
In this case, these drivers will not be included and the application code will
be based on direct access to peripherals registers
*/
#define USE_STDPERIPH_DRIVER
#endif

#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif
可以很容易看出來(lái),我們不在那里添加,這個(gè)頭文件中也給我們?cè)O(shè)置了開(kāi)關(guān),只要把第一個(gè)的注釋去掉,就不用在配置中添加USE_STDPERIPH_DRIVER了,在第二個(gè)文件中我們可以知道怎樣包含這個(gè)控制開(kāi)關(guān)文件了,呵呵。我們也明白為什么我們?cè)趯懗绦虻臅r(shí)候只要包含stm32f10x.h就能很容易的包含所有的文件文件了吧,我們只要在stm32f10x_conf.h配置一下就能包含所需要的庫(kù)文件了。
通過(guò)以上可以看出,通過(guò)頭文件的相互包含,來(lái)控制外設(shè)以及調(diào)試文件的調(diào)用,這樣我們理清思路,理解起來(lái)就好多了。當(dāng)然在學(xué)習(xí)中可能有些C語(yǔ)言問(wèn)題還沒(méi)有理解透徹,多上網(wǎng)搜一下,或者多看書,很快就搞明白的。



PS 2:

STM32中assert_param的使用

在STM32的固件庫(kù)和提供的例程中,到處都可以見(jiàn)到assert_param()的使用。如果打開(kāi)任何一個(gè)例程中的stm32f10x_conf.h文件,就可以看到實(shí)際上assert_param是一個(gè)宏定義;
在固件庫(kù)中,它的作用就是檢測(cè)傳遞給函數(shù)的參數(shù)是否是有效的參數(shù)。
所謂有效的參數(shù)是指滿足規(guī)定范圍的參數(shù),比如某個(gè)參數(shù)的取值范圍只能是小于3的正整數(shù),如果給出的參數(shù)大于3,
則這個(gè)assert_param()可以在運(yùn)行的程序調(diào)用到這個(gè)函數(shù)時(shí)報(bào)告錯(cuò)誤,使程序員可以及時(shí)發(fā)現(xiàn)錯(cuò)誤,而不必等到程序運(yùn)行結(jié)果的錯(cuò)誤而大費(fèi)周折。


這是一種常見(jiàn)的軟件技術(shù),可以在調(diào)試階段幫助程序員快速地排除那些明顯的錯(cuò)誤。

它確實(shí)在程序的運(yùn)行上犧牲了效率(但只是在調(diào)試階段),但在項(xiàng)目的開(kāi)發(fā)上卻幫助你提高了效率。

當(dāng)你的項(xiàng)目開(kāi)發(fā)成功,使用release模式編譯之后,或在stm32f10x_conf.h文件中注釋掉對(duì)USE_FULL_ASSERT的宏定義,所有的assert_param()檢驗(yàn)都消失了,不會(huì)影響最終程序的運(yùn)行效率。

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
。。。

assert_param(IS_ADC_ALL_PERIPH(ADCx));
。。。

在執(zhí)行assert_param()的檢驗(yàn)時(shí),如果發(fā)現(xiàn)參數(shù)出錯(cuò),它會(huì)調(diào)用函數(shù)assert_failed()向程序員報(bào)告錯(cuò)誤,在任何一個(gè)例程中的main.c中都有這個(gè)函數(shù)的模板,如下:

void assert_failed(uint8_t* file, uint32_t line)
{


while (1)
{}
}

你可以按照自己使用的環(huán)境需求,添加適當(dāng)?shù)恼Z(yǔ)句輸出錯(cuò)誤的信息提示,或修改這個(gè)函數(shù)做出適當(dāng)?shù)腻e(cuò)誤處理。

1、STM32F10xD.LIB是DEBUG模式的庫(kù)庫(kù)文件。
2、STM32F10xR.LIB是Release模式的庫(kù)庫(kù)文件。
3、要選擇DEBUG和RELEASE模式,需要修改stm32f10x_conf.h的內(nèi)容。
#define DEBUG 表示DEBUG模式,把該語(yǔ)句注釋掉,則為RELEASE模式。
4、要選擇DEBUG和RELEASE模式,也可以在Options,C/C++,Define里填入DEBUG的預(yù)定義。
這樣,就不需要修改stm32f10x_conf.h的內(nèi)容。
5、如果把庫(kù)加入項(xiàng)目,則不需要將ST的庫(kù)源文件加入項(xiàng)目,比較方便。
但是,庫(kù)的選擇要和DEBUG預(yù)定義對(duì)應(yīng)。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開(kāi)發(fā)中,STM32的時(shí)鐘系統(tǒng)因其靈活性和復(fù)雜性成為開(kāi)發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡(jiǎn)單的時(shí)鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時(shí)鐘源選擇、PLL配置、總線時(shí)鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時(shí)鐘系統(tǒng)

在嵌入式系統(tǒng)開(kāi)發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測(cè)等場(chǎng)景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動(dòng)下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革。基于STM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動(dòng)態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

當(dāng)前智能家居產(chǎn)品需求不斷增長(zhǎng) ,在這一背景下 ,對(duì)現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計(jì)出基于STM32單片機(jī)的全 自動(dòng)家用澆花機(jī)器人。該設(shè)計(jì)主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過(guò)麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過(guò)性強(qiáng)

用c++編程似乎是讓你的Arduino項(xiàng)目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個(gè)圖形化編程平臺(tái)將復(fù)雜電子項(xiàng)目的創(chuàng)建變成了拖動(dòng)和連接塊的簡(jiǎn)單任務(wù)。在本文中,我們將帶您完成使...

關(guān)鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術(shù)的無(wú)線傳感網(wǎng)絡(luò)憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測(cè)、工業(yè)自動(dòng)化等場(chǎng)景的核心解決方案。然而,如何在復(fù)雜電磁環(huán)境中實(shí)現(xiàn)高效休眠調(diào)度與動(dòng)態(tài)信道優(yōu)化,成為提升網(wǎng)絡(luò)能效與可靠性的關(guān)鍵挑戰(zhàn)。本...

關(guān)鍵字: STM32 LoRa

在實(shí)時(shí)控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對(duì)時(shí)間敏感的應(yīng)用場(chǎng)景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(wèn)(DMA)...

關(guān)鍵字: STM32 DMA

數(shù)字電源技術(shù)向高功率密度、高效率與高動(dòng)態(tài)響應(yīng)方向加速演進(jìn),STM32微控制器憑借其基于DSP庫(kù)的算法加速能力與對(duì)LLC諧振變換器的精準(zhǔn)控制架構(gòu),成為優(yōu)化電源動(dòng)態(tài)性能的核心平臺(tái)。相較于傳統(tǒng)模擬控制或通用型數(shù)字控制器,STM...

關(guān)鍵字: STM32 數(shù)字電源

STM32微控制器憑借其針對(duì)電機(jī)控制場(chǎng)景的深度優(yōu)化,成為高精度、高可靠性驅(qū)動(dòng)系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機(jī)控制領(lǐng)域的核心優(yōu)勢(shì)集中體現(xiàn)在FOC(磁場(chǎng)定向控制)算法的硬件加速引擎與PWM死區(qū)時(shí)間的動(dòng)態(tài)補(bǔ)...

關(guān)鍵字: STM32 電機(jī)控制

無(wú)線充電技術(shù)加速滲透消費(fèi)電子與汽車電子領(lǐng)域,基于Qi協(xié)議的無(wú)線充電發(fā)射端開(kāi)發(fā)成為智能設(shè)備能量補(bǔ)給的核心課題。傳統(tǒng)模擬控制方案存在響應(yīng)滯后、參數(shù)調(diào)整困難等問(wèn)題,而基于STM32的數(shù)字PID控制結(jié)合FOD(Foreign O...

關(guān)鍵字: STM32 無(wú)線充電
關(guān)閉