第一:STM32 I/O 口的配置
1-.1:I/O可以配置成8中不同的模式,输入四种:模拟输入,输入上拉,输入下拉,输入浮空; 输出四种:推挽输出,开漏输出,推挽式复用输出,开漏复用输出。
具体的配置如下表
新手看这个图 还是很懵的,CNF1/CNF0; MODE1/MODE0;PxODR寄存器这些是什么?答案是:控制I/O的寄存器。
第二:STM32 I/O口寄存器
STM32 每个I/O 都由7个寄存器控制:2个 32位的端口配置寄存器(CRL和CRH);2个32的数据存储(IDR和ODR);一个32的置位/复位寄存器(BSRR);1个16位的复位寄存器(BRR);一个32位的锁存寄存器(LCKR)。
2-1:端口配置寄存器(CRL):CRL寄存器控制的是低8位,CRH寄存器控制的是高8位;
如果需要设置 PIN 5脚为通用推挽输出模式 速率 50MHz,那么对应的位为:00 00 00 00 00 11 00 00 00 00 00 00 可以看出PIN5 是低位 由CRL寄存器控制,只需要设置PIN 5 对应的CNF5 和 MODE5的数据 即可设置PIN 5
如何使用固件库控制寄存器——》通过GPIO的初始化函数完成
void GPIO_Init(GPIO_TypeDef * GPIOx,GPIO_InitTypeDef * GPIO_InitStruct);
GPIO_TypeDef * GPIOx:是用来指定GPIO,取值的范围是GPIOA~GPIOG;
GPIO_InitTypeDef * GPIO_InitStruct:是用来初始化参数结构体指针,结构体类型为GPIO_InitTypeDef
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; //输出速率
GPIO_Init(GPIOB,&GPIO_InitStructure); //LED1-->PE.5推挽输出
代码的意思是设置GPIOB的第五个脚为推挽输出,速率为50MHz。
GPIO_Pin 用来设置要初始化的I/O口
GPIO_Mode 用来设置对应I/O端口的输出输入模式
GPIO_Speed 用来设置I/O 速率
2-2.数据存储寄存器(IDR/ODR):IDR控制低16位 只能读取,ODR控制高16位,可读/写,反应当前I/O 的输出状态
固件库操作IDR 读取I/O 数据的函数是: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)
假设要读取GBIOB.5的电平状态程序为: GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_5)返回值为1或者0
2-2.1 ODR:端口输出数据寄存器,一般用来一次性往一组GPIO下的多个I/O设值
2-3.置位/复位寄存器(BSRR):设置GPIO端口输出位是1还是0
举例说明:如果需要设置GPIOB的第一个端口值为1,只需要往寄存器BSRR的低16位对应位写 1
GPIOB - > BSRR = 1<<1;
如果要设置GPIOB的第一个端口的值为0,只需要往寄存器BSRR的高16位对应位写1,
GPIOB - > BSRR = 1 <<(16+1)
注意:这个寄存器往对应位写0 是没有影响的,所以要设置某些位时,不用管其他位的值。
2-4、端口位清除寄存器(BRR)
作用跟BSRR的高16位类似,在固件库中,通过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)
举个栗子:设置GPIOB.5 输出1:
GPIO_Setbits(GPIOB,GPIO_Pin_5)
设置GPIOB.5 输出0:
GPIO_ResetBits(GPIOB,GPIO_Pin_5)
2-5.端口配置锁定寄存器(LCKR);
暂未了解 后期补上