今天在編寫flash的程式時候,在最後,所有的程式都已經編寫完成,經過測試,沒有問題。接下來就是整理程式,自己將一些函式封裝,可以便於自己以後移植,但是問題就出現在了這兒。
我在封裝的過程中,突然發現自己如果將spi模式初始化函式放置在 cs引腳初始化後面,接下來直接讀取 flash晶元id的時候使用jlink讀取的資料就不能顯示正常,顯示資料為0xffff,但是,如果我將spi模式初始化函式放置在 cs引腳初始化前面,整個程式執行是正常的。
真的是百思不得其解,我當時在想,不應該是cs初始化的影響,但是自己真的是沒找見問題,最後,就到21ic上面去求助,當時我寫完問題之後,接下來做什麼? 接著自己找問題唄,還能做什麼。
當時我又重新閱讀我寫的程式,突然發現我好像在初始化cs引腳的時候,沒有設定輸出速率(當時的我是這麼認為 埠x的模式位的),唉,那就初始化唄,結果我初始化之後,我再將spi模式初始化函式放置在 cs引腳初始化後面。結果程式正常執行!
當時就傻眼了,自己覺的這個輸出速率不應該影響這麼大吧,自己查詢資料手冊,仔細閱讀關於gpio設定這塊的資料。結果才發現,原來自己以前真的是想錯了。
下面上圖,資料手冊中關於gpio模式初始化函式的說明:
看到這張表的時候我就知道自己是錯了,原來,這個mode是gpio的輸出模式位,只有選擇了這個位,才能確定gpio的輸入輸出特性。只有選擇為輸出模式,才能接下來配置為推挽、開漏、推挽復用、開漏復用模式。同樣,配置為輸入模式,才能配置為模擬、浮空、上拉、下拉輸入模式。
stm32在上電復位之後,預設的輸出模式時 00(也就是輸入模式),所以,我上面沒有設定cs引腳的輸出模式,才造成了cs引腳不起作用。
在仔細閱讀關於stm32庫函式實現方法之後,我發現,stm32庫函式中對於gpio使用的是一種更為精妙的方法。
先上原始碼:首先是看一下關於stm32 gpio結構體內部:
分為三個結構體變數:gpio_pin,gpio_speed,gpio_mode。
其中,gpio_speed和gpio_mode同時也是乙個結構體。分別初始化gpio引腳的輸出速率和模式。
接下來,看一下gpio_speed可以選擇的取值,明顯發現這個的引數的設定,就是關於stm32 gpio引腳的輸出速率設定。
typedef enum
gpiospeed_typedef;
接下來,看一下gpio_mode的取值:
typedef enum
gpiomode_typedef;
在閱讀資料手冊的時候發現,如果是直接才做暫存器,對於gpio模式的控制位只有2位,所以,是不會出現0x14,0x10,0x1c,0x18這些取值的。這裡,如果想知道為什麼庫函式中會這樣的設定,就必須接著看gpio_init函式。
currentmode = ((uint32_t)gpio_initstruct->gpio_mode) & ((uint32_t)0x0f);
if ((((uint32_t)gpio_initstruct->gpio_mode) & ((uint32_t)0x10)) != 0x00)
對於gpio_init函式,傳遞進來的引數,先通過mode引數,設定了gpio模式引數,再接著根據傳遞的mode的值,判斷此gpio設定為輸入模式還是輸出模式,如果是輸出模式,才會進行設定gpio的速率,如果是輸入模式,忽略掉速率的設定。
STM32 GPIO模式總結
4種輸入模式 浮空輸入 上拉輸入 下拉輸入 模擬輸入 4種輸出模式 開漏輸出 復用開漏輸出 推挽輸出 復用推挽輸出 3種最大輸出速度 2mhz 10mhz 50mhz 浮空輸入模式 1 外部通過io口輸入電平,外部電平通過上下拉部分 浮空模式下都關閉,既無 上拉也無下拉電阻 2 傳輸到施密特觸發器 ...
STM32GPIO模式詳解
stm32gpio模式詳解 輸入浮空 浮空就是邏輯器件與引腳即不接高電平,也不接低電平。由於邏輯器件的內部結構,當它輸入引腳懸空時,相當於該引腳接了高電平。一般實際運用時,引腳不建議懸空,易受干擾。通俗講就是浮空就是浮在空中,就相當於此埠在預設情況下什麼都不接,呈高阻態,這種設定在資料傳輸時用的比較...
STM32 GPIO的幾種工作模式
1 模擬輸入 i o口當作input使用,並且是模擬輸入。模擬狀態下用來接收模擬量 電壓值 一般用於ad採集。2 浮空輸入 沒有上拉和下拉電阻,當引腳沒有和外部電路連線時,i o埠的電平是不確定的,即使外部的乙個很小的輸入訊號都會使其發生變化。3 上拉輸入 引腳內部有乙個上拉電阻通過開關連線到電源v...