STM32 基础知识(探索者开发板)--51讲 GPIO

GPIO八种工作模式

浮空输入:可读取引脚电平,引脚悬空时电平不确定,呈高阻态,数据存入IDR寄存器

                GPIO_Mode_IN_FLOATING

上拉输入:可读取引脚电平,引脚悬空时是高电平,数据存入IDR寄存器

                GPIO_Mode_IPU

下拉输入:可读取引脚电平,引脚悬空时是低电平,数据存入IDR寄存器

                GPIO_Mode_IPD

模拟输入:GPIO无效,引脚直接接入内部ADC或外设

                GPIO_Mode_AIN

开漏输出:可输出引脚电平,不能输出高电平

                GPIO_Mode_Out_OD

推挽输出:可输出引脚电平,驱动能力较强,可输出高电平

                GPIO_Mode_Out_PP

复用开漏输出:由外设控制(PWM),而不是寄存器ODR,无法输出高电平(除非外接或内接高电平)

                        GPIO_Mode_AF_OD

复用推挽输出:由外设控制(PWM),而不是寄存器ODR,可输出高低电平,驱动能力强

                        GPIO_Mode_AF_PP

STM32 基础知识(探索者开发板)--51讲 GPIO_第1张图片

通用外设驱动模型(4步)

1.初始化                                            时钟设置,参数设置,中断设置,IO设置

2.读函数(可选)                                  从外设读数据

3.写函数(可选)                                  往外设写数据

4.中断服务函数(可选)                       根据中断标志,处理外设各种中断事务

GPIO配置步骤(4步)

1.使能时钟               _HAL_RCC_GPIOx_CLK_ENABLE()是个宏

2.设置工作模式        HAL_GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_Init)

3.设置输出状态        HAL_GPIO_WritePin() HAL_GPIO_TogglePin()

4.读取输入状态        HAL_GPIO_ReadPin()

解释 HAL_GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_Init)

参数1是外设寄存器基地址 比如GPIOA,GPIOB

参数2是工作模式结构体基地址(句柄),需要自己定义和赋值,结构体成员如下图

STM32 基础知识(探索者开发板)--51讲 GPIO_第2张图片

结构体成员赋值选项在stm32f4xx_hal_gpio.c和.h中

设置引脚值HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,GPIO_PinState)

(外设寄存器基地址,引脚号,状态是0或1)

设置翻转引脚值HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)

(外设寄存器基地址,引脚号)

按键控制LED工程代码:

LED

//led.c
#include "./BSP/LED/led.h"


/**
 * @brief       初始化LED相关IO口, 并使能时钟
 * @param       无
 * @retval      无
 */
void led_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;                  //创建结构体
    
    __HAL_RCC_GPIOF_CLK_ENABLE();                       //GPIO使能
    
    gpio_init_struct.Pin = GPIO_PIN_9;                  //GPIO引脚选择
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;        //GPIO模式选择,推挽输出
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;       //输出速度选择
    HAL_GPIO_Init(GPIOF,&gpio_init_struct);             //引脚初始化
    HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);   //设置LED初始状态
    
    
}

//led.h
#ifndef __LED_H
#define __LED_H

#include "./SYSTEM/sys/sys.h"

void led_init(void);

#endif

KEY

//key.c
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"

void key_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;             //创建结构体
    
    __HAL_RCC_GPIOE_CLK_ENABLE();               //GPIO使能
    
    gpio_init_struct.Pin = GPIO_PIN_2;           //GPIO引脚选择
    gpio_init_struct.Mode = GPIO_MODE_INPUT;  //GPIO模式选择,输入模式
    gpio_init_struct.Pull = GPIO_PULLUP;        //上拉输入
    HAL_GPIO_Init(GPIOF,&gpio_init_struct);   //引脚初始化
    
}

uint16_t key_scan(void)
{

    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
    {
        delay_ms(10); //消抖
        if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
        {
            while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0); //等待按键松开
            return 1;   //按键按下
        }
    }
    return 0;//按键没有按下
}


//key.h
#ifndef __KEY_H
#define __KEY_H

#include "./SYSTEM/sys/sys.h"

uint16_t key_scan(void);
void key_init(void);

#endif

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"

int main(void)
{
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */
    delay_init(168);                        /* 延时初始化 */
    led_init();                             /* 初始化LED */
    key_init();                             /* 初始化KEY */
    
    while(1)
    {
        if(key_scan())
        {
            HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);//按键按下,led点亮
        }
        else
        {
            delay_ms(10);
        }
    }
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机)