标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别

点亮一个LED灯:是直接控制输出引脚,GPIO初始化推挽输出即可

按键控制LED:是按键输入信号从而控制输出引脚,GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入

但是控制GPIO本质还是1.RCC时钟使能  2.结构体配置GPIO寄存器  3.控制GPIO

标准库写法

led.c

1.RCC时钟使能  2.结构体配置GPIO寄存器  3.控制GPIO(我们这里封装成函数ON;OFF;swtich)

#include "stm32f10x.h"                  // Device header
#include "delay.h"
void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//1.RCC时钟使能GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);			 	//2.结构体配置GPIO寄存器GPIO_SetBits (GPIOA,GPIO_Pin_1 | GPIO_Pin_2);			//3.控制GPIO值为1
}/*** @brief  LED1灯亮* @param  无* @retval 无*/
void LED1_ON(void)
{GPIO_ResetBits (GPIOA,GPIO_Pin_1);			//控制LED1亮
}/*** @brief  LED2灯亮* @param  无* @retval 无*/
void LED2_ON(void)
{GPIO_ResetBits (GPIOA,GPIO_Pin_2);			//控制LED2亮
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED1_OFF(void)
{GPIO_SetBits (GPIOA,GPIO_Pin_1);			//控制LED1灭
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED2_OFF(void)
{GPIO_SetBits (GPIOA,GPIO_Pin_2);			//控制LED2灭
}/*** @brief  LED1灯状态切换* @param  无* @retval 无*/
void LED1_switch(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 1){GPIO_ResetBits (GPIOA,GPIO_Pin_1);}else{GPIO_SetBits (GPIOA,GPIO_Pin_1);}
}/*** @brief  LED2灯状态切换* @param  无* @retval 无*/
void LED2_switch(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == Bit_SET){GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);}else{GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);}
}

led.h

#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);
void LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_switch(void);
void LED2_switch(void);#endif

key.c

这里按键获取函数采用的是delay检测,是阻塞式的函数,这不好等学到定时器中断我们再用定时器定时检测

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
    {
        Delay_ms(20);    //按下消抖
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);
        Delay_ms(20);    //松开消抖
        keynum = 1;
    }

#include "stm32f10x.h"                  // Device header
#include "DELAY.h"
void KEY_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//1.RCC时钟使能GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);			 	//2.结构体配置GPIO寄存器}/*** @brief  按键获取函数* @param  无* @retval 按键值1->PB1,2->pb11*/
uint8_t KEY_Getstate(void)
{uint8_t keynum = 0;if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0){Delay_ms(20);	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);Delay_ms(20);keynum = 1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0){Delay_ms(20);	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);Delay_ms(20);	keynum = 2;}		return keynum;
}

key.h

#ifndef __KEY_H
#define __KEY_Hvoid KEY_Init(void);
uint8_t KEY_Getstate(void);
#endif

main()

定义一个变量把按键状态接收,通过不同按键值来控制LED状态

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "LED.h"
#include "KEY.h"uint8_t keynum;
int main ()
{KEY_Init();LED_Init();while(1){keynum = KEY_Getstate();if(keynum == 1){LED1_switch();}else if(keynum == 2){LED2_switch();}}
}

标准库写完了,接下来我们写HAL库

HAL库分三步

1.建工程

2.设配置

3.写代码

HAL库写法

一. 关于建工程请参考:江科大学习笔记之——HAL库点亮一个LED灯-CSDN博客在里面有详细步骤,简单易懂

二.配置设置

这里我设置错了应该是PB11,你们自己注意一下

ctrl+s生成代码

三.写代码

为了方便我们把LED,KEY单独拿出来放在System文件夹下

在cubeIDE里面想建立自己的.C.H文件步骤如下

1.建立文件夹

2.

 鼠标右键点击文件名–Properties

3. 进入Includes 添加文件的路径

同时还要增加源文件的路径

好准备工作做完了,上面cube ide的模块化是我自己在网上找半天才找到的方法:

STM32CubemxIDE 导入自定义的.c和.h文件_stm32cubeide添加源文件-CSDN博客

本想问别人但是想想还是提高自己解决问题的能力吧,所以我就花了更多时间去自己搜索解决方法。

现在开始写代码

模块代码的逻辑都一样只是把标准库的函数我就不多赘述了,换成了HAL库的函数

led.c

这里LED灯的熄灭与点亮有,电平翻转函数HAL_GPIO_TogglePin,关于HAL库的函数可以看:

HAL库函数合集-CSDN博客


#include "gpio.h"/*** @brief  LED1灯亮* @param  无* @retval 无*/
void LED1_ON(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//控制LED1亮
}/*** @brief  LED2灯亮* @param  无* @retval 无*/
void LED2_ON(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);	//控制LED2亮
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED1_OFF(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//控制LED1灭
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED2_OFF(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//控制LED2灭
}/*** @brief  LED1灯状态切换* @param  无* @retval 无*/
void LED1_switch(void)
{HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
}/*** @brief  LED2灯状态切换* @param  无* @retval 无*/
void LED2_switch(void)
{HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
}

led.h

#ifndef __LED_H
#define __LED_Hvoid LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_switch(void);
void LED2_switch(void);#endif

key,c


#include "gpio.h"
/*** @brief  按键获取函数* @param  无* @retval 按键值1->PB1,2->pb11*/
uint8_t KEY_Getstate(void)
{uint8_t keynum = 0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0){HAL_Delay(20);while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0);HAL_Delay(20);keynum = 1;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11) == 0){HAL_Delay(20);while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11) == 0);HAL_Delay(20);keynum = 2;}		return keynum;
}

key.h

#ifndef __KEY_H
#define __KEY_Huint8_t KEY_Getstate(void);
#endif

main()

这里就定义了uint8_t keynum;

然后写了while,其他都是生产的代码

  while (1){keynum = KEY_Getstate();if(keynum == 1){LED1_switch();}else if(keynum == 2){LED1_OFF();}
}
/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t keynum;
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
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 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){keynum = KEY_Getstate();if(keynum == 1){LED1_switch();}else if(keynum == 2){LED1_OFF();}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

编译烧入现象和标准库一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的list中状态属性相同返回true的实现方案

文章目录 项目背景方案一、for循环实现实现思路 方案二、stream实现实现思路 项目背景 在项目中会遇到list中多个状态判断,状态值相等时,总体返回为true。 方案一、for循环实现 实现思路 遍历list,当出现不一致时,直接跳出循环…

模型选择+过拟合欠拟合

训练误差和泛化误差 训练误差:模型在训练数据上的误差 泛化误差:模型在新数据上的误差 验证数据集:一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集:只能用一次 K则交叉验证 在没有足够数据时使用 算法…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

语音识别基础算法——动态时间规整算法

前言 动态时间规整算法,Dynamic Time Wraping,缩写为DTW,是语音识别领域的一个基础算法。 算法的提出 DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为:在识别阶段,将输入…

SAP SD信贷管理信用管理手册(下)

1、项目类别的信贷激活 图1-12-1.项目类别的信贷设置路径 图1-12-2.项目类别的信贷参数激活 说明:项目类别是否进行信贷管理设置。 2、定义信贷组 图1-13-1.定义信贷组路径 图1-13-2.信贷组定义 说明:信贷组参与后续信贷控制的组合分配。 3、销售凭证及…

分布式项目___某污水处理项目

一.分布式项目___污水处理项目 项目地址:https://gitee.com/yanyigege/collaborative-water-springboot.git ​ 1.项目背景 总公司在全国各地有处理污水的项目部,各项目部处理自己的污水,总部需要监控各地分项目部每天处理污水的原料用量,掌握各分部的污水处理情况 ​ 2.功…

Nginx详细安装配置过程

目录 1.nginx环境准备 1.1 在配置好yum源之后,安装如下的编译工具 1.2 安装nginx所需的依赖库 1.3 关闭防火墙,selinux,并确保网络正常 2.nginx的编译安装 2.1从nginx官网复制下载链接,wget 下载 2.2? 解压nginx源代码 2…

2025年阿里云认证改版新消息!2025年阿里云认证考试内容有变!

阿里云认证已经确定在2025年要进行大改,这次改动幅度会比2023年改动更大,2023年主要改变是在考试题型上的变化,这次则主要是考试内容的变化了! 2023年阿里云ACP认证考试的改版变化主要有: (一&#xff09…

【Scala】图书项目系统代码演练3.1/BookService

package org.app package serviceimport models.{BookModel, BorrowRecordModel}import org.app.dao.{BookDAO, BorrowRecordDAO}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookService {private val bookDAO new B…

Ajax数据爬取

有时我们用requests 抓取页面得到的结果,可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档,而浏览器中的页面是JavaScript 处理…

SpringCloud整合skywalking实现链路追踪和日志采集

1.部署skywalking https://blog.csdn.net/qq_40942490/article/details/144701194 2.添加依赖 <!-- 日志采集 --><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version&g…

12.30 Redis网络模型基础 IO NIO多路复用

图片引用自黑马程序员redis 网络模型 上图引用自java guide javaguide NIO

【智行安全】基于Synaptics SL1680的AI疲劳驾驶检测方案

随著车载技术的快速进步&#xff0c;驾驶安全越来越受到重视&#xff0c;而疲劳驾驶是造成交通事故的重要原因之一。传统的驾驶监控技术因精度不足或反应迟缓&#xff0c;无法满足实时监测需求。因此&#xff0c;结合人工智能技术的疲劳驾驶检测系统成为行业新方向&#xff0c;…

手机实时提取SIM卡打电话的信令声音-智能拨号器的SIP线路-双卡双待单通方案

手机实时提取SIM卡打电话的信令声音 --智能拨号器的SIP线路-双卡双待单通方案 一、前言 蓝牙电话的技术方案最初是从蓝牙耳机和车机蓝牙的使用领域延伸出来的技术方式。通过蓝牙的HFP协议&#xff0c;把手机通话的声音和通话事件状态提取出来进行复用和处理。但中国大陆现行…

HTML——26.像素单位

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>像素</title></head><body><!--像素&#xff1a;1.指设备屏幕上的一个点&#xff0c;单位px&#xff0c;如led屏上的小灯朱2.当屏幕分辨率固定时&…

LeetCode:513.找二叉树左下角的

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;513.找二叉树左下角的 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

Mcnemar‘s exact test

与卡方检验的区别 与fisher exact test区别

全面Kafka监控方案:从配置到指标

文章目录 1.1.监控配置1.2.监控工具1.3.性能指标系统相关指标GC相关指标JVM相关指标Topic相关指标Broker相关指标 1.4.性能指标说明1.5.重要指标说明 1.1.监控配置 开启JMX服务端口&#xff1a;kafka基本分为broker、producer、consumer三个子项&#xff0c;每一项的启动都需要…

网络安全威胁2024年中报告

下载地址&#xff1a; 网络安全威胁2024年中报告-奇安信