1.原因源于大家平時對網(wǎng)上大量不規(guī)范的例程的拷貝使用
2.比如在配置定時器輸出pwm時候,一般網(wǎng)上抄的例程如下:
//4、初始化輸出比較模式、配置輸出比較模式的結構體參數(shù)
TIM_OCStructInit(&TIM_OCInitStruct);//配置輸出比較結構體的參數(shù)
TIM_OCInitStruct.TIM_Pulse=50; //配置CCR寄存器,控制占空比
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; //配置輸出比較模式
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//控制輸出的極性
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//輸出使能
TIM_OC1Init(TIM2,&TIM_OCInitStruct);
這里是有問題的,因為結構體TIM_OCInitStruct的成員不止這幾個,如果不寫全,那其他幾個的值是棧里面的數(shù)據(jù),棧數(shù)據(jù)是之前的函數(shù)執(zhí)行后留下的,這樣其他幾個沒寫出來的成員就成了棧污染的受害者了。此時如果就這么初始化了,有時候會出現(xiàn)奇怪的BUG:比如通道關閉后IO仍然維持高電平。
3.正確的做法, 寫全所有的結構體成員 :
//初始化TIM8 Channel3 PWM模式
/*
在PWM模式(模式1或模式2)下, TIMx_CNT和TIMx_CCRx始終在進行比較,
(依據(jù)計數(shù)器的計數(shù)方向)以確 定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。
*/
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable; //所有成員初始化,否則數(shù)據(jù)不確定
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; //所有成員初始化,否則數(shù)據(jù)不確定
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; //所有成員初始化,否則數(shù)據(jù)不確定
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性高
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //輸出空閑狀態(tài)是互補輸出和死區(qū)插入那一節(jié)里面的知識,這里沒影響
TIM_OCInitStructure.TIM_Pulse=0;
TIM_OC1Init(TIM8, &TIM_OCInitStructure); //根據(jù)指定的參數(shù)初始化外設TIM8 OC3
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH1預裝載使能,預裝載值在更新事件到來時被加載至當前寄存器中
4.辯論:
1)不明寫,編譯器也會給局部變量賦為0
答:
(1)或許有的編譯器會將未幅值的局部變量賦0,但不能保證每個編譯器都這么做??傊捶灯渲凳遣淮_定的(很容易驗證:搞兩個函數(shù)執(zhí)行打印一下實測出來)
(2)在單片機程序里面,沒寫的寄存器不等于就是要賦0,所以即使編譯器幫忙賦0了,也是不對的
2)可以用類似stm32單片機庫函數(shù)中的deinit規(guī)避棧污染
答:
deinit只是將寄存器的值恢復到默認,不能清棧數(shù)據(jù)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5607瀏覽量
129865 -
PWM
+關注
關注
116文章
5865瀏覽量
225422 -
定時器
+關注
關注
23文章
3367瀏覽量
123341 -
STM32單片機
+關注
關注
59文章
553瀏覽量
60586
發(fā)布評論請先 登錄
相關推薦
熱點推薦
定義IO初始化結構體
由上述IOPORT相關功能的枚舉類型我們可以知道,在對IOPORT模塊進行初始化時需要根據(jù)情況配置它們。因此我們定義一個IOPORT初始化的結構體類型IOPORT_Init_t,它的
esp32調(diào)試MQTT的程序,如何對.host初始化?
esp_mqtt_client_config_t mqtt_cfg這個結構體的時候,你們例程里面只初始化url,但是我在網(wǎng)上看到很多地方的參考程序都是初始化這些
發(fā)表于 06-11 07:55
QT解決串口數(shù)據(jù)接收不完整問題
1. 相關文章匯總(1)QT解決串口數(shù)據(jù)接收不完整問題(貌似貼出的代碼可以存下串口接受的全部數(shù)據(jù))(2)qt中使用串口類接收數(shù)據(jù)不完整 (3)Qt5.7串口接收數(shù)據(jù)不完整因為串口本來就不是一次接收
發(fā)表于 08-18 06:58
【原創(chuàng)分享】變量的初始化技巧
,第二種使用對結構體成員變量賦值的方式。實質(zhì)上,第1種方式編譯器將自動生成一些指令完成變量a的初始化,而第2種方式編譯器在處理Score a語句的時候只需要開辟
發(fā)表于 09-08 15:28
怎樣去解決stm32串口DMA數(shù)據(jù)接收不完整的問題呢
stm32串口DMA數(shù)據(jù)接收不完整問題說明最近做了一個項目需要用串口來接收模塊端的應答數(shù)據(jù),由于使用了實時操作系統(tǒng),考慮中斷嵌套或被打斷的問題導致數(shù)據(jù)接收不完整的問題,使用串口dma接收數(shù)據(jù),但
發(fā)表于 02-21 06:19
結構體數(shù)組的初始化
char i; TEST data1[5] = {{1,2},{3,4},{5,6},{7,8},{9,10}};//經(jīng)常使用的初始化方式TEST data2[5] ={0};//初始全為0,否則
發(fā)表于 05-21 15:24
FAQ0066結構體成員未完全初始化導致程序異常的解決方法
使用非官方程序,由于某些外設驅(qū)動在配置結構體時,未完全初始化所有成員,導致程序運行異常。以 FSMC 為例,F(xiàn)SMC_NORSRAMInit
發(fā)表于 10-20 06:59
結構體的定義、初始化和賦值
type)的一類。結構體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復雜的數(shù)據(jù)結構。結構體同時也是一些元素的集合,這些元素稱為
發(fā)表于 11-20 09:29
?6w次閱讀
在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決
本文檔的主要內(nèi)容詳細介紹的是在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決。
發(fā)表于 08-20 17:31
?0次下載
Keil使用結構體數(shù)組的奇怪問題
今天用keil的時候發(fā)現(xiàn)一個很奇怪的點,是關于結構體數(shù)組的。首先說明我的keil版本是:V5.28.0.0問題是這樣的:我在a.h文件定義了一個結構
發(fā)表于 11-21 16:36
?3次下載
stm32串口DMA數(shù)據(jù)接收不完整問題說明
stm32串口DMA數(shù)據(jù)接收不完整問題說明最近做了一個項目需要用串口來接收模塊端的應答數(shù)據(jù),由于使用了實時操作系統(tǒng),考慮中斷嵌套或被打斷的問題導致數(shù)據(jù)接收不完整的問題,使用串口dma接收數(shù)據(jù),但
發(fā)表于 12-24 19:37
?22次下載
淺談C語言中的三種不完整類型
不完整類型(Incomplete types)是缺少足夠信息來確定該類型對象大小的對象類型,不完整類型可以在翻譯單元的某些點完整。
發(fā)表于 12-16 09:52
?888次閱讀
Simulink模型測試典型問題分享-接口定義不完整
典型測試問題分享-接口定義不完整
問題描述:
?計算模塊未定義數(shù)值范圍,存在越界風險。
?信號未規(guī)定精度和誤差范圍,導致背靠背測試未通過。
結構體成員初始化不完整從而受到棧污染導致奇怪bug
評論