STM32学习笔记之寄存器代码解析(F4)

选自,STM32F4之寄存器实现跑马灯实验

GPIOF->MODER &=~(3<<2*9)//清零,第19位,18位的值为00

其中:~非运算,表示取反,例111111001111取反后为000000110000,方便我们计算其值。
&表示进行与运算,例1&0=0,1&1=1
|表示或运算,例1|0=1,1|1=1.
注:MODER &=B表示位MODR =MODER&B

一、GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)

1.将18,19位清零*

  • [什么要配置MODER9=01 ?Y因为此时是pin9脚,故必须配置MODER9=01 ]

第一步:先将18,19位清零,再将这两位配置为MODER9=01,通用输出模式
数字3:表示18,19位为1,即11=3,
第二步,移位:3<< 2×9:表示11向左移动18位。此时18,19位的值为11,而MODER是两位的,故显示为2×9
此时除18,19位为11.其他的30位均为0,再通过取反操作:~,可以实现将18,19位清零的作用。
我们通过查询F4芯片资料手册的187页,可以得到如下所示GPIO端口模式寄存器的表格如下所示
STM32学习笔记之寄存器代码解析(F4)_第1张图片
2.配置MODER=01,通用输出模式(将18,19位值设置位01)

GPIOF->MODER |=(1<<2*9)//置位,第19位,18位的值为01

01=1,然后左移18位,配置MODER=01,通用输出模式。

二、GPIO 端口输出类型寄存器 (GPIOx_OTYPER)

STM32学习笔记之寄存器代码解析(F4)_第2张图片

将OTYPER9配置为OTYPER9=0(输出推挽)单字节

GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)
GPIOF->OTYPER |=(0<<9)//将第9位置零(单字节)

三、GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)

STM32学习笔记之寄存器代码解析(F4)_第3张图片
将OSPEEDR寄存器配置为10,OSPEEDR9=10(50MHz)

GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)
GPIOF->OSPEEDR |=(2<<2*9)//将第19,18位置为10(双字节)

四、GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)

STM32学习笔记之寄存器代码解析(F4)_第4张图片
STM32学习笔记之寄存器代码解析(F4)_第5张图片
将PUPDR寄存器配置为01,PUPDR9=01(上拉)

GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)
GPIOF->PUPDR |=(1<<2*9)//将第19,18位置为01(双字节)

五、GPIO 端口输出数据寄存器 (GPIOx_ODR)

STM32学习笔记之寄存器代码解析(F4)_第6张图片
此时不用清零,直接赋值。

GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
//GPIOF->ODR &=~(1<<9)//将第9位置为0(单字节)

六、RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)

STM32学习笔记之寄存器代码解析(F4)_第7张图片

RCC->AHB1ENR |=1<<5//使能GPIOF口输出,选择使用哪一组I/O口

总代码:led.c文件下的

#include"led.h"
#include"STM32F4XX.h"
void LED_Init(void)
{
RCC->AHB1ENR |=1<<5;

//PF9
GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00
GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01

GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节)
GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)

GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节)
GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)

GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)
GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)

GPIOF->ODR |=(1<<9);//将第9位置为1(单字节)
//GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)

//PF10,注意移动的位数,每个寄存器都对应引脚10
GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为00
GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为01

GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)
GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节)

GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节)
GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)

GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节)
GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节)

GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)
//GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节)
}

原子哥视频讲解:选自,STM32F4之寄存器实现跑马灯实验,P13,
https://www.bilibili.com/video/BV1Rx411R75t?p=13

你可能感兴趣的:(STM32G4学习记录,stm32)