EFM32 筆記 IO操作

2021-07-02 05:23:50 字數 2571 閱讀 3728

efm32的io叫做gpio(generalpurposeinput/output,通用輸入輸出介面),其他的功能先不研究,最起碼的io功能應該可以實現吧。

efm32的gpio每16個一組,這些組分別叫做a、b、c……,每一組分別叫做0、1、2……15,因此他們的io口可以叫做pb0、pe3、pd11……。

對io各個感測器進行設定或讀取的時候,這些暫存器包括model、modeh、din、dout、doutset、doutclr、douttgl等等,使用這樣的方式:gpio->p[4].dout=0x000c;

其中,p[4]代表pe。0為a,1為b,2為c,3為d,4為e……,dout表示對其dout暫存器進行設定或讀取。有的暫存器需要32位的資料來表示或設定,有的需要的就比較少。比如model就需要乙個32位的資料,而dout只需要16位就夠了。

每乙個io口的功能用乙個四位來描述(0xf),具體含義見表。那麼16個io口,需要使用16×4=64位來表示,而efm32是乙個32位的處理器,因此處理器裡面使用兩個暫存器來處理這16個io功能描述:gpio_px_model和gpio_px_modeh。gpio_px_model來描述前8個io口,gpio_px_modeh來描述後8個io口。因此在處理io口模式的時候,要判斷此io口是前8個還是後8個,然後將描述數值寫入對應的那個地方。

比如要寫入pe2和pe3兩個io口為推挽式輸出,對應描述數值為0x4。因為2和3對屬於前8個io口,因而應該用gpio_px_model來寫入,因此應該在gpio->p[4].model裡面寫入兩個0x4,具體為0x4<<(2 * 4) + 0x4<< (3 * 4)。

對gpio引腳的輸出進行設定,可以使用三種方式:

1.直接寫入gpio_px_dout暫存器,比如使得pe2和pe3輸出為1,則為:gpio->p[4].dout=0x000c;

gpio->p[4].dout共有16位,因此需要使用乙個0xffff來表示

2.向gpio_px_doutset的對應位上寫1,就可以將該位設定為高電平。

3.向gpio_px_doutclr的對應位上寫1,就可以將該位設定為低電平。

4.向gpio_px_douttgl的對應位上寫1,就可以將該位的電平反轉。

對gpio_px_dout進行讀取,就可以獲取各個位的電平資訊,因此可以使用gpio->p[4].dout^=0x000c;來反轉pe2和pe3兩個io的電平,不過還是建議用方法4來反轉電平,因為速度更快;而對gpio_px_doutset、gpio_px_doutclr、gpio_px_douttgl讀取,始終讀到的都是0。

gpio_px_din暫存器。無論該io口被設定為輸入還是輸出,讀取din暫存器,都可以得到該io口當前的電平狀態。系統之使用din暫存器的前16位,因為每乙個px只有16個io口。

gpio_px_model, gpio_px_modeh, gpio_px_ctrl,gpio_px_pinlockn,gpio_extipsell,gpio_extipselh,gpio_insense 

andgpio_route這些暫存器都可以鎖定,只需要向gpio_lock暫存器寫入不等於0xa534的數。如果向gpio_lock寫入0xa534,將會解鎖。

對於每一組的每乙個io口的這些這些暫存器,都可以單獨的鎖定,只需要將gpio_px_pinlockn(16位配置有效)相應的位寫0即可。在系統啟動的時候,這些位都被置1,也就是每一組的gpio_px_pinlockn均為0xffff。

另外對gpio操作之前,要首先使能它的時鐘。gpio使用的hfperclk,它本身在reset的時候預設為使能狀態的(也可以在後期關閉,以進一步節省能耗)。還要在hfperclken0的相關位進行設定,使得gpio能夠使用hfperclk,也就是他的第13位,具體為0x2000的位置。然後就可以對gpio進行各方面的操作。在操作完成之後,如果確定不再使用gpio的功能可以清空該位,如果在某些特殊的應用裡面,確定不使用例如ad、da、timer、uart等常見功能的話,可以進一步關閉hfperclk(hfperclkdiv暫存器的第8位清零),以節省更多的電量。

對這些cmu暫存器進行操作的時候,使用語句形如:cmu->hfperclken0 =0x2000;

[疑問]在對gpio控制之前,需要首先設定相應的時鐘,即前面要加入cmu_clockenable(cmuclock_hfper,true);cmu_clockenable(cmuclock_gpio,true);這兩行。實際上只新增第二行即可。這讓我感到迷茫。對於io操作的時候,難道io口還要加入時鐘的支援(雖然資料手冊上說:高頻外設時鐘有hfclk分頻得到,用來驅動高頻外設,如gpio、adc等)。難道gpio電平的設定以及反轉都需要該時鐘的支援?

經過試驗檢視確實是這樣的,在沒有加入cmu_clockenable(cmuclock_gpio,true);這句話時,對io口所有的操作都沒有發生作用,即使主程式已經執行了對io口的操作,io口的那些暫存器(model等)都沒有發生改變,甚至是pinlockn都處在0的狀態(鎖定)。這說明外部高頻時鐘沒有起作用的時候,io根本就沒有進行初始化。

然後我試驗了這樣的操作,也就是先對io口進行操作,然後在開啟外部高頻時鐘,發現時鐘被開啟後,io口進行了初始化(pinlockn已經變成了0xffff),但是原來對io口進行的所有的操作語句都沒有起作用。這說明所有對gpio進行的操作都必須在外部高頻時鐘下進行。

EFM32片內外設 WDT基本操作

如?下是看門狗的基本介紹以及基本的操作。大致上還算比較簡單。efm32的wdt不同於其他mcu,wdt不能用作定時器,如果看門狗溢位,一定會引起系統復位。同時在程式中也可以查詢復位的標誌位來判斷是否為看門狗引起的復位。另外就是,僅可以在wdt使能的狀態下,才可以對wdt的暫存器進行操作。最後,一般習...

python3 2筆記(程式設計)

python中對檔案 資料夾的操作需要涉及到os模組和shutil模組。一 檔案開啟 f open name mode buffering 入口引數 name 檔名 mode 選項,字串 buffering 是否緩衝 0 不緩衝,1 緩衝,1的int數 緩衝區大小 返回值 檔案物件 mode 選項 ...

STM32筆記記錄

串列埠記錄 stm32有好幾個串列埠。比如說stm32f103zet6有5個串列埠,串列埠1的引腳對應的io為pa9,pa10.pa9,pa10預設功能是gpio,所以當pa9,pa10引腳作為串列埠1的tx,rx引腳使用的時候,那就是埠復用。復用埠初始化有幾個步驟 1 gpio埠時鐘使能。要使用到...