GPIO介绍
GPIO是“General Purpose Input/Output”的缩写,中文可以翻译为通用输入输出。
GPIO是一种在数字电子系统中常见的接口类型,尤其在嵌入式系统中得到广泛应用。GPIO接口的引脚可以配置为输入或输出模式,允许用户通过软件控制其功能。具体来说:
- 作为输入模式。GPIO可以接收来自外部设备的电信号,并将其转换为数字信号供系统内部使用。
- 作为输出模式。GPIO可以将数字信号发送到外部设备,实现对其的控制。
此外,GPIO引脚还可以用于多种特殊功能,如作为时钟发生器、芯片选择等,通过特定的寄存器进行配置。
基本结构图
GPIO功能描述
GPIO点亮LED
根据原理图确定,需要开启哪个外设
开启GPIOB 引脚GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_9 | GPIO_PIN_10
根据需求选择GPIO_Mode类型。
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
/*初始化LED*/
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_5 | GPIO_Pin_6);
/*初始化子板外设*/
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
看原理图配置高电平、低电平,main.c文件调用LED_Init函数,点亮LED灯。
void GPIO_SetBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);低电平
走马灯需搭配延时函数使用。
#include "Delay.h"
static u16 fac_us; //计fac_us个数为1us - SysTick时钟频率
static u32 fac_ms; //计fac_ms个数为1ms
/*************************************************
*函数名: SysTick_Init
*函数功能: SysTick定时器初始化
*输入: SYSTICK:自己配置的系统时钟,没有配置时,默认配置是72M。
*返回值: 无
**************************************************/
void SysTick_Init(u8 SYSTICK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择8分频
fac_us = SYSTICK/8; //因为进行了8分频
fac_ms = (u16)fac_us*1000;
}
/*************************************************
*函数名: Delay_us
*函数功能: 微秒级延时函数
*输入: nus:延时的微秒数
注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21)
*返回值: 无
**************************************************/
void Delay_us(u32 nus)
{
u32 temp; //储存CTRL寄存器的值
SysTick->LOAD = nus*fac_us; //设置要数到值
SysTick->VAL = 0x00; //清空计数器的值
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //SysTick定时器使能
do
{
temp = SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //判断是否计数到达
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //SysTick定时器失能
SysTick->VAL = 0x00; //清空计数器的值
}
/*************************************************
*函数名: Delay_ms
*函数功能: 毫秒级延时函数
*输入: nus:延时nus毫秒
*返回值: 无
**************************************************/
void Delay_ms(u32 nus)
{
u32 temp; //储存CTRL寄存器的值
SysTick->LOAD = nus*fac_ms; //设置要数到值
SysTick->VAL = 0x00; //清空计数器的值
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //SysTick定时器使能
do
{
temp = SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //判断是否计数到达
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //SysTick定时器失能
SysTick->VAL = 0x00; //清空计数器的值
}
在main.c文件while循环中调用。
GPIO_SetBits(GPIOB,GPIO_PIN_5 | GPIO_PIN_6 );
Delay_ms(600); //延时600ms
GPIO_ResetBits(GPIOB,GPIO_PIN_5 | GPIO_PIN_6 );
Delay_ms(600);
GPIO_SetBits(GPIOB,GPIO_PIN_9 | GPIO_PIN_10 );
Delay_ms(600); //延时600ms
GPIO_ResetBits(GPIOB,GPIO_PIN_9 | GPIO_PIN_10 );
Delay_ms(600);