STM32CubeIDE学习记录(按键点灯工程)

博主使用的开发板以及相关外设连接如下:

芯片型号为: STM32F103RCT6

新建STM32CubeIDE项目

STM32CubeIDE学习记录(按键点灯工程)

配置完成后会生成相应的文件并进入如下界面:

  • 使用外部晶振时钟
    STM32CubeIDE学习记录(按键点灯工程)

配置相关GPIO口

(LED:PA8,PD2;KEY:PC5, PA15, PA0)

LED配置(GPIO_OutPut):

STM32CubeIDE学习记录(按键点灯工程)

KEY配置(GPIO_Input):

STM32CubeIDE学习记录(按键点灯工程)

并在User Label框中进行重命名,方便理解与编程。

时钟信号配置

STM32CubeIDE学习记录(按键点灯工程)
STM32CubeIDE学习记录(按键点灯工程)

构建项目

STM32CubeIDE学习记录(按键点灯工程)
点击即可生成相应代码。

工作目录

编辑程序

分别添加文件:led.h, led.c, key.h, key.c
led.h

#include "stm32f1xx.h"
#include "main.h"

void LED0_INV();
void LED1_INV();
void LED_INIT();

led.c

#include "led.h"

void LED0_INV(){
    HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
}

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

void LED_INIT(){
    HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
    HAL_Delay(500);
}

key.h

#include "stm32f1xx.h"
#include "main.h"

#define KEY0        HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)
#define KEY1        HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)
#define WK_UP       HAL_GPIO_ReadPin(KEY_INIT_GPIO_Port,KEY_INIT_Pin)

#define KEY0_PRES   1
#define KEY1_PRES   2
#define WKUP_PRES   3

uint8_t KEY_Scan(uint8_t mode);

key.c

#include "key.h"

//Mode 0: Support continuous pressing, Mode 1: Do not support continuous pressing
//return 0: no pressing

uint8_t KEY_Scan(uint8_t mode)
{
    static uint8_t key_up=1;
    if(mode)key_up=1;
    if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
    {
        HAL_Delay(10);
        key_up=0;
        if(KEY0==0)       return KEY0_PRES;
        else if(KEY1==0)  return KEY1_PRES;
        else if(WK_UP==1) return WKUP_PRES;
    }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
    return 0;
}

在main函数中添加如下代码:

  /* USER CODE BEGIN 2 */
    uint8_t key=0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        key=KEY_Scan(0);
        switch(key)
        {
            case KEY0_PRES:
                LED0_INV();
                break;
            case KEY1_PRES:
                LED1_INV();
                break;
            case WKUP_PRES:
                LED_INIT();
                break;
            default:
                HAL_Delay(10);
        }
    /* USER CODE END WHILE */

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

生成hex文件

点击编译即可生成

STM32CubeIDE学习记录(按键点灯工程)

Original: https://www.cnblogs.com/litecdows/p/stm32cube_key.html
Author: litecdows
Title: STM32CubeIDE学习记录(按键点灯工程)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610146/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CentOS shell中的变量

    shell中的变量 变量的介绍 变量即变化的量,核心是”变”与”量”二字,变即变化,量即衡量状态。 量:是记录现实世界当中的某种状态…

    Linux 2023年6月7日
    083
  • 关于多个 Cookie 的分隔符这件事

    对于 Cookie 的处理上,我最近遇到一个问题,那就是如何分割 Cookie 的内容。有人说是使用逗号分割,有人说是使用分号分割,究竟用哪个才是对的?其实这个答案是需要分为两个过…

    Linux 2023年6月6日
    086
  • Vim配置文件-详解(.vimrc)

    Vim配置文件的作用 Vim启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim 所有系统用户在启动Vim时,都会加载这个配置文件。…

    Linux 2023年6月13日
    077
  • 设计模式——创建型设计模式

    创建型设计模式 争对 对象/类创建时的优化 工厂方法模式(了解) 通过定义顶层抽象工厂类,通过继承的方式,针对于每…

    Linux 2023年6月7日
    083
  • redis中save和bgsave区别

    SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同: SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在…

    Linux 2023年5月28日
    060
  • NoteOfMySQL-10-触发器与事件

    触发器是由事件来触发某个操作,这些事件包括insert语句、update语句、delete语句,当数据库系统执行这些事件时,就会激活触发器执行相应的操作。事件调度器(event s…

    Linux 2023年6月14日
    090
  • Golang 实现 Redis(11): RDB 文件格式

    RDB 文件使用二进制方式存储 Redis 内存中的数据,具有体积小、加载快的优点。本文主要介绍 RDB 文件的结构和编码方式,并借此探讨二进制编解码和文件处理方式,希望对您有所帮…

    Linux 2023年5月28日
    086
  • 趣谈IO多路复用的本质

    在《轻松搞懂5种IO模型》中,我发起了一个投票。 答案是【同步IO多路复用】。目前,60%的朋友答对了。原因这里解释一下。 同步和异步的概念区别 同步:线程自己获取结果。(一条线索…

    Linux 2023年5月27日
    058
  • redis实战

    转载于:https://blog.csdn.net/piaoslowly/article/details/81563579 redis简介 Redis 是一个开源的 使用 ANSI…

    Linux 2023年5月28日
    087
  • ASP.NET Core设置URLs的几种方法

    前言 在使用ASP.NET Core 3.1开发时,需要配置服务器监听的端口和协议,官方帮助文档进行简单说明,文档中提到了4种指定URL的方法 设置 ASPNETCORE_URLS…

    Linux 2023年6月8日
    071
  • Paxos 协议简单介绍

    一、简介 Paxos 协议是少数在工程实践中证实的强一致性、高可用的去中心化分布式协议。Google 的很多大型分布式系统都采用了 Paxos 算法来解决分布式一致性问题,如 Ch…

    Linux 2023年6月16日
    0131
  • pyQt的基本使用

    1. 基本窗口 import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == ‘__mai…

    Linux 2023年6月7日
    096
  • python入门基础知识一(基于孙兴华python自动化)

    print(‘aaa’)等价于print(“aaa”) 英文单引号和双引号在字符串的输出上并无区别,但如果要打印这么一段话:I&#8…

    Linux 2023年6月7日
    084
  • WEB自动化-01-Cypress 介绍

    Cypress 介绍 1.1 Cypress 简介 Cypress是一款基于 JavaScript的下一代前端测试工具。可以对浏览器中运行的任何内容进行快速、简单和可靠的测试。Cy…

    Linux 2023年6月7日
    085
  • redis 订阅与发布

    Reference: https://redisbook.readthedocs.io/en/latest/feature/pubsub.html Redis 的 SUBSCRIB…

    Linux 2023年5月28日
    099
  • U盘如何安装centos7系统?U盘安装centos7详细安装图解教程

    一般来说,无论是Windows还是linux的IOS系统镜像,我们都可以使用UltraIOS(软碟通)这款软件制作U盘启动工具,不过考虑到不少小白依然不会如何操作,所以今天考虑写一…

    Linux 2023年6月8日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球