野火STM32暫存器配置GPIO

2021-09-25 05:39:08 字數 2071 閱讀 7535

1)讀庫函式的一些巨集定義和結構體

#define __io voiatile

typedef unsigned int uint32_t;

typedef unsigned shrot uint16_t;

以結構體的形式定義好了外設暫存器後,使用結構體前還需要給結構體的首位址賦值,才能訪問到需要的暫存器;

eg:gpiox_typedef gpioa

結構體的首位址賦了gpioa位址的值;

io埠認識

每個通用 i/o 埠包括 4 個 32 位配置暫存器(gpiox_moder、gpiox_otyper、gpiox_ospeedr 和 gpiox_pupdr)、

2 個 32 位資料暫存器(gpiox_idr 和gpiox_odr)、

1 個 32 位置位/復位暫存器 (gpiox_bsrr)、

1 個 32 位鎖定暫存器(gpiox_lckr)、

2 個 32 位復用功能選擇暫存器(gpiox_afrh 和 gpiox_afrl)。

gpiox_moder 暫存器用於選擇 i/o 方向(輸入、輸出、af、模擬)。

gpiox_otyper 和 gpiox_ospeedr 暫存器分別用於選擇輸出型別(推挽或開漏)和速度 (無論採用哪種 i/o 方向,都會直接將 i/o 速度引腳連線到相應的 gpiox_ospeedr 暫存器位)。

無論採用哪種 i/o 方向,gpiox_pupdr 暫存器都用於選擇上拉/下拉。

gpiox_odr 用於儲存待輸出資料,可對其進行讀/寫訪問。通過 i/o 輸入的資料儲存到輸入資料暫存器

gpiox_idr 它是乙個唯讀暫存器。(每兩個ahb時鐘讀取一次io的狀態)

i/o口的資料資料暫存器和位操作

odr和idr為gpio的輸出和輸入暫存器,16位bsrr分為兩個bsr和brr置位和復位不能單獨操作,都是寫1有效。

一、推挽輸出和開漏輸出設定,控制暫存器: gpiox_otyper

推挽輸出與開漏輸出的應用場合:

1、推挽輸出:一般應用在輸出電平為0~3.3v而且需要高速切換開關狀態的的場合

2、開漏輸出:一般應用在i2c、smbus通訊等需要「線與」功能的匯流排電路中

二、輸出資料暫存器:odr

輸出模式引腳電平受輸出暫存器odr的影響,而odr暫存器對應引腳位為0,引腳初始化為低電平,上拉只是小幅度的提高輸出電流的能力;

三、啟動檔案的作用:

初始化堆疊指標 sp;

 初始化程式計數器指標 pc;

 設定堆、棧的大小; 

設定中斷向量表的入口位址; 

配置外部 sram 作為資料儲存器(這個由使用者配置,一般的開發板可沒有外部sram); 

呼叫 systemini() 函式配置 stm32 的系統時鐘。

 設定 c 庫的分支入口「__main」(最終用來呼叫 main 函式);

四、用暫存器點亮led

1、import __main

ldr r0, =systeminit

blx r0

ldr r0, =__main

bx r0

endp

從啟動檔案可以看出我們需要寫systeminit()和main()兩個函式

systeminit()函式是配置系統的,為了簡單我們使用預設狀態,即在主函式中寫入systeminit()函式但並不做任何動作,目的就是騙過編譯器;

2、在配置暫存器是要定義他們的位址,所以接下來就是定義位址

3、配置相關暫存器

五、程式設計實現:

1、時鐘配置rcc

1)gpiox掛載在ahb1匯流排上,所以要使能rcc_ahb1enr匯流排時鐘;

2)rcc_ahb1enr |= (1<<7);

2、模式選擇:

1)gpioh_moder &= ~( 0x03<< (210));先將20 21引腳清零,然後寫入01 gpioh_moder |= (1<<210);

2)模式選擇、速度配置、上拉下拉同上;

3)然後利用復位置位暫存器gpioh_bsrr或輸入輸出gpioh_odr配置;

STM32蜂鳴器 暫存器

這次實驗犯了個笑話,竟然在巨集定義後面加分號.就像這樣 define 大家千萬不要學我,結果報錯expected expression,還苦惱半天,想為啥操作不了暫存器了?我真愚蠢!剛開始我也不會寫這些東西,其實摸清套路就好,rcc時鐘使能 gpio初始化 相關暫存器初始化 延時函式 串列埠等初始化...

STM32暫存器對映

1.對映即將記憶體的某段位址與某一暫存器對應,微控制器對函式的操作底層是操作暫存器,而暫存器最終是操作記憶體上對應的單元,2.各個暫存器對應的位址都是在st定義的起始位址上層層偏移得到 3.想要實現某功能可直接對此段記憶體寫進相應的值,即可賦予某一功能 4.stm32底層實際是先定義出外設基位址,然...

stm32模擬iic暫存器配置

io方向設定 define mpu sda in define mpu sda out io操作函式 define mpu iic scl pbout 10 scl define mpu iic sda pbout 11 sda define mpu read sda pbin 11 輸入sda 每...