今日分享 GPIO 结合寄存器以及硬件电路,再来举例子分析输入输出。 寄存器介绍: 通过寄存器的位标注 rw,我们可知这个寄存器的某个位是可读(r)并且可写 的(w),我们也可以通过读寄存器里面的值得到引脚的配置信息,如果寄存器的 位标注只有 r 或者 w,那么就代表这个寄存器的这个位只能进行读(r)或者写(w) 复位后 IO 口寄存器的值每一位可能不都是一样的,也就是说复位后 IO 口的 状态、工作模式等不完全相同,一定要注意 ![]() 模式配置寄存器 GPIOx_MODER,右上角用蓝色圆圈标识的地方告诉我们 IO 口的复位值,可以看到复位后对于 A 组 IO 口来说初始值 0XA8000000,对于 B 组 IO 口初始值为 0x00000280,其他组 IO 口都是 0。该寄存器共 32 位,每 2 个位 控制 1 个 IO 如图中左下角划蓝线的为第 0 位和第 1 位。通过往第 0 位写 0,第 1 位写 0 配置成 Input Mode(输入模式),通过往第 0 位写 0,第 1 位写 1 配置成 General purpose output Mode(普通输出模式),通过往第 0 位写 1,第 1 位写 0 配置 成 Alternate function Mode(复用功能模式),通过往第 0 位写 1,第 1 位写 1 配置成 Analog Mode(模拟模式) 例如我们要把这个寄存器第 0 位写 1,其他都写 0,表示如下: GPIOA->MODER |= 0x00000001; 这就相当于把 A 组的 PA0 口配置成了普通输出模式,其他 IO 口配置成了输入模 式 ![]() GPIOx_OTYPER 寄存器用于控制 IO 的输出类型,仅用于输出模式,在输 入模式下不起作用。该寄存器低 16 位(第 0 位-第 15 位)有效,每一个位控制 一个 IO 口,根据往不同的位写 1(开漏输出)/写 0(推挽输出)来配置成不同的 输出模式。复位后,该寄存器值均为 0,即默认为推挽输出 例如我们往 A 组 IO 口的第 0 位写 1 那就将 PA0 成开漏输出模式: GPIOA->OTYPER |= 0x00000001; ![]() GPIOx_OSPEEDR 寄存器用于控制 IO 的输出速度,仅用于输出模式,在输 入模式下不起作用。该寄存器每 2 个位控制一个 IO 口,根据往不同的位写 1/ 清 0 不同的位来配置成不同的模式。复位后对于 A 口来说初始值为 0X0C000000, 对于 B 口初始值 0x000000C0,其他口都是 0 例如我们往 A 组 IO 口的第 0 位和第 1 位写 1 那就将 PA0 成高速输出模式: GPIOA->OSPEEDR |= 0x00000003; GPIOx_PUPDR 寄存器用于控制 IO 的上拉/下拉,该寄存器每 2 个位控制 一个 IO 口, 用于设置上下拉,根据往不同的位写 1/清 0 不同的位来配置成不 同的模式。复位后对于 A 口来说初始值为 0X64000000,对于 B 口初始值 0x00000100,其他口都 0x0C000000 例如我们往 A 组 IO 口的第 0 位写 1 那就将 PA0 下拉模式: GPIOA->PUPDR |= 0x00000001; GPIOx_ODR 寄存器是 IO 口的输出数据寄存器,寄存器低 16 位(第 0 位- 第 15 位)有效,寄存器每 1 个位控制一个 IO 口, 也就是这个里面位的状态 代表了单片机输出的状态,根据往不同的位写 1/清 0 不同的位来配置成不同的 模式。复位后都是 0 例如我们往 A 组 IO 口的第 0 位写 1 那 PA0 就输出高: GPIOA->0DR |= 0x00000001; 对于一些其他的寄存器大家可以去参考数据手册,按照上面讲述的方法去配 置 硬件设计: ![]() 图示LED灯部分我们用到了B组的2PIN(脚的简称)和4PIN, C组的15PIN, D 组的 8PIN, E 组的 8PIN 和 9PIN LED 灯硬件的设计决定了 LED 灯的驱动方法,LED 灯相当于一个发光二 极管,如果单片机引脚输出高,则二极管的左边和右边电压相同,不亮,反之单 片机输出低,右边电压大于左边电压通过单片机内部电路形成回路点亮二极管, 那麽通过控制引脚输出的高低就控制了 LED 灯的亮灭 |