1.原因源于大家平時對網上大量不規范的例程的拷貝使用
2.比如在配置定時器輸出pwm時候,一般網上抄的例程如下:
//4、初始化輸出比較模式、配置輸出比較模式的結構體參數
TIM_OCStructInit(&TIM_OCInitStruct);//配置輸出比較結構體的參數
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的成員不止這幾個,如果不寫全,那其他幾個的值是棧里面的數據,棧數據是之前的函數執行后留下的,這樣其他幾個沒寫出來的成員就成了棧污染的受害者了。此時如果就這么初始化了,有時候會出現奇怪的BUG:比如通道關閉后IO仍然維持高電平。
3.正確的做法, 寫全所有的結構體成員 :
//初始化TIM8 Channel3 PWM模式
/*
在PWM模式(模式1或模式2)下, TIMx_CNT和TIMx_CCRx始終在進行比較,
(依據計數器的計數方向)以確 定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。
*/
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable; //所有成員初始化,否則數據不確定
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; //所有成員初始化,否則數據不確定
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; //所有成員初始化,否則數據不確定
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式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; //輸出空閑狀態是互補輸出和死區插入那一節里面的知識,這里沒影響
TIM_OCInitStructure.TIM_Pulse=0;
TIM_OC1Init(TIM8, &TIM_OCInitStructure); //根據指定的參數初始化外設TIM8 OC3
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH1預裝載使能,預裝載值在更新事件到來時被加載至當前寄存器中
4.辯論:
1)不明寫,編譯器也會給局部變量賦為0
答:
(1)或許有的編譯器會將未幅值的局部變量賦0,但不能保證每個編譯器都這么做。總之未幅值其值是不確定的(很容易驗證:搞兩個函數執行打印一下實測出來)
(2)在單片機程序里面,沒寫的寄存器不等于就是要賦0,所以即使編譯器幫忙賦0了,也是不對的
2)可以用類似stm32單片機庫函數中的deinit規避棧污染
答:
deinit只是將寄存器的值恢復到默認,不能清棧數據。
-
寄存器
+關注
關注
31文章
5424瀏覽量
123497 -
PWM
+關注
關注
116文章
5409瀏覽量
218256 -
定時器
+關注
關注
23文章
3289瀏覽量
117335 -
STM32單片機
+關注
關注
59文章
549瀏覽量
59414
發布評論請先 登錄
esp32調試MQTT的程序,如何對.host初始化?
QT解決串口數據接收不完整問題
【原創分享】變量的初始化技巧
Keil使用結構體數組的奇怪問題相關資料下載
怎樣去解決stm32串口DMA數據接收不完整的問題呢
結構體數組的初始化
FAQ0066結構體成員未完全初始化導致程序異常的解決方法
結構體的定義、初始化和賦值
在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決

Keil使用結構體數組的奇怪問題

stm32串口DMA數據接收不完整問題說明

淺談C語言中的三種不完整類型
如何獲取ChatGPT回答不完整的內容

評論