说明
最近自己在学习STM32,跟着原子哥的STM32教学视频学习,参考的资料有来自原子哥的,以后的博客都是自己对这段时间学习到的内容的总结,麻烦以后要是有出错的请指出来。
简介
—— |
51 |
32 |
IO |
可直接配置操作 |
需要配置相关寄存器来操作 |
STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的:
2 个 32 位的端口配置寄存器 CRL 和 CRH;
2 个 32 位的数据寄存器 IDR 和 ODR;
1 个 32 位的置位/复位寄存器BSRR;
1个 16 位的复位寄存器 BRR;
1 个 32 位的锁存寄存器 LCKR。
端口配置低寄存器(32位)
1、这两个寄存器的功能相似,一个是配置低8位IO口的CRL,另一个是配置高8位IO口的CRH
2、MODEy:配置IO的输出速度
3、CNFy: 配置IO的输出模式
//在固件库开发中,操作寄存器 CRH 和 CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//通过初始化结构体初始化 GPIO 的常用格式是:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数配置 GPIO
数据寄存器(32位)
1、读取某个IO口的电平
2、低16位分别代表一组中的16个不同的IO口
//在固件库中操作 IDR 寄存器读取 IO 端口数据是通过 GPIO_ReadInputDataBit 函数实现的:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
//比如我要读 GPIOA.5 的电平状态,那么方法是:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
1、该寄存器为可读写
2、低16位分别代表一组中的16个不同的IO口
3、一次性一个 GPIO 的多个端口设值
在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现
的:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
该函数一般用来往一次性一个 GPIO 的多个端口设值。
置位/复位寄存器(32位)
//例如你要设置 GPIOA 的第 1 个端口值为 1,那么你只需要往寄存器 BSRR 的低 16 位对应位写 1 即可:
GPIOA->BSRR=1<<1;
//如果你要设置 GPIOA 的第 1 个端口值为 0,你只需要往寄存器高 16 位对应为写 1 即可:
GPIOA->BSRR=1<<(16+1)
还有一个寄存器BRR寄存器,是端口位清除寄存器。该寄存器的作用跟 BSRR 的高 16 位相似
//在 STM32 固件库中,通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数GPIO_SetBits()和函数 GPIO_ResetBits()来完成的。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//在多数情况下,我们都是采用这两个函数来设置 GPIO 端口的输入和输出状态。比如我们要设置 GPIOB.5 输出 1,那么方法为:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
//反之如果要设置 GPIOB.5 输出位 0,方法为:
GPIO_ResetBits (GPIOB, GPIO_Pin_5);
复位寄存器(16位)
以后补充
锁存寄存器(32位)
以后补充