stm32的GPIO程式設計之暫存器操作

2021-10-07 09:17:42 字數 3549 閱讀 5058

pb的基位址0x40010c00

pe的基位址0x40011800

pb5設定:

• crl:位址0x4001 0c00 + 0x00。值:cnf5[1:0]=00、

mode5[1:0]=11,故crl[23:20]=0x3,其他位保持不變。

• odr: 位址0x4001 0c00 + 0x0c。值:odr[5]=0亮或1滅,

其他位保持不變

pe5設定:

• crl:位址0x4001 1800 + 0x00。值:cnf5[1:0]=00、

mode5[1:0]=11,故crl[23:20]=0x3,其他位保持不變。

• odr: 位址0x4001 1800 + 0x0c。值:odr[5]=0亮或1滅,

其他位保持不變

#include

"sys.h"

#include

"delay.h"

#define gpiob_base (0x40010c00);

#define gpiob_crl *(unsigned int*)(gpiob_base + 0x00);

#define gpiob_odr *(unsigned int*)(gpiob_base + 0x0c);

#define gpioe_base (0x40011800);

#define gpioe_crl *(unsigned int*)(gpioe_base + 0x00);

#define gpioe_odr *(unsigned int*)(gpioe_base + 0x0c);

intmain

(void

)}

2. bsrr寫方式:

pb的基位址0x4001 0c00

pe的基位址0x4001 1800

pb5設定:

• crl:位址0x4001 0c00 + 0x00。值:cnf5[1:0]=00、

mode5[1:0]=11,故crl[23:20]=0x11,其他位保持不變。

• bsrr: 位址0x4001 0c00 + 0x10。值:bsrr[5]=1滅或

bsrr[21]=1亮 ,其他位為0

pe5設定:

• crl:位址0x4001 1800 + 0x00。值:cnf5[1:0]=00、

mode5[1:0]=11,故crl[23:20]=0x11,其他位保持不變。

• bsrr: 位址0x4001 1800 + 0x10。值:bsrr[5]=1滅或

bsrr[21]=1 亮,其他位為0

#include

"sys.h"

#include

"delay.h"

#define gpiob_base (0x40010c00);

#define gpiob_crl *(unsigned int*)(gpiob_base + 0x00);

#define gpiob_bsrr *(unsigned int*)(gpiob_base + 0x10);

#define gpioe_base (0x40011800);

#define gpioe_crl *(unsigned int*)(gpioe_base + 0x00);

#define gpioe_bsrr *(unsigned int*)(gpioe_base + 0x10);

intmain

(void

)}

3. bsrr+brr寫方式:

pb的基位址0x40010c00

pe的基位址0x40011800

pb5設定:

• crl:位址0x4001 0c00 + 0x00。值:cnf5[1:0]=00、

mode5[1:0]=11,故crl[23:20]=0x11,其他位保持不變。

• bsrr: 位址0x4001 0c00 + 0x10。值:bsrr[5]=1滅。brr:

位址0x4001 0c00 + 0x14.。值:brr[5]=1亮 ,其他位為0

pe5設定:

• crl:位址0x4001 1800 + 0x00。值:cnf5[1:0]=00、

mode5[1:0]=11,故crl[23:20]=0x11,其他位保持不變。

• bsrr: 位址0x4001 1800 + 0x10。值:bsrr[5]=1滅。brr:

位址0x4001 1800 + 0x14,brr[5]=1 亮,其他位為0

#include

"sys.h"

#include

"delay.h"

#define gpiob_base (0x40010c00);

#define gpiob_crl *(unsigned int*)(gpiob_base + 0x00);

#define gpiob_bsrr *(unsigned int*)(gpiob_base + 0x10);

#define gpioe_base (0x40011800);

#define gpioe_crl *(unsigned int*)(gpioe_base + 0x00);

#define gpioe_bsrr *(unsigned int*)(gpioe_base + 0x10);

intmain

(void

)}

4. 位帶操作方式:
#include

"sys.h"

#include

"delay.h"

#define gpiob_base (0x40010c00);

#define gpiob_crl *(unsigned int*)(gpiob_base + 0x00);

#define gpiob_odr_address (gpiob_base + 0x0c);

#define gpioe_base (0x40011800);

#define gpioe_crl *(unsigned int*)(gpioe_base + 0x00);

#define gpioe_odr_address (gpioe_base + 0x0c);

#define bitband(addr, bitnum) ((addr & 0xf0000000)+0x2000000+((addr &0xfffff)<<5)+(bitnum<<2))

#define mem_addr(addr) *((volatile unsigned long *)(addr))

#define bit_addr(addr, bitnum) mem_addr(bitband(addr, bitnum))

#define pbout(n) bit_addr(gpiob_odr_address,n)

//輸出

#define peout(n) bit_addr(gpioe_odr_address,n)

//輸出

intmain

(void

)}

野火STM32暫存器配置GPIO

1 讀庫函式的一些巨集定義和結構體 define io voiatile typedef unsigned int uint32 t typedef unsigned shrot uint16 t 以結構體的形式定義好了外設暫存器後,使用結構體前還需要給結構體的首位址賦值,才能訪問到需要的暫存器 e...

stm32之GPIO暫存器學習

gpio即通用輸入 輸出 general purpose input output 包括 兩個32位的配置暫存器 gpiox crl,gpiox crh 兩個32位的資料暫存器 gpiox idr,gpiox odr 乙個32位的 set reset 暫存器 gpiox bsrr 一位16位的 re...

STM32總結之GPIO程式設計過程

用暫存器點亮led的過程 1 通過原理圖找到要點亮的led燈對應的gpio口 2.通過stm32手冊找到要操作的暫存器,找到這個gpio的基位址,基位址 位址偏移 目標暫存器的位址 3.編碼 1.開啟對應的gpio的時鐘。2.通過操作crl暫存器將對應的gpio口設定為推挽輸出模式,並設定一 個翻轉...