寄存器方式点亮LED
RCC->AHB1ENR |= (1<<5); //使能GPIO时钟
AHB1ENR为外设时钟使能寄存器
1<<5 即 0010 0000 对应GPIOF的时钟使能,符合实验要求点亮PF0
GPIOF->MODER =0x0000; //寄存器复位值
GPIOF->MODER |= (1<<2*0); //配置F0引脚为通用输出
MODER为GPIO的模式寄存器用于设置 GPIO 引脚的工作模式,每个 GPIO 引脚对应于模式寄存器的两个控制位,模式寄存器如图所示。
图中,MODERy[1:0]为端口 GPIOx 的配置位(x 为端口号 A~I,y 为引脚号 0~15。例如,引脚 PF7 的端口号为 F,引脚号为 7,需要配置 GPIOF 下的 MODER7 寄存器),这些位通过软件写入,用于配置 GPIO 端口方向模式。
00:输入模式(复位状态)。
01:输出模式。
10:复用功能模式。
11:模拟功能模式。
GPIOF->OTYPER &=~(1<<1*0); //配置F0推挽输出
OTYPER为输出类型寄存器,用于设置 GPIO 引脚的输出类型,如图所示。
图中,位 16 至位 31 保留,必须保持复位值,OTy 代表端口 x 的配置位(x 为端口号 A~I,y 为引脚号 0~15),这些位通过软件写入,用于配置 GPIO 端口 的输出类型。
0:输出推挽(复位状态)。
1:输出开漏。
GPIOF->OSPEEDR &= ~(1<<2*0); //配置F0速度2M
其中,OSPEEDR为输出速度寄存器,用于定义输出模式下,GPIO 引脚可输出脉冲的速度,也就 是在不出现错误的情况下,高低电平最高的切换速度,输出速度寄存器如图所示。
图中,OSPEEDRy[1:0]代表端口 x 的配置位(x 为端口号 A~I,y 为引脚号 0~15),这些位通过软件写入,用于配置 GPIO 端口输出速度。
00:2MHz(低速)
01:25MHz(中速)
10:50MHz(快速)
11:100MHz(高速)
GPIOF->PUPDR |= (1<<2*0); //配置上拉
其中,PUPDR为上拉/下拉寄存器,用于设定 GPIO 引脚在内部是否连接上拉电阻或下拉电阻, 上拉/下拉寄存器如图所示。
图中,PUPDRy[1:0]代表端口x的配置位(x为端口号A~I,y为引脚号0~15), 这些位通过软件写入,用于配置 GPIO 端口的上拉或下拉功能。
00:无上拉或下拉。
01:上拉。
10:下拉。
11:保留。
GPIOF->BSRRH |= (1<<0); //输出低电平,LED点亮
BSRRH为置位/复位寄存器,置位/复位寄存器是只读寄存并且只有写 1 才能产生控制效果,对低 16 位 (BSRRL)写 1,对应的 GPIO 引脚输出高电平;对高 16 位(BSRRH)写 1,单片机原理与实践 110 对应的 GPIO 引脚输出低电平。通过对置位/复位寄存器的操作,可以通过原子操作(原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一 直运行到结束)有针对性地改变 GPIO 个别引脚的输出状态,而不影响其他引脚 状态,简化了程序编写。
例:将 GPIOA 的 3 号、10 号引脚输出低电平。
读-修改-写操作: GPIOA->ODR&=~(1<<3|1<<10);
原子操作: GPIOA->BSRRH=1<<3|1<<10;
例:将 GPIOA 的 2 号、8 号引脚输出高电平。
读-修改-写操作:GPIOA->ODR|=1<<2|1<<8;
原子操作:GPIOA->BSRRL=1<<2|1<<8;
置位/复位寄存器如图所示。
图中,BRy 表示端口 x 的复位位 y(x 为端口号 A~I,y 为引脚号 0~15)。这 些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。 0:不会对相应的 ODRx 位执行任何操作。 1:对相应的 ODRx 位进行复位,对应的 GPIO 引脚输出低电平。 BSy 表示端口 x 的复位位 y(x 为端口号 A~I,y 为引脚号 0~15)。这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。 0:不会对相应的 ODRx 位执行任何操作。 1:对相应的 ODRx 位进行置位,对应的 GPIO 引脚输出高电平。 需要注意的是,如果同时对 BSy 和 BRy 置位,则 BSy 的优先级更高。 通过 GPIO 的结构图可以看到,置位/复位寄存器的输出连接到输出数据寄存器,因此操作置位/复位寄存器最终会影响到输出数据寄存器的内容,从而改 变 GPIO 引脚的输出状态。