内容纲要
GPIO笔记
GPIO简介
•GPIO(General Purpose Input Output)通用输入输出口
•可配置为8种输入输出模式
•引脚电平:0V~3.3V,部分引脚可容忍5V
•输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
•输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
GPIO基本结构
打通步骤(以LED灯为例)
一、RCC开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 正点原子红LED灯 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // 正点原子绿LED灯
二、配置GPIO口
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitTypeDef GPIO_InitStructure2; GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure2);
三、设置高电平关灯(LED灯)
GPIO_SetBits(GPIOB, GPIO_Pin_5); GPIO_SetBits(GPIOE, GPIO_Pin_5);
GPIO位结构
简单了解即可
GPIO的八种输入输出模式
对应参数
typedef enum { GPIO_Mode_AIN = 0x0, // 模拟输入 GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入 GPIO_Mode_IPD = 0x28, // 下拉输入(In Pull Down) GPIO_Mode_IPU = 0x48, // 上拉输入(In Pull Up) GPIO_Mode_Out_OD = 0x14, // 开漏输出(Out Open Drain) GPIO_Mode_Out_PP = 0x10, // 推挽输出(Out Push Pull) GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出(Atl Open Drain) GPIO_Mode_AF_PP = 0x18 // 复用推挽输出(Atl Push Pull) }GPIOMode_TypeDef;
部分API
void GPIO_DeInit(GPIO_TypeDef* GPIOx); // 复位GPIO外设 ——(参数:GPIOx) void GPIO_AFIODeInit(void); // 复位AFIO外设 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); // 初始化GPIO口(先定义一个结构体变量,再赋值,再调用) void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); // 给结构体变量赋默认值 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // GPIO读取函数 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); // GPIO读取函数 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // GPIO读取函数 uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); // GPIO读取函数 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // GPIO写入函数,将指定端口设置为高电平 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // GPIO写入函数,将指定端口设置为低电平 void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); // GPIO写入函数,根据第三个参数值来指定端口 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); // GPIO写入函数 (参数一:选择外设,参数二:对最多16个端口进行写入操作) void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); void GPIO_EventOutputCmd(FunctionalState NewState); void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState); //引脚重映射 void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
实验部分
LED和蜂鸣器简介
•LED:发光二极管,正向通电点亮,反向通电不亮
•有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
•无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
按键简介
传感器模块简介
代码部分
板子为正点原子精英版V2
延迟函数
直接从B站江科大那里拿的
#include "stm32f10x.h" /** * @brief 微秒级延时 * @param xus 延时时长,范围:0~233015 * @retval 无 */ void Delay_us(uint32_t xus) { SysTick->LOAD = 72 * xus; //设置定时器重装值 SysTick->VAL = 0x00; //清空当前计数值 SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器 while(!(SysTick->CTRL & 0x00010000)); //等待计数到0 SysTick->CTRL = 0x00000004; //关闭定时器 } /** * @brief 毫秒级延时 * @param xms 延时时长,范围:0~4294967295 * @retval 无 */ void Delay_ms(uint32_t xms) { while(xms--) { Delay_us(1000); } } /** * @brief 秒级延时 * @param xs 延时时长,范围:0~4294967295 * @retval 无 */ void Delay_s(uint32_t xs) { while(xs--) { Delay_ms(1000); } }
经典跑马灯
LED模块
#include "stm32f10x.h" // Device header void LED_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 时钟初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO口结构体 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置为开漏推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 对应PIN口 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitTypeDef GPIO_InitStructure2; GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure2); GPIO_SetBits(GPIOB, GPIO_Pin_5); // 设置高电平默认关灯 GPIO_SetBits(GPIOE, GPIO_Pin_5); } void LED1_ON(void) { GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 设置低电平开灯 } void LED1_OFF(void) { GPIO_SetBits(GPIOB, GPIO_Pin_5); // 设置高电平关灯 } void LED1_Turn(void) { if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) == 0) // 读取输出数据(0为低电平,1为高电平,等于0即当前为开灯) { GPIO_SetBits(GPIOB, GPIO_Pin_5); } else { GPIO_ResetBits(GPIOB, GPIO_Pin_5); } } void LED2_ON(void) { GPIO_ResetBits(GPIOE, GPIO_Pin_5); } void LED2_OFF(void) { GPIO_SetBits(GPIOE, GPIO_Pin_5); } void LED2_Turn(void) { if (GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5) == 0) { GPIO_SetBits(GPIOE, GPIO_Pin_5); } else { GPIO_ResetBits(GPIOE, GPIO_Pin_5); } }
主函数
#include "stm32f10x.h" // Device header #include "Delay.h" #include "LED.h" int main(void){ while(1){ LED1_ON(); Delay_ms(1000); LED1_OFF(); Delay_ms(1000); } }
按键控制LED
按键模块
#include "stm32f10x.h" // Device header #include "Delay.h" void Key_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //时钟初始化 GPIO_InitTypeDef GPIO_InitStructure; //初始化GPIO口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //采用上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE,&GPIO_InitStructure); } uint8_t Key_GetNum(void){ uint8_t KeyNum = 0; if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0){ //按下时判断式子为0,即返回值为1,识别按键1成功(0为低电平,即按下) Delay_ms(20); //延迟消抖 while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0); Delay_ms(20); KeyNum = 1; } if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0){ //按下时判断式子为0,即返回值为2,识别按键2成功 Delay_ms(20); while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0); Delay_ms(20); KeyNum = 2; } return KeyNum; }
Comments NOTHING