IO数量
16*7=112个,GPIOA~GPIOG7组,共144个引脚
IO模式
很多IO口既可以做为输入,也可以做为输出
输入模式
VSS指的是地,VDD是高电平,
MOS英文全称为Metal-Oxide-Semiconductor。 意思为金属-氧化物-半导体,而拥有这种结构的晶体管我们称之为MOS晶体管。MOS管的管脚有三个:源极S(source)、栅极G(Gate)和漏极(Drain)
图片引用:https://zhuanlan.zhihu.com/p/567240024,注意D和S的电平根据PNMOS管的不同,下面图中的高电平都在上。
模式1:输入浮空模式
工作模式2:输入上拉模式
工作模式3,输入下拉模式
模式4:模拟模式
TTL施密特触发器不作用
输出模式
模式1,开漏输出模式
使用NMOS管和寄存器输出,D漏极接在外面输出,
模式2:开漏复用输出
使用NMOS管和外设输出
工作模式3推挽输出模式
使用两个MOS管
推挽复用输出
反转速度
2mhz,10mhz,50mhz
每组IO口寄存器有7个,可控制一组GPIO的16个IO口
- GPIOx_CRL :端口配置低寄存器
- GPIOx_CRH:端口配置高寄存器
- GPIOx_IDR:端口数据输入寄存器
- GPIOx_ODR:端口数据输出寄存器
- GPIOx_BSRR:端口位设置/清除寄存器
- GPIOx_BRR :端口位清除寄存器
- GPIOx_LCKR:端口配置锁存寄存器
//每组有7个寄存器分为
两个32位配置寄存器(GPIOx_CRL ,GPIOx_CRH) ,
两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),
一个32位置位/ 复位寄存器(GPIOx_BSRR),
一个16位复位寄存器(GPIOx_BRR),
一个32位锁定寄存器(GPIOx_LCKR)。
寄存器设置
端口配置寄存器:GPIOx_CRL ,GPIOx_CRH,
共64位,因为4位(32个二进制位)确定一个IO的工作
下图中可以看出,四个位中,后两位表示输出还是输入,高两位表示输出或输入的模式,GPIOx_CRH配置Px8-15,GPIOx_CRL配置的是0-7
端口输入数据寄存器GPIOx_IDR,GPIOx_ODR
置位/ 复位寄存器(GPIOx_BSRR)
低16位是清除,高16位指的是置位ODR寄存器,S=SET; R=RESET
复位寄存器(GPIOx_BRR)
只使用了16位
端口复用和映射和中断
复用:端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚;最大限度使用端口
端口重映射功能:方便布线
每个端口都可以做为中断
经典的灯实验
硬件基础
电路分析:当输出为低电平时,led灯会亮起来
对IO口做为控制开关的过程本质
1,对时钟寄存器设置
2,GPIOx_CRL,GPIOx_CRH:设置外设IO口的工作模式(输入/输出,输出:推挽/开漏..。输入:模拟/浮空/上拉/下拉),
首先,设置时钟寄存器中的外设口的输出控制时钟(在时钟寄存器RCC的外设时钟寄存器APB2 )使能对应PB\PE端口组时钟。然后对端口指定一个口的
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)
库函数中函数使用
重要函数:
1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
使用寄存器设置时
void LED_Init(void)
{
//设置使能时钟
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<6; //使能PORTE时钟
//对端口设定
GPIOB->CRL&=0XFF0FFFFF; //先对控制位清零
GPIOB->CRL|=0X00300000;//PB.5 推挽输出 ,再设置控制端口工作模式
GPIOB->ODR|=1<<5; //PB.5 输出高
GPIOE->CRL&=0XFF0FFFFF;
GPIOE->CRL|=0X00300000;//PE.5推挽输出
GPIOE->ODR|=1<<5; //PE.5输出高
}