GPIO初始化時有時鐘配置、模式配置、輸出配置、復用配置,那么在編寫初始化代碼時,到底該按什么順序執行呢?如果順序不當那初始化過程可能會出現短暫的電平跳變。
第一步,初始化MCU外設時,一般都需要先打開對應寄存器的接口時鐘,所以GPIO時鐘使能一定是第一步,否則后面執行的初始化配置無法寫入到寄存器中。
![wKgZomXWuhOAfLXzAAAGPeiUtSA151.png](https://file1.elecfans.com/web2/M00/C0/8C/wKgZomXWuhOAfLXzAAAGPeiUtSA151.png)
第二步,
對于外設復用的GPIO,則需要先配置好GPIO的重映射或者復用選擇器,讓這個GPIO先內部連接到外設上;
如果我們先初始化GPIO復用模式那么可能默認的復用不是我們想要的外設功能,此時IO按默認外設的默認電平輸出,接著軟件又配置復用選擇器連接到想要的外設,輸出電平再次發生變化,就會出現這個短暫的電平變化。
![wKgaomXWuheAN1ChAAAIwCjFxkk707.png](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWuheAN1ChAAAIwCjFxkk707.png)
對于普通輸出IO,則需要先配置好輸出狀態。
![wKgaomXWuhyAVaxuAAAIGfWwVOg637.png](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWuhyAVaxuAAAIGfWwVOg637.png)
因為寄存器里默認輸出值是0,如果GPIO想要默認狀態高,那初始化完GPIO后再配置IO輸出高也會出現短暫的低電平導致電平變化。
![wKgaomWp4AyAM7YPAABZRh7pnjE665.png](https://file1.elecfans.com/web2/M00/BE/34/wKgaomWp4AyAM7YPAABZRh7pnjE665.png)
第三步,
初始化GPIO模式,其中一般有輸出、輸入、復用、模擬等幾種模式,有的芯片也可以配置內部的上下拉電阻是否開啟,在輸出模式時還有GPIO驅動能力配置。
![wKgZomXWuiaANRjNAAAGjb4uhxY775.png](https://file1.elecfans.com/web2/M00/C0/8C/wKgZomXWuiaANRjNAAAGjb4uhxY775.png)
當然也有特殊情況,以TIMER PWM輸出為例,不同的PWM模式默認電平有高和低兩種情況,和TIMER配置有關,此時我們按標準順序配置好GPIO后再配置TIMER,則也可能出現電平變化,如果PWM用于控制功率開關,則可能對電路帶來不良影響。所以對于這類外設默認電平可配的外設,想要啟動外設工作前保持默認電平的話,我們就可以先初始化好外設,再按標準的順序配置GPIO。
![wKgZomXWuiuAbiRGAAAvRbsiErs176.png](https://file1.elecfans.com/web2/M00/C0/8C/wKgZomXWuiuAbiRGAAAvRbsiErs176.png)
所以GPIO雖然簡單,但實際也有很多細節,想要讓軟硬件更加可靠,需要抓住這些細節優化軟硬件設計。
這里推薦大家購買我們紅楓派開發版,其中的例程和驅動程序就是考慮到細節設計的,可以方便大家二次開發產品。
![wKgaomXWujCAOzfuAALFcXgsaKA003.png](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWujCAOzfuAALFcXgsaKA003.png)
-
單片機
+關注
關注
6037文章
44558瀏覽量
635221 -
mcu
+關注
關注
146文章
17148瀏覽量
351185 -
GPIO
+關注
關注
16文章
1204瀏覽量
52091
發布評論請先 登錄
相關推薦
RT-Thread自動初始化詳解
![RT-Thread自動<b class='flag-5'>初始化</b>詳解](https://file.elecfans.com//web2/M00/4D/5D/poYBAGK2552AP3IhAAERUWXJgTY466.png)
![](https://file1.elecfans.com/web2/M00/C0/8F/wKgZomXWwjWAbhSnAAvxViTKQMA149.png)
控制FPGA上電、配置以及初始化時間
51單片機對SAA7113初始化和控制的程序
解析內核初始化時根內存盤的加載過程
Linux內核初始化過程中的調用順序
藍橋杯單片機的初始化原理和蜂鳴器關閉學習
![藍橋杯<b class='flag-5'>單片機</b>的<b class='flag-5'>初始化</b>原理和蜂鳴器關閉學習](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
關于stm8l05x系列單片機rtc初始化問題
![關于stm8l05x系列<b class='flag-5'>單片機</b>rtc<b class='flag-5'>初始化</b>問題](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
單片機問題總結:MPU6050的DMP模塊初始化放在線程啟動之前
![<b class='flag-5'>單片機</b>問題總結:MPU6050的DMP模塊<b class='flag-5'>初始化</b>放在線程啟動之前](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
解決ds1302外置時鐘模塊重復初始化時間問題(單片機掉電,模塊電池供電)
![解決ds1302外置時鐘模塊重復<b class='flag-5'>初始化時</b>間問題(<b class='flag-5'>單片機</b>掉電,模塊電池供電)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論