一、GPIO相关基础知识
8种GPIO工作模式
输入模式:输入浮空、输入上拉、输入下拉、模拟输入
输出模式:开漏输出、开漏复用功能、推挽式输出、推挽式复用
每组GPIO端口包括10个寄存器
注:GPIO寄存器定义在F429的头文件中
GPIO的具体知识点可以参照我的另一篇GPIO的相关文章哦!
二、硬件连接
将端口设置为低电平0,于是和VCC有电压差,导通即LED灯点亮
端口设置为高电平1,于是和VCC没有电压差,电路没有导通即LED灯不亮
GPIO输出方式:推挽输出(上拉)【开漏则需要另外加一个上拉电阻,否则没法输出高电平】
三、相关代码
1、相关步骤
初始化HAL库->初始化系统时钟->使能IO口时钟【RCC_AHB1ENR】->初始化IO口模式 配置四个配置寄存器->操作IO口,输出高低电平【配置寄存器GPIOX_ODR/GPIOX_BSRR】【HAL版本则调用相关函数】
2、具体代码
(1)寄存器版本
#include "sys.h"
#include "delay.h"
#include "usart.h"
int main(){
HAL_Init(); //初始化函数
Stm32_Clock_Init(360,25,2,8);
delay_init(180);
RCC->AHB1ENR=1<<1; //1左移1位,即第二位为1,同时进行或运算,从而实现置位第二位而不影响其它位
//配置相关配置寄存器
GPIOB->MODER=0X05; //PB0和PB1均为1(通用输出模式) 0101->0x05
GPIOB->OTYPER=0x00; //PB0和PB1均设置为1 (推挽输出)
GPIOB->OSPEEDR=0x0F; //PB0和PB1均设置为高速 均为11 1111->0x0F
GPIOB->PUPDR=0x05; //PB0和PB1均设置为01 上拉 0101 0101->0x05
while(1){
//配置输入输出寄存器
GPIOB->BSRR=0x00000003; //输出高电平 BS0和BS1置为1
delay_ms(500); //延时500ms
GPIOB->BSRR=0X00030000; //输出低电平 BR0和BR1置为1
delay_ms(500); //延时500ms
}
}
(2)库函数版本
1、GPIO重要库函数
初始化函数 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx,GPIO_InitTypeDef *GPIO_Init);
作用:用于初始化一个或者多个IO口(同一组)的工作模式,输出类型,速度以及上下拉方式,即一组的4个配置寄存器 (GPIOx->MODER、OSPEEDR、OTYPER、PUPDR)
读取输入电平函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
作用:读取某个GPIO的输入电平 (GPIOx_IDR寄存器)
设置引脚输出电平函数 void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,unit16_t GPIO_Pin,GPIO PinState PinState);
l例如:HAL_GPIO_WritePin(GPIO B,GPIO_PIN_1,GPIO_PIN_RESET) PB1为RESET 即0(SET为1)
2、相关代码
#include "delay.h"
#include "usart.h"
int main(){
GPIO_InitTypeDef GPIO_InitStructure; //入口参数结构体
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //延时函数初始化
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能PB时钟
//成员变量初始化
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStructure.Pin=GPIO_PIN_0 | GPIO_PIN_1; //PBO和PB1
GPIO_InitStructure.Pull=GPIO_PULLUP; //上拉
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //PB0=0;
delay_ms(500); //延时500ms
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB0=1;
delay_ms(500); //延时500ms
}
}