假如我们的开发板LED灯电路是这样的,我们来点亮绿灯
流程:
首先要把PB0置0才能点亮,就要用到输出数据寄存器ODR来控制PB0来输出0。假设我们用到了GPIOB的ODR寄存器,但是要想输出的话。
1)首先要有时钟(时钟是必要的心脏),找到时钟RCC寄存器控制APB2外设时钟使能寄存器并打开(因为GPIOB外设在APB2总线上)。
2)时钟有了,我们还要控制端口配置低寄存器配置成输出模式(stm32有输入输出模式,需要控制)。
3)最后让ODR寄存器输出0。
具体代码:
#include "stm32f10x.h"
int main(void)
{
//打开APB2总线的时钟
*(unsigned int *)0x40021018 |= (1 << 3);
//配置IO口为输出模式
*(unsigned int *)0x40010C00 &= ~(0x0f << (4*0));
*(unsigned int *)0x40010C00 |= (1 << (4*0));
//控制ODR寄存器PB0输出0
*(unsigned int *)0x40010C00 &= ~(1 << 0);
return 0;
}
void SystemInit(void)
{
//函数体为空,目的为了骗过编译器不报错
}
解析:
//打开APB2总线的时钟
*(unsigned int *)0x40021018 |= (1 << 3);
其中0x40021018:=(0x40021000+0x18)基址加上偏移地址
stm32参考手册的存储器映射图可以找到对应的范围
RCC基址为0x40021000而APB2 外设时钟使能寄存器(RCC_APB2ENR)
偏移地址:0x18。
APB2 外设时钟使能寄存器位3置1,开启GPIOB的时钟。
其他步骤同理。