STM32入門 區別ORD,BSRR,BRR暫存器

2021-10-02 07:01:37 字數 2377 閱讀 5239

ord,bsrr,brr暫存器的作用是對已經初始化後的 io 口輸出高、低電平。

odr暫存器可讀可寫,32位,既能控制管腳為高電平,也能控制管腳為低電平。gpio管腳對於位寫1為高電平,寫 0 為低電平。(低 16 位用於設定 gpio 口對應位輸出高/低電平。高 16 位保留位址,讀寫無效。)

bsrr暫存器 稱為埠位設定/清除暫存器,只寫暫存器,32位, 既能控制管腳為高電平,也能控制管腳為低電平,對暫存器高 16位 寫1 對應管腳為低電平,對暫存器低16位寫1對應管腳為高電平。寫 0 ,無動作

brr暫存器稱為埠位清除暫存器,只寫暫存器,32位, 只能改變管腳狀態為低電平,暫存器管腳對應位寫 1 相應管腳會變為低電平。寫 0 無動作。(brr低 16 位用於設定 gpio 口對應位輸出低電平。高 16 位保留位址,讀寫無效。)

所以理論上來講,brr 暫存器的功能(低16位)和 bsrr 暫存器高 16 位的功能是一樣的。

配置 bsrr , brr 是為了對埠輸出進行配置,而 odr 暫存器也是用於輸出資料的暫存器,乙個 odr 暫存器控制了一組(16位)的 gpio 輸出。因此,對 odr 進行修改也可以到達對 io 口輸出進行配置。

由於對 odr 暫存器的讀寫操作必須以 16 位的形式進行。因此,如果使用 odr 改寫資料以控制輸出時,須採用「讀-改-寫」的形式進行。

brr、bsrr都可以做到假如只想改變位0的值,則不論其他位為何值,用乙個等號就可以完成。

而odr改變時則是全部改變。

比如16位本來為1010101010101010,經過gpiox->bsrr=0x01後變為1010101010101011,而經過gpiox->odr=0x01後變為0000000000000001。

例項1經常會看到類似如下的巨集定義語句,用於對已經初始化後的 io 口輸出高、低電平。

#define set_bl_high() gpioa->bsrr=gpio_pin_5

#define set_bl_low() gpioa->brr=gpio_pin_010

其作用類似於如下兩個庫函式,

void gpio_setbits(gpio_typedef* gpiox, uint16_t gpio_pin)

void gpio_resetbits(gpio_typedef* gpiox, uint16_t gpio_pin)

而且實際上這兩個庫函式就是通過修改bsrr,brr暫存器的值來實現對 io 口設定的

因此,使用巨集或者庫函式本質上都是一樣的。區別在於使用巨集更快,而使用函式更靈活。

例項2在使用暫存器bsrr 和暫存器brr時,使用規則總結如下:

1、置gpiod->bsrr低16位的某位為』1』,則對應的i/o埠置』1』;而置gpiod->bsrr低16位的某位為』0』,則對應的i/o埠不變。

2、置gpiod->bsrr高16位的某位為』1』,則對應的i/o埠置』0』;而置gpiod->bsrr高16位的某位為』0』,則對應的i/o埠不變。

3、置gpiod->brr低16位的某位為』1』,則對應的i/o埠置』0』;而置gpiod->brr低16位的某位為』0』,則對應的i/o埠不變。

使用場合舉例如下:

1)要設定d0、d5、d10、d11為高,而保持其它i/o口不變,只需一行語句:

gpiod->bsrr = 0x0c21;// 使用規則1

2)要設定d1、d3、d14、d15為低,而保持其它i/o口不變,只需一行語句:

gpiod->brr = 0xc00a;// 使用規則三

3)要同時設定d0、d5、d10、d11為高,設定d1、d3、d14、d15為低,而保持其它i/o口不變,也只需一行語句:

gpiod->bsrr = 0xc00a0c21;// 使用規則一和規則二

例項3假設需要對 gpioa_pin_6 輸出高電平。採用改寫 odr 暫存器的方式時,使用「讀-改-寫」操作,**如下:

uint32_t temp;

temp = gpioa->odr;

temp = temp | gpio_pin_4;

gpioa->odr = temp;

而使用改寫 bsrr 暫存器時,僅需要使用如下語句:

gpioa->bsrr = gpio_pin_6;

在修改 odr 時,為了確保對埠 6 的修改不會影響到其他埠的輸出,需要對埠的原始資料進行儲存,之後再對埠 6 的值進行修改,最後再寫入暫存器(即讀-改-寫形式改變位的狀態)。而對 bsrr 的操作,是寫 1 有效,寫 0 不改變原狀態,因此可以對埠 6 置 1,其他位保持為 0。bsrr 為 1 的位,會修改相應的 odr 位,從而控制輸出電平。

因此,在設定單個 io 口輸出時,使用 bsrr 進行操作會更加方便。

stm32基礎入門

1 開發工具,初學者建議mdk,後期ivr 2 暫存器開發or庫 版本開發 先暫存器開發,後期兩者結合 3 軟體 or開發板,先軟體 後期兩者結合 建立工程 1 包含三部分 start user lib output outlist資料夾 並設定 outlist目錄 用來存放生成的中間檔案 outp...

STM32學習 入門

嵌入式系統定義 以應用為中心,以計算機技術為基礎,軟硬體可按需求進行定製,從而滿足各種設計指標。與通用計算機系統不同在於它是為某些特定任務而設計的。體系結構 嵌入式硬體 處理器 外圍裝置 嵌入式軟體 作業系統 應用軟體 微控制器與微處理器 常見外設介面和匯流排 嵌入式作業系統 搶占式排程機制 響應時...

STM32基礎入門(二) STM32入坑指南

最近有不少學弟新入微控制器的坑,萬事開頭難。作為乙個比較陌生的領域,再結合我當時入坑時的一些問題,寫下這篇部落格,希望能夠給初學者一些啟發。1.開發板的選擇 學習stm32,不能繞開的第一件事,那就是開發板。開發板的意義 開發板提供了足夠的資源,包含硬體資源和軟體資源。硬體資源,即開發板上自帶的le...