一,原理图分析
查阅原理图:
由原理图分析易得:
(1)杜邦现连接P0端口到LED接口J12,这样相当于8个LED分别对应PB8-PB15
(2)因为GPIO接到了LED的正极,所以输出1就表示亮,0表示灭
二,STM32的GPIO模块有关寄存器详解
1.GPIO相关寄存器:
寄存器 | 位数 | 名称 x=(A,B,C,D,E) |
---|---|---|
配置寄存器 | 32位 | GPIOx_CRL(低16位), GPIOx_CRH(高16位) |
数据寄存器 | 32位 | GPIOx_IDR(输入模式), GPIOx_ODR(输出模式) |
置位/复位寄存器 | 32位 | (GPIOx_BSRR) |
复位寄存器 | 16位 | (GPIOx_BRR) |
锁定寄存器 | 32位 | (GPIOx_LCKR) |
由stm32的存储映像图可知:PortB的起始地址是:0x40010C00
2.有可能涉及到的GPIO的地址:
寄存器名 | 偏移量 | 寄存器地址 |
---|---|---|
GPIOB_CRL | 0x00 | 0x40010C00 |
GPIOB_CRH | 0x04 | 0x40010C04 |
GPIOB_IDR | 0x08 | 0x40010C08 |
GPIOB_ODR | 0x0C | 0x40010C0C |
GPIOB_BSRR | 0x10 | 0x40010C10 |
GPIOB_BRR | 0x14 | 0x40010C14 |
3.具体用到的寄存器:
GPIOx_CRH:
GPIOx_ODR:
因为stm32上电复位时默认所有外设的时钟都是关闭的,所以要手动打开GPIO对应的时钟
查存储映像图可得:RCC_APB2RSTR 的地址为0x4002 100c
三,写代码控制GPIO点亮熄灭LED
#define GPIOB_BASE 0x40010C00
#define GPIOB_CRH (GPIOB_BASE + 0x04)
#define GPIOB_ODR (GPIOB_BASE + 0x0C)
#define RCC_APB2ENR 0x40021018
//-------------------------------------------------
#define rGPIOB_CRH (*((unsigned int *)GPIOB_CRH))
#define rGPIOB_ODR (*((unsigned int *)GPIOB_ODR))
#define rRCC_APB2ENR (*((unsigned int *)RCC_APB2ENR))
int main(void)
{
rRCC_APB2ENR = 0x00000008; //打开portB 的外设时钟
// 向CRH寄存器写内容,将GPB8-GPB15配置为输出模式
*rGPIOB_CRH = 0x33333333; // 配置端口推挽输出模式,输出速率50MHz
rGPIOB_ODR = 0x00000f00; //输出1点亮LED
return 0 ;
}