使用brr和bsrr暫存器可以方便地快速地實現對埠某些特定位的操作,而不影響其它位的狀態。
比如希望快速地對gpioe的位7進行翻轉,則可以:
gpioe->bsrr = 0x80; // 置'1'
gpioe->brr = 0x80; // 置'0'
如果使用常規'讀-改-寫'的方法:
gpioe->odr = gpioe->odr | 0x80; // 置'1'
gpioe->odr = gpioe->odr & 0xff7f; // 置'0'
有人問是否bsrr的高16位是多餘的,請看下面這個例子:
假如你想在乙個操作中對gpioe的位7置'1',位6置'0',則使用bsrr非常方便:
gpioe->bsrr = 0x00400080;
如果沒有bsrr的高16位,則要分2次操作,結果造成位7和位6的變化不同步!
gpioe->bsrr = 0x80;
gpioe->brr = 0x40;
規則:一、置gpiod->bsrr低16位的某位為'1',則對應的i/o埠置'1';而置gpiod->bsrr低16位
的某位為'0',則對應的i/o埠不變。
二、置gpiod->bsrr高16位的某位為'1',則對應的i/o埠置'0';而置gpiod->bsrr高16位
的某位為'0',則對應的i/o埠不變。
三、置gpiod->brr低16位的某位為'1',則對應的i/o埠置'0';而置gpiod->brr低16位的
某位為'0',則對應的i/o埠不變。
例如:1)要設定d0、d5、d10、d11為高,而保持其它i/o口不變,只需一行語句:
gpiod->bsrr = 0x0c21;// 使用規則一
2)要設定d1、d3、d14、d15為低,而保持其它i/o口不變,只需一行語句:
gpiod->brr = 0xc00a;// 使用規則三
3)要同時設定d0、d5、d10、d11為高,設定d1、d3、d14、d15為低,而保持其它i/o口不變
,也只需一行語句:
gpiod->bsrr = 0xc00a0c21;// 使用規則一和規則二
如果中斷中要對io口設定,最好使用bsrr和brr操作,而不要用odr .
STM32 ARM STM32 各種縮寫和全稱
gpio gpio 英語 general purpose input output 通用型之輸入輸出的簡稱,功能類似8051的p0 p3,其接腳可以供使用者由程式控制自由使用,pin腳依現實考量可作為通用輸入 gpi 或通用輸出 gpo 或通用輸入與輸出 gpio 如當clk generator,c...
STM32 GPIO和外部中斷
stm32中使用gpio作為外部中斷,以如下圖的方式連線到外部中斷,因此在設計的時候,不能同時將中斷連線在pa.1 pb.1 pc.1 pd.1 pe.1,因為同時只能選擇乙個中斷。外部中斷初始化,乙個重要的結構體exit inittypedef typedef struct exti initty...
STM32外部中斷和IWDG
實驗平台 正點原子戰艦開發板 系統 windows 7 64位 編譯器 mdk 4.72a 參考例程 atk 串列埠例程,野火 iso串列埠例程 中斷主要分為兩種 1 系統異常中斷也可以說的核心異常,這類異常中斷有些是不可以控制的,如reset,nmi,fault.2 外部中斷,這些中斷都是可以設定...