STM32埠IO方向設定問題的IO方向設定問題
例程:STM32F103系列 I2C軟體模擬實驗(mini板)
問題:下面兩行關於“IO方向”的程式碼不太明白。
//IO 方向設定
#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
進過研讀開發手冊大概解決了這個問題。
STM32 的 IO 口可以由軟體配置成如下 8 種模式:
1、輸入浮空
2、輸入上拉
3、輸入下拉
4、模擬輸入
5、開漏輸出
6、推輓輸出
7、推輓式複用功能
8、開漏複用功能
每個 IO 口可以自由程式設計,但 IO 口暫存器必須要按 32 位字被訪問。STM32 的很多 IO 口都是 5V 相容的,這些 IO 口在與 5V 電平的外設連線的時候很有優勢,具體哪些 IO 口是 5V 相容的,可以從該晶片的資料手冊管腳描述章節查到(I/O Level 標 FT 的就是 5V 電平相容的)。STM32 的每個 IO 埠都有 7 個暫存器來控制。他們分別是:配置模式的 2 個 32 位的埠配置暫存器 CRL 和 CRH;2 個 32 位的資料暫存器 IDR 和 ODR;1 個 32 位的置位/復位暫存器BSRR;一個 16 位的復位暫存器 BRR;1 個 32 位的鎖存暫存器 LCKR;我們常用的 IO 埠暫存器只有 4 個:CRL、CRH、IDR、ODR。CRL 和 CRH 控制著每個 IO 口的模式及輸出速率。
STM32 的 IO 口位配置表如表 6.1.1 所示:
STM32 輸出模式配置如表 :
接下來我們看看埠低配置暫存器 CRL 的描述
STM32 的 CRL 控制著每組 IO 埠(A~G)的低 8 位的模式。每個 IO 埠的位佔用 CRL 的 4 個位,高兩位為 CNF,低兩位為 MODE。
換句話說我們要控制PA0,就只要這樣寫:
GPIOA->CRL&=0XFFFFFFF0;
把PA0設定為輸入就要這樣寫:
GPIOC->CRL|=8<<0;
合起來控制PA0為輸入就是這樣寫:
GPIOC->CRL&=0XFFFFFFF0;GPIOC->CRL|=8<<0;
PA0為輸出
GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;
PA1為輸出
GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=8<<4;
PA2為輸出
GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=8<<8;
PA3為輸出
GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;
PA4為輸出
GPIOA->CRL&=0XFFF0FFFF;GPIOA->CRL|=8<<16;
PA5為輸出
GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=8<<20;
PA6為輸出
GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=8<<24;
PA7為輸出
GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=8<<28;
同理設定為輸入就是
PA0為輸入
GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;
PA1為輸入
GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=3<<4;
PA2為輸入
GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=3<<8;
PA3為輸入
GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;
PA4為輸入
GPIOA->CRL&=0XFFF0FFFF;GPIOA->CRL|=3<<16;
PA5為輸入
GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=3<<20;
PA6為輸入
GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=3<<24;
PA7為輸入
GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=3<<28;
PA8為輸出
GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<0;
PA9為輸出
GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=8<<4;
PA10為輸出
GPIOA->CRH&=0XFFFFF0FF;GPIOA->CRH|=8<<8;
PA11為輸出
GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;
PA12為輸出
GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=8<<16;
PA13為輸出
GPIOA->CRH&=0XFF0FFFFF;GPIOA->CRH|=8<<20;
PA14為輸出
GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=8<<24;
PA15為輸出
GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=8<<28;
同理設定為輸入就是
PA8為輸入
GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=3<<0;
PA9為輸入
GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=3<<4;
PA10為輸入
GPIOA->CRH&=0XFFFFF0FF;GPIOA->CRH|=3<<8;
PA11為輸入
GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;
PA12為輸入
GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=3<<16;
PA13為輸入
GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRH|=3<<20;
PA14為輸入
GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=3<<24;
PA15為輸入
GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=3<<28;
GPIOC->CRL&=0XFFFFFFF0;
GPIOx->CRL,這句話表示要操作GPIOx的低8位,就是Px0 ~ Px7,(CRL表示操作高8位,就是Px8~Px15);
所以GPIOC->CRL,這句話表示要操作GPIOC的第0位,就是PC0
後面的0XFFFFFFF0,表示操作PC0;0XFFFFFF0F,表示操作PC1;0XFFFFF0FF,表示操作PC2;0XFFFF0FFF,表示操作PC3;0XFFF0FFFF,表示操作PC4;0XFF0FFFFF,表示操作PC5;0XF0FFFFFF,表示操作PC3;0X0FFFFFFF,表示操作PC7;合起來的意思就是:利用“與”運算,把這個位清0,同時不影響其他的位的設定。
GPIOC->CRL|=8<<0;
意思就是將1000左移0位(不移位),然後再與GPIOC->CRL進行“或”運算。再根據原子的暫存器開發手冊可以知道CNF0[10]、MODEO[00],對應的就是設定為上拉/輸入模式。
相關文章
- 學習方向的問題
- zotero的同步設定問題
- Redis阻塞問題排查方向Redis
- Django的時區設定問題Django
- [20201221]spfile設定問題.txt
- [20221125]設定hugepages遇到的問題.txt
- 設定flex後子元素設定寬度失效問題Flex
- 無障礙閱讀的設定問題。
- scrapy 一些設定和問題
- Druid.io SQL亂碼問題UISQL
- vue中設定height:100%無效的問題Vue
- and-design-vue設定dropdownClassName無效的問題Vue
- [20240804]關於kitty設定與linux LANG環境設定問題.txtLinux
- std::io::BufReader 物件借用和引用的問題物件
- 設定spacevim字型顯示亂碼問題
- 【Angular】設定代理解決跨域問題Angular跨域
- 09_模型設定與資料問題模型
- [20221111]bash eval設定變數問題.txt變數
- Go問題彙總 | 設定GOPROXY報錯Go
- 資料庫高io問題調查資料庫
- Java 設定Word文字框中的文字旋轉方向Java
- 使用System.IO.File.Create()時注意的問題
- [20241118]NLS_LANG設定問題2.txt
- 系統引數nofile設定不生效問題
- 在Oracle SQL中設定每週的起始日期IOOracleSQL
- 印表機的埠如何設定 設定印表機埠的方法
- 關於PMOS與NMOS電流公式的方向問題公式
- QTableView設定單元格顏色未生效的問題QTView
- 多使用者環境下GOPATH的設定問題Go
- QWidget設定layout時的延遲重新整理問題
- 如何解決html設定height:100%無效的問題?HTML
- 兩個關於許可權設定的問題思考
- C# 設定Word文字框中的文字旋轉方向C#
- 一次IO效能問題的發現過程
- 解決Rust -- update crates.io過慢的問題Rust
- Fresco的圖片SimpleDraweeView設定ScaleType不起作用的問題View
- min_free_kbytes 設定過大案例問題解析
- Java IO輸入輸出及亂碼問題Java