STM32CubeMX系列 | 按键输入

发布者:心连心意最新更新时间:2023-03-20 来源: zhihu关键字:STM32CubeMX系列  按键输入  IO口 手机看文章 扫描二维码
随时随地手机看文章

按键输入

1. 实验介绍

本实验介绍如何使用STM32F103的IO口作为输入使用。IO口作为输入使用时,是通过读取IDR的内容来读取IO口的状态的。 本实验利用板载的4个按键,来控制板载的两个LED的亮灭和蜂鸣器。其中KEY_UP控制蜂鸣器;K1控制D1,按一次亮再按一次灭;K2控制D2,按一次亮再按一次灭;K3同时控制D1和D2,按一次它们的状态就翻转一次

2. 硬件设计

用到的硬件资源有:

  • 指示灯D1、D2

  • 蜂鸣器BUZ

  • 4个按键:KEY_UP、K1、K2、K3

硬件连接原理图如下,注意K1、K2、K3是低电平有效的,而KEY_UP是高电平有效,并且外部都没有上下拉电阻,所以需要在STM32F1内部设置上下拉; STM32F103芯片单个IO口最大输出电流是25mA,而蜂鸣器的驱动电流是30mA左右,整个芯片的输出电流最大为150mA,如果在蜂鸣器上就消耗30mA,那么芯片的其他IO口及外设电流就比较拮据了,因此此处不会直接使用IO口驱动蜂鸣器,而是通过三极管把电流放大后再驱动蜂鸣器,这样IO口只需提供不到1mA的电流就可以控制蜂鸣器

3. 软件设计

3.1 STM32CubeMX设置

  • RCC设置外接HSE,时钟设置为72M

  • PC0和PC1设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平

  • PB5设置为GPIO推挽输出、高速模式

  • PA0设置为GPIO输入模式、下拉模式;PE2/PE3/PE4设置为GPIO输入模式、上拉模式

  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码

3.2 MDK-ARM软件编程

  • 在gpio.c文件中可以看到PC0/PC1/PB5/PA0/PE2/PE3/PE4管脚的初始化函数

void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOE_CLK_ENABLE();     //开启GPIOE时钟

  __HAL_RCC_GPIOC_CLK_ENABLE();     //开启GPIOC时钟

  __HAL_RCC_GPIOA_CLK_ENABLE();     //开启GPIOA时钟

  __HAL_RCC_GPIOB_CLK_ENABLE();     //开启GPIOB时钟

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin, GPIO_PIN_SET);    //LED1/LED2默认输出是电平为高电平

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(BUZ_GPIO_Port, BUZ_Pin, GPIO_PIN_RESET);    //BUZ默认输出是电平为低电平    

  /*Configure GPIO pins : PEPin PEPin PEPin */

  GPIO_InitStruct.Pin = K_LEFT_Pin|K_DOWN_Pin|K_RIGHT_Pin;      //PE2/PE3/PE4

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;                       //输入

  GPIO_InitStruct.Pull = GPIO_PULLUP;                           //上拉

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pins : PCPin PCPin */

  GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin;                      //PC0/PC1

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;                   //推挽输出

  GPIO_InitStruct.Pull = GPIO_PULLUP;                           //上拉

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;                 //高速

  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */

  GPIO_InitStruct.Pin = K_UP_Pin;                               //PA0

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;                       //输入

  GPIO_InitStruct.Pull = GPIO_PULLDOWN;                         //下拉

  HAL_GPIO_Init(K_UP_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */

  GPIO_InitStruct.Pin = BUZ_Pin;                                //PB5

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;                   //推挽输出

  GPIO_InitStruct.Pull = GPIO_NOPULL;                           //无上下拉

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;                 //高速

  HAL_GPIO_Init(BUZ_GPIO_Port, &GPIO_InitStruct);

}

在工程的应用文件目录下创建key.c文件,编写按键相关函数

/***********************************************************

*函 数 名: KEY_Scan(uint8_t mode)

*功    能: 按键处理函数

*形    参: mode:0 不支持连续按;1 支持连续按

*返 回 值: 返回按键值   0:表示未有按键按下

*                     1:KEY_RIGHT按下   2:KEY_DOWN按下

*                     3:KEY_LEFT按下    4:KEY_UP按下

***********************************************************/

uint8_t KEY_Scan(uint8_t mode)

{

    static uint8_t key = 1;     //按键松开标志

    if(mode == 1){              //支持连按

        key = 1;

    }


    if(key&&(KEY_UP==1||KEY_DOWN==0||KEY_LEFT==0||KEY_RIGHT==0)){

        HAL_Delay(10);          //按键消抖

        key = 0;

        if(KEY_UP==1)           return K_UP_PRES;

        else if(KEY_DOWN==0)    return K_DOWN_PRES; 

        else if(KEY_LEFT==0)    return K_LEFT_PRES; 

        else if(KEY_RIGHT==0)   return K_RIGHT_PRES; 

    }

    else if(KEY_UP==0&&KEY_DOWN==1&&KEY_LEFT==1&&KEY_RIGHT==1){

        key = 1;

    }


    return 0;

}

在工程的头文件目录下创建key.h文件,编写相关声明

#ifndef _KEY_H_

#define _KEY_H_


#include "stm32f1xx.h"


//操作HAL库函数读取IO口状态

#define KEY_RIGHT   HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)

#define KEY_DOWN    HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)

#define KEY_LEFT    HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)

#define KEY_UP      HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)

//定义按键按下时的键值

#define KEY_RIGHT_PRES  1

#define KEY_DOWN_PRES   2

#define KEY_LEFT_PRES   3

#define KEY_UP_PRES     4


uint8_t KEY_Scan(uint8_t mode);


#endif

在main.c函数中编写相关程序

int main(void)

{

  /* USER CODE BEGIN 1 */

    uint8_t key;

  /* 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 */

  /* USER CODE END 2 */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

        key = KEY_Scan(0);

        switch(key){

            case KEY_UP_PRES:

                HAL_GPIO_WritePin(GPIOB,BUZ_Pin,GPIO_PIN_SET);

                HAL_Delay(300);

                HAL_GPIO_WritePin(GPIOB,BUZ_Pin,GPIO_PIN_RESET);

                HAL_Delay(300);

                break;

            case KEY_LEFT_PRES:

                HAL_GPIO_TogglePin(GPIOC,LED1_Pin);

                break;

            case KEY_DOWN_PRES:

                HAL_GPIO_TogglePin(GPIOC,LED2_Pin);

                break;

            case KEY_RIGHT_PRES:

                HAL_GPIO_TogglePin(GPIOC,LED1_Pin);

                HAL_GPIO_TogglePin(GPIOC,LED2_Pin);

                break;

        }

        HAL_Delay(10);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

4. 下载验证

编译无误后下载到开发板,按下KEY_UP蜂鸣器响一下;K1控制D1,按一次亮再按一次灭;K2控制D2,按一次亮再按一次灭;K3同时控制D1和D2,按一次它们的状态就翻转一次


关键字:STM32CubeMX系列  按键输入  IO口 引用地址:STM32CubeMX系列 | 按键输入

上一篇:STM32CubeMX系列 | 跑马灯
下一篇:STM32CubeMX系列 | 串口通讯

推荐阅读最新更新时间:2024-11-11 18:23

PIC32单片机IO口操作之LED灯
#include plib.h #define uchar unsigned char #define uint unsigned int /*void delay(uint x) { uint a,b; for(a=x;a 0;a--) for(b=110;b 0;b--); } int main(void) { TRISB=0x00;//设置端口输出;可以参看数据手册 while(1) { PORTB=0x3C00;//四个控制LED的端口输出高电平; delay(100); PORTB=0x00;//关闭LED delay(100); } }//以上代码实现了LED灯的同时闪烁。*/ /*void delay(uint
[单片机]
51单片机扩展IO口后扩展口的地址如何确定
1. 然后它说8255的A口、B口、C口、控制寄存器的地址分别为7FFCH、7FFDH、7FFEH、7FFFH。这个是怎么算出来的? 高八位7F是因为p2.7为0是选通8255的cs片选端,第八位是FC,FD,FE,FF是由8255内部结构决定的,芯片的技术手册上会有,其实也是由最后两位的组合进行选择 2.在用C51的P0,P2口做外部扩展时使用,其中XBYTE ,P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。 比如:P2.7接WR,P2.6接RD,P2.5接CS,那么就可以确定个外部RAM的一个地址,想往外部RAM的一个地址写一个字节时,地址可以定为XBYTE ,其中WR,
[单片机]
STM32F103程序设计-7-引脚输入功能-按键(中断)
AFIO时钟的打开。外部中断、重映射、复用功能?当配置AFIO六个寄存器中的值时就需要打开AFIO时钟。 void EXTI0_Config(void) { /* Enable GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Configure PA.00 pin as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
[单片机]
STM32F103程序设计-7-引脚<font color='red'>输入</font>功能-<font color='red'>按键</font>(中断)
5.STC15W408AS单片机按键输入
在上面介绍了使用I/O口点了LED,实际也可以用I/O口做按键检测。这里采用的是P1.0口外接按键到GND。P1.1口外接LED到GND。 P1.0--- 按键--- GND。 P1.1--- LED--- GND。 实验程序如下: #include stc15.h void main() { P11 = 0; // 初始设置P1.1为0 熄灭LED while (1) { if(P10 == 0) // P1.0口检测到按键按下 { P11 = !P11; // P1.1口输出取反 } } } 按钮按下的时候的波形图: 这里发现,按钮按下的时候并没有机械抖动,而是波形直接被拉
[单片机]
5.STC15W408AS单片机<font color='red'>按键</font><font color='red'>输入</font>
基于STM32-按键输入与八种IO口模式
按键检测使用到 GPIO 外设的基本输入功能, 按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。 这里再讲下八种IO口模式: 1.模拟输入 我认为模拟输入最重要的一点就是。他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我认为这一点也是非常好理解的,由于输入数据寄存器中存放的不是0就是1。而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们能够获得外部的模拟信号。 2.浮空输入 该输入状态。我的理解是。它的输入全然由外部决定,我认为在数据通信
[单片机]
基于STM32-<font color='red'>按键</font><font color='red'>输入</font>与八种<font color='red'>IO口</font>模式
STM32-GPIO口设为外部中断时,中断函数名称
以A口为例,A0~A4中断函数名称为: void EXTI0_IRQHandler(void ); void EXTI1_IRQHandler(void ); void EXTI2_IRQHandler(void ); void EXTI3_IRQHandler(void ); A5~A9: void EXTI9_5_IRQHandler(void ); A10~A15: void EXTI15_10_IRQHandler(void );
[单片机]
51单片机IO口组成与功能简介
1、 P1口 准双向口,各位可分开使用,某位作输入线时,该位锁存器必须为‘1’;作为输入时,可以被任何TTL电路和MOS电路所驱动,由于内部有提升电路,也可以被集电极开路或漏极开路的电路所驱动。 P1口输出时能驱动4个LSTTL负载(100uA定义为一个TTL负载的输入电流)。 P1口完全属用户使用 2、 P3口 多功能口:第一功能-I/O准双向口,与P1口相同。 第二功能:RXD、TXD、INT0、INT1、T0、T1、/WR、/RD。 某位作为第二功能输入/输出线时,该位锁存器必须保持‘1’,是输出场效应管的状态由第二功能输出决定。 3、 P2口 两个功能:1)在单片机系统无外部扩展时,作为通用I/O口;同P
[单片机]
STM32的IO口如何配置
1.0 STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出) 1)浮空输入_IN_FLOATING 2)带上拉输入_IPU 3)带下拉输入_IPD 4)模拟输入_AIN 5)开漏输出_OUT_OD 6)推挽输出_OUT_PP 7)复用功能的推挽输出_AF_PP 8)复用功能的开漏输出_AF_OD 1.1I/O口的输出模式下,有3种输出速度可选(2M,10M,50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。 1.1.1对于串口,假如最大波特率只需115.2K,那么用2M的
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved