【對單片機的操作就是控制IO口】
一、GPIO(通用輸入輸出口)
1、選定需要的引腳(對應哪一個IO口);
2、配置需要的功能(輸入還是輸出);
3、設置需要的高低電平;
?
二、GPIO寄存器
配置寄存器:輸入還是輸出
數(shù)據(jù)寄存器:保存輸入電平或將要輸出電平
位控制寄存器:控制電平的輸出
鎖定寄存器:設置某鎖定引腳后,不能修改配置
每4位控制一個引腳。寄存器都是32位的。
?
三、STM32地址映射
Cortex-M3 有 32 根地址線,所以它的尋址空間大小為 2^32 bit=4GB。 ARM 公司設計時,預先把這 4GB 的尋址空間大致地分配好了。地址從 0x4000 0000 至 0x5FFF FFFF( 512MB )的地址分配給片上外設。stm32f10x.h這個文件中重要的內容就是把STM32 的所有寄存器進行地址映射。
AHB總線:(0x4001 8000~0x4001 8000)
APB1總線:(0x4000 0000~0x4001 0000)I2C,UART,DAC,部分定時去等
APB2總線:(0x4001 0000~0x4001 3FFF)GPIO,串口1,ADC及部分定時器;
外設基地址:片上外設的首地址就是外設的基地址0x40000000。STM32 的地址是 32 位的。
總線基地址:總線基地址(AHB/APB1/APB2) = 外設基地址 + 偏移量
寄存器組基地址:寄存器組基地址(GPIOA~E) = 總線基地址 + 偏移量?
#define?PERIPH_BASE?????????((uint32_t)0x40000000)?/*?外設基地址?*/ ????/*?總線基地址?*/ #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個寄存器封裝,寄存器圖中有相對總線的地址偏移*/