通过编程读写相关寄存器。就可以实现对引脚的控制
先看两个32位的配置寄存器
假设点亮某个LED灯,需要先设置端口配置高寄存器(GPIOx_CRH) (x=A..E)(配置成推挽输出)
这个配置就是GPIOC->CRH=0x00300000
PS: 输出速度一般按最低的就行,当然要求不高直接拉满
对应的使用库函数为
GPIO_InitTypeDef A; A.GPIO_Mode=GPIO_Mode_Out_PP ; //通用推挽输出 A.GPIO_Pin=GPIO_Pin_13; A.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC, &A );
为什么用高寄存器,不用低寄存器?
因为要点亮的是GPIOC的13口 (GPIOC有1-15 一共16个口)
0-7口用低寄存器,8-15口用高寄存器 (手册上也有写比如上图的这里)
配置好之后就可以配置端口输出数据寄存器(GPIOx_ODR) (x=A..E),自由的输出高低电平
GPIOC->ODR=0x00002000 (高位在前低位在后)
对应的使用库函数表示就为
GPIO_SetBits(GPIOC,GPIO_Pin_13);
GPIO的工作原理
输入电路,输入的是外部的电平信号,入口有二极管防止过高和过低的电压,电压信号通过施密特触发器处理后写入到后面的数据寄存器的某一位,然后单片机读取这个寄存器就可以得到对应的值(电平),模拟输入到ADC,复用到其他外设(串口输入等)
可以通过设置端口模式寄存器来选择使用上拉电阻或下拉电阻
输出电路,输出微控制器内部的控制信号(可关闭,使引脚只有输入功能)
通过输出数据寄存器(整体读写)输出的话,某一位就可以控制某个口的高低电平。 通过置位(1)/复位寄存器(0)可以分别操作输出数据寄存器的某一位,使其置1或置0,同时也不影响其他位,高效便捷。置位/复位寄存器选择哪个位它就为1 。 第三种通过“位带”处理,这段地址映射了RAM和外设寄存器所有的位,可改某一位
PS:见手册8.2.5-6
端口位清除寄存器(GPIOx_BRR)_16与端口位设置/清除寄存器(GPIOx_BSRR)_32的高16位作用相同,分成两个是因为操作方便,一个写0一个写1,需要信号同步同时写0和1的时候可以只用BSRR
0
上图为推挽输出(使用较多),需要考虑单片机引脚的直接驱动能力(毫安级别)
开漏输出输出1时,N-MOS闭合,IO口高阻态;输出0时导通,IO口为低,此时只有低电平有驱动能力
需要是输出高电平时需要接上拉电阻,一般工作在电平不匹配的场合(比如使3.3V的单片机输出5V),具有线与特性
推挽复用输出与推挽输出类似,只是控制源来自片上外设,比如PWM,串口等,开漏复用输出同理(比如I2C等)。
标签:输出,推挽,GPIOx,GPIOC,寄存器,GPIO From: https://www.cnblogs.com/liujinmeng/p/17625357.html