詳解STM32——GPIO(通用輸入輸出口)
【對(duì)單片機(jī)的操作就是控制IO口】
一、GPIO(通用輸入輸出口)
1、選定需要的引腳(對(duì)應(yīng)哪一個(gè)IO口);
2、配置需要的功能(輸入還是輸出);
3、設(shè)置需要的高低電平;
?
二、GPIO寄存器
配置寄存器:輸入還是輸出
數(shù)據(jù)寄存器:保存輸入電平或?qū)⒁敵鲭娖?/p>
位控制寄存器:控制電平的輸出
鎖定寄存器:設(shè)置某鎖定引腳后,不能修改配置
每4位控制一個(gè)引腳。寄存器都是32位的。
?
三、STM32地址映射
Cortex-M3 有 32 根地址線,所以它的尋址空間大小為 2^32 bit=4GB。 ARM 公司設(shè)計(jì)時(shí),預(yù)先把這 4GB 的尋址空間大致地分配好了。地址從 0x4000 0000 至 0x5FFF FFFF( 512MB )的地址分配給片上外設(shè)。stm32f10x.h這個(gè)文件中重要的內(nèi)容就是把STM32 的所有寄存器進(jìn)行地址映射。
AHB總線:(0x4001 8000~0x4001 8000)
APB1總線:(0x4000 0000~0x4001 0000)I2C,UART,DAC,部分定時(shí)去等
APB2總線:(0x4001 0000~0x4001 3FFF)GPIO,串口1,ADC及部分定時(shí)器;
外設(shè)基地址:片上外設(shè)的首地址就是外設(shè)的基地址0x40000000。STM32 的地址是 32 位的。
總線基地址:總線基地址(AHB/APB1/APB2) = 外設(shè)基地址 + 偏移量
寄存器組基地址:寄存器組基地址(GPIOA~E) = 總線基地址 + 偏移量?
#define?PERIPH_BASE?????????((uint32_t)0x40000000)?/*?外設(shè)基地址?*/
????/*?總線基地址?*/
#define?APB1PERIPH_BASE?????PERIPH_BASE
#define?APB2PERIPH_BASE?????(PERIPH_BASE?+?0x10000)
#define?AHBPERIPH_BASE??????(PERIPH_BASE?+?0x20000)
????/*寄存器組基地址*/
#define?GPIOA_BASE??????????(APB2PERIPH_BASE?+?0x0800)
#define?GPIOB_BASE??????????(APB2PERIPH_BASE?+?0x0C00)
#define?GPIOC_BASE??????????(APB2PERIPH_BASE?+?0x1000)
#define?GPIOD_BASE??????????(APB2PERIPH_BASE?+?0x1400)
#define?GPIOE_BASE??????????(APB2PERIPH_BASE?+?0x1800)
#define?GPIOA???????????????((GPIO_TypeDef?*)?GPIOA_BASE)
#define?GPIOB???????????????((GPIO_TypeDef?*)?GPIOB_BASE)
#define?GPIOC???????????????((GPIO_TypeDef?*)?GPIOC_BASE)
#define?GPIOD???????????????((GPIO_TypeDef?*)?GPIOD_BASE)
#define?GPIOE???????????????((GPIO_TypeDef?*)?GPIOE_BASE)
typedef?struct
{
??__IO?uint32_t?CRL;
??__IO?uint32_t?CRH;
??__IO?uint32_t?IDR;
??__IO?uint32_t?ODR;
??__IO?uint32_t?BSRR;
??__IO?uint32_t?BRR;
??__IO?uint32_t?LCKR;
}?GPIO_TypeDef;?/*?GPIO7個(gè)寄存器封裝,寄存器圖中有相對(duì)總線的地址偏移*/




