首页 > 其他分享 >【STM32】Gpio通用输入输出功能应用笔记

【STM32】Gpio通用输入输出功能应用笔记

时间:2024-03-28 17:31:18浏览次数:31  
标签:Beep HAL void 输入输出 STM32 GPIO 2.2 Gpio 管脚

文章目录


一、前言

1.1 开发环境

①Keil MDK V5.38a
②STM32CubemxV6.10.0
③正点原子战舰板(STM32F103ZET6)
④高速DAP仿真器

1.2 GPIO电路原理

在这里插入图片描述

1.3 板卡电路原理

1.3.1 按键电路原理

由下图可知,Key0、Key1和Key2会在按键按下时,将对应的Gpio管脚连接到GND,即将Gpio管脚拉低,当按键没有按下时Gpio管脚应该默认为高电平,用来区分按键按下和未按下两种状态;所以需要使能Gpio管脚的输入模式,并配置GPIO管脚上拉。
在这里插入图片描述

1.3.2 Led电路原理

由下图可知,当Gpio管脚输出低电平时,会在Led的两端产生电压差,从而驱动Led点亮,当Gpio管脚输出高电平时,会在Led的两端没有电压差,Led熄灭;所以需要使能Gpio管脚为输出模式,并配置Gpio管脚上拉。
在这里插入图片描述

1.3.3 Beep电路原理

由下图可知,当Gpio管脚输出高电平时,会在导通三极管,同时Beep的两端会产生电压差,从而驱动Beep鸣叫,当Gpio管脚输出低电平时,会在关断三极管,同时Beep的两端没有电压差,Beep停止鸣叫;所以需要使能Gpio管脚为输出模式,并配置Gpio管脚下拉。
在这里插入图片描述


二、功能实现

2.1 配置STM32Cubemx工程

1、配置MCU调试功能(PS:若不配置该参数可能导致程序下载一次后,再次下载失败的情况)
在这里插入图片描述
根据实际调试器与MCU引脚的连接数量选择调试参数,通常只连接2个管脚选择Serial Wire。

2、配置连接LED1的GPIO管脚(鼠标左键选择GPIO_Output即可,鼠标右键选择Enter User Label即可设置GPIO管脚名称)
在这里插入图片描述

3、配置连接BEEP的GPIO管脚
在这里插入图片描述

4、配置连接KEY2的GPIO管脚
在这里插入图片描述

5、配置连接KEY1的GPIO管脚

在这里插入图片描述

6、配置连接KEY0的GPIO管脚
在这里插入图片描述

7、配置MCU时钟树,默认使用外部时钟源,并配置系统时钟为72MHz
在这里插入图片描述
在这里插入图片描述

8、生成Keil MDK工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 Keil MDK工程编码

2.2.1 按键功能代码

uint32_t Independent_Button_Scan(void)
{
    if(GPIO_PIN_SET == HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin))
    {
        return 1;
    }
    else if(GPIO_PIN_SET == HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin))
    {
        return 2;
    }
    else if(GPIO_PIN_SET == HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin))
    {
        return 3;
    }

    return 0;
}

2.2.2 LED灯功能代码

void Led1_Open(void)
{
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
}

void Led1_Close(void)
{
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
}

void Led1_Toggle(void)
{
    HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
}

2.2.3 Beep功能代码

void Beep_Open(void)
{
    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
}

void Beep_Close(void)
{
    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
}

void Bepp_Toggle(void)
{
    HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);
}

2.2.4 Main函数代码

/* 重定义HAL_Delay,优化低延时的延时误差 */
void HAL_Delay(uint32_t Delay)
{
    uint32_t tickstart = HAL_GetTick();
    uint32_t wait = Delay;

    /* Add a freq to guarantee minimum wait */
    if (0 == wait)
    {
        wait += (uint32_t)(uwTickFreq);
    }

    while ((HAL_GetTick() - tickstart) < wait)
    {
    }
}

void Main_Handle(void)
{
    static uint32_t beep_cnt = 0;
    static uint32_t beep_flag = 0;
    static uint32_t button_cnt = 0;
    static uint32_t filter_cnt = 0;

    Led1_Open();
    Beep_Open();
    HAL_Delay(100);
    Led1_Close();
    Beep_Close();

    while(1)
    {
        if(button_cnt++ >= 10)
        {
            button_cnt = 0;
            /* 按键抖动滤波 */
            if(0 == filter_cnt)
            {
                switch(Independent_Button_Scan())
                {
                    case 1:Led1_Toggle();filter_cnt = 30;break;
                    case 2:Beep_Toggle();filter_cnt = 30;break;
                    case 3:beep_flag = 1;Beep_Toggle();filter_cnt = 30;break;
                    default:break;
                }
            }
            else
            {
                filter_cnt--;
            }
        }

        if((0 != beep_flag) && (beep_cnt++ >= 300))
        {
            beep_cnt = 0;
            beep_flag = 0;
            Beep_Toggle();
        }

        HAL_Delay(1);
    }
}

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  Main_Handle();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

2.2.5 Keil MDK调试参数配置

在这里插入图片描述
在这里插入图片描述

2.2.6 下载验证

①板卡上电后,Beep鸣叫100ms后关闭,同时Led1常亮100ms后关闭
②按下Key0后,Led1状态翻转
③按下Key1后,Beep状态翻转
④按下Key2后,Beep鸣叫300ms后关闭


三、参考资料

[1]正点原子战舰板原理图-WarShip STM32F1_V3.4_SCH
[2]STM32F1开发指南-HAL库版本_V1.1
[3]STM32中文参考手册_V10
[4]Cortex-M3权威指南(中文)

标签:Beep,HAL,void,输入输出,STM32,GPIO,2.2,Gpio,管脚
From: https://blog.csdn.net/qq_45216743/article/details/137053589

相关文章

  • 基于STM32的ModBus实现(二)移植FreeMODBUS TCP
    一、ModBusTCPModbusTCP是一种基于TCP/IP协议的Modbus通信协议的变种。它允许Modbus协议在以太网上进行通信,提供了一种简单而有效的方式来连接不同类型的设备,如传感器、执行器、PLC等。ModbusTCP使用标准的TCP/IP协议栈,因此可以在现有的以太网基础设施上运行,而无需额外的硬......
  • Day52:WEB攻防-XSS跨站&反射型&存储型&DOM型&标签闭合&输入输出&JS代码解析
    目录XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS:(某案例测试)知识点:1、XSS跨站-输入输出-原理&分类&闭合2、XSS跨站-分类测试-反射&存储&DOMXSS跨站-输入输出-原理&分类&闭合漏洞原理:接受输入数据,输出显......
  • Python学习——访问命令行参数、标准输入输出
    一、sys模块    通过sys.argv()函数访问命令行参数,sys.argv()生成的是一个列表,argv[0]访问脚本,argv[1]访问第一个参数,argv[2]访问第二个参数。例1、通过调用命令行参数n,生成n个随机数。#访问命令行importsys,randomn=int(sys.argv[1])#调用命令行第一个参数,即n......
  • GPIO端口的BSRR的使用
    BSRR只写寄存器既能控制管脚为高电平,也能控制管脚为低电平。对寄存器高16bit写1对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写0,无动作首先看GPIOC的定义接着看这个类型的定义可以看到BSRR为无符号的32位的整形接下来看GPIO_Pin_13的定义可以看......
  • 基于STM32的ModBus实现(一)移植FreeMODBUS RTU
    一、FreeMODBUSFreeModbus是一个开源的Modbus通信协议栈实现。它允许开发者在各种平台上轻松地实现Modbus通信功能,包括串口和以太网。FreeMODBUS提供了用于从设备和主站通信的功能,支持ModbusRTU和ModbusTCP协议。在工业控制和自动化领域广泛应用。FreeModBus可通过官......
  • Xilinx ZYNQ 7000+Vivado2015.2系列(六)创建一个基于AXI总线的GPIO IP并使用
    前言:FPGA+ARM是ZYNQ的特点,那么PL部分怎么和ARM通信呢,依靠的就是AXI总线。这个实验是创建一个基于AXI总线的GPIOIP,利用PL的资源来扩充GPIO资源。通过这个实验迅速入门开发基于总线的系统。使用的板子是zc702。AXI总线初识:AXI(AdvancedeXtensibleInterface),由ARM公司提出的......
  • 痞子衡嵌入式:给i.MXRT1xxx系列GPIO提早供电会影响DCDC_PSWITCH上电时序导致内部DCDC启
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是给i.MXRT1xxx系列GPIO提早供电会影响DCDC_PSWITCH上电时序导致内部DCDC启动失败。最近有一个RW612产品线的同事在设计一个双MCU系统Demo时发现,当RW612板卡和RT1060板卡通过UART对接时,如果RW6......
  • Proteus8.0仿真应用设计(十七)基于FreeRTOS、STM32F103C8、HAL库、DHT11、LCD12864的温
    一、简介:        DHT11是一款湿、温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个NTC测温元件。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。传感器内部......
  • Xilinx ZYNQ 7000+Vivado2015.2系列(四)之GPIO的三种方式:MIO、EMIO、AXI_GPIO
    前言:ZYNQ7000有三种GPIO:MIO,EMIO,AXI_GPIOMIO是固定管脚的,属于PS,使用时不消耗PL资源;EMIO通过PL扩展,使用时需要分配管脚,使用时消耗PL管脚资源;AXI_GPIO是封装好的IP核,PS通过M_AXI_GPIO接口控制PL部分实现IO,使用时消耗管脚资源和逻辑资源。使用的板子是zc702。1.MIO方式Zynq7000......
  • stm32串口使用dma接收数据全为0发送正常
    cubemx版本:keil版本:当使用cubeMX生成代码时,需要调整dma初始化和串口初始化的顺序,在3处那里调整,不然串口接收的数据全是0,未知原因,只找到办法......