GPIO(通用型输入/输出)

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值