04:【stm32】LED编程和按键控制

LED编程和按键控制

  • 1、LED编程
    • 1.1、点亮一课LED灯
  • 2、按键控制
    • 2.1、通过一个按钮控制LED灯的亮灭

1、LED编程

1.1、点亮一课LED灯

   首先,我们想象一下,让LED灯点亮,引脚应该是输出模式,那么应该是通用模式,还是复用模式喃?我们只是让LED灯亮,并没有使用是什么特殊功能,不需要其他的片上外设。使用引脚使用通用模式。那使用推挽模式还是开漏模式喃?其实2种模式都可以。
在这里插入图片描述
我们一般选择开漏模式,当输出0时,LED点亮,输出1时,LED熄灭。

在这里插入图片描述
我们连接PA0引脚。下面是使用PA0,把他设置为通用开漏输出模式编写程序的步骤:

  • ①我们先将我们创建好的模板工程复制粘贴一份,文件夹命名为点亮LED

在这里插入图片描述

  • ②开启APB2总线上的片上外设的时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,Enable);//开启GPIOA的时钟,相当于把GPIOA的开关打开
    

在这里插入图片描述

  • ③对GPIOA进行配置(GPIOA几,输出模式,最大的输出速度)

在这里插入图片描述

我们对这个函数名双击然后右键,点击go to,查看这个函数是怎么定义的。

在这里插入图片描述

这个函数有2个形式参数,我们看见上面的注释中,GPIOx can be (A…G)。所以GPIOx我们填写GPIOA,而GPIO_InitStruct:pointer to a GPIO_InitTypeDef structure that contains the configuration information for the specified GPIO peripheral.(指向GPIO_InitTypeDef结构体的指针,该结构体包含指定GPIO外设的配置信息)
我们对GPIO_InitTypeDef双击然后右键,点击go to,

在这里插入图片描述

我们找到了这个结构体的定义
在这里插入图片描述

这个结构体里面由3部分组成,我们可以在红色框里面,找到这3部分的取值。我们双击然后Ctrl+F就会跳转过去

uint16_t GPIO_Pin:

在这里插入图片描述 GPIOSpeed_TypeDef GPIO_Speed;

在这里插入图片描述
由此可见:GPIOSpeed_TypeDef等于这个枚举中的一个变量。

GPIOMode_TypeDef GPIO_Mode;
在这里插入图片描述
在这里插入图片描述

所以我们先创建一个GPIO_InitTypeDef类型的结构体变量,变量名为GPIO_InitStruct,我们将结构体中的3个元素按我们是需求取值。

GPIO_InitTypeDef GPIOInitStruct;
GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出
GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIOInitStruct);

在这里插入图片描述

  • ③IO的读取与写入
    输出寄存器ODR的写入
    在这里插入图片描述
    输出寄存器ODR的读取
    读取的值是上一次写入的值
    在这里插入图片描述
    输入寄存器IDR的读取
    在这里插入图片描述

好了,我们分析完毕后开始写程序让LED灯点亮
程序1:

/*点亮一个LED灯*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{PAL_Init();//1.打开APB2上面的GPIOA的时钟,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//2.创建一个GPIO_InitTypeDef类型的结构体GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOA ,&GPIOInitStruct);//3.给GPIOA0输出一个低电平,点亮LED//3.1给ODR的最低位写入一个低电平
//	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//3.2给ODR整体写入数据
//	GPIO_Write(GPIOA,0x0000);//3.3给ODR某一位写入数据0GPIO_ResetBits(GPIOA,GPIO_Pin_0);while(1){}
}

程序2:

/*让LED闪烁起来*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{PAL_Init();//1.开启APB2上面的GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//2.创建一个GPIO_InitTypeDef类型的结构体变量GPIOInitStructGPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOA,&GPIOInitStruct);while(1){//3.让灯闪烁起来//3.1先让灯熄灭GPIO_WriteBit(GPIOA ,GPIO_Pin_0 ,Bit_SET);PAL_Delay(1000);//3.2先让灯点亮GPIO_WriteBit(GPIOA ,GPIO_Pin_0 ,Bit_RESET);PAL_Delay(1000);}
}

2、按键控制

2.1、通过一个按钮控制LED灯的亮灭

   我们通过检测按钮是否按下,来控制LED灯的状态。所以按钮连接的IO引脚应该配位输入模式,一般情况下,我们的输入模式配置为上拉输入模式。我们将按钮连接在PA1引脚

#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{PAL_Init();//1.打开APB2上面的GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//2.对GPIOA0进行配置,连接LEDGPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_Init(GPIOA,&GPIOInitStruct);//3.对GPIOC1进行配置GPIOInitStruct.GPIO_Pin = GPIO_Pin_1;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_Init(GPIOA,&GPIOInitStruct);//4.先让LED点亮GPIO_ResetBits(GPIOA ,GPIO_Pin_0);while(1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == Bit_RESET)//按键按下{PAL_Delay(10);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == Bit_SET)//按键抬起{PAL_Delay(10);if(GPIO_ReadOutputDataBit(GPIOA ,GPIO_Pin_0) == Bit_RESET)//读取PA0引脚的电平,如果是点亮{GPIO_SetBits(GPIOA ,GPIO_Pin_0);//让灯熄灭}else{GPIO_ResetBits(GPIOA ,GPIO_Pin_0);//点亮}}}}}

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

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

相关文章

打靶记录7——Hacker_Kid-v1.0.1

靶机下载地址 https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova难度 OSCP 风格的中级难度靶机(只需要获取root权限即可,CTF 风格的靶机就还需要获取flag) 涉及的攻击方法: 主机发现端口扫描Web信息收集DNS区域传…

Redis2-Redis常见命令

目录 Redis数据结构介绍 Redis通用命令 KEYS DEL EXISTS EXPIRE String类型 Key的层级格式 Hash类型 List类型 Set类型 SortedSet类型 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String数据库,value的类型多种多样 可以通过…

《Unity3D网络游戏实战》学习与实践--制作一款大乱斗游戏

角色类 基类Base Human是基础的角色类,它处理“操控角色”和“同步角色”的一些共有功能;CtrlHuman类代表“操控角色”​,它在BaseHuman类的基础上处理鼠标操控功能;SyncHuman类是“同步角色”类,它也继承自BaseHuman&…

解决电脑缺少.NET组件?手把手教你轻松解决

在日常使用电脑的过程中,很多用户可能会遇到“电脑缺少.NET组件”的提示,这可能导致某些应用程序无法正常运行或安装。那么,.NET组件到底是什么?为何它如此重要?本文将为您详细解答这些问题,并提供有效的解…

[ACM MM 2024] Wave-Mamba:超高清暗光图像增强的小波状态空间模型

Wave-Mamba: Wavelet State Space Model for Ultra-High-Definition Low-Light Image Enhancement (arxiv.org) Wave-Mamba是一种用于增强超高清低光照图像的新模型,它引入了低频状态空间块和高频增强块,并取得了领先水平的性能。该模型即将开源&#x…

用Python插入表格到PowerPoint演示文稿

有效的信息传达是演示文稿中的重点,而PowerPoint演示文稿作为最广泛使用的演示工具之一,提供了丰富的功能来帮助演讲者实现这一目标。其中,在演示文稿中插入表格可以帮助观众更直观地理解数据和比较信息。通过使用Python这样的强大编程语言&a…

【STL】 vector的底层实现

1.vector的模拟代码完整实现&#xff08;后面会拆分开一个一个细讲&#xff09; #pragma once #include<assert.h>// 抓重点namespace bit {/*template<class T>class vector{public:typedef T* iterator;private:T* _a;size_t _size;size_t _capacity;};*/templa…

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…

Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)

本系列文章介绍 在和社区小伙伴们交流的过程中&#xff0c;我们发现大家最关心的问题从来不是某个具体的功能如何使用&#xff0c;而是面对一个具体的实战场景时&#xff0c;如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

【生成式AI-二-强大的AI下我们可以做什么】

强大的AI下我们可以做什么 人工智能的厉害之处我们可以作什么评估模型好坏的难度prompt engineering微调fine tune 人工智能的厉害之处 人工智能并不是忽然就爆火的&#xff0c;事实上&#xff0c;很久以前就已经有深度学习、机器学习这些概念了&#xff0c;那现在的人工智能和…

Java之类和对象

目录 static关键字 1修饰属性 2修饰方法 final 构造方法 基本语法 this关键字 代码块 定义 普通代码块 构造代码块 静态代码块 匿名对象 toString 总结 static关键字 1修饰属性 Java的静态属性和类相关, 和具体的实例无关. 换句话说, 同一个类的不同实例共用同一个…

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…

crm客户管理系统有哪些?盘点大家使用最广泛的15款

将对比的客户管理CRM系统包括&#xff1a;纷享销客、Zoho CRM、销售易、用友CRM、Salesforce、Microsoft Dynamics 365、销帮帮CRM、HubSpot、Oracle CRM、悟空CRM、神州云动CRM、红圈CRM、SAP CRM、Odoo、OroCRM。 一个合适的CRM系统可以极大地提高你的销售效率和客户满意度&a…

SpringMVC执行流程

1 流程对比 1.1 原生servlet开发流程 根据需求编写servlet程序在web.xml 中通过配置&#xff0c;指定servlet所能处理的请求&#xff0c;即建立servlet与请求路径间的映射在Servlet的service方法中对路径进行再判断&#xff0c;从而进行具体的逻辑处理servlet参数从request中…

数据结构-递归

用递归代替循环 假设工作中的你&#xff0c;需要写一个倒数程序。该程序接收一个数字&#xff0c;例如10&#xff0c;然后显示从10到0的数字。现在先暂停一下&#xff0c;选择一门编程语言来实现这个程序&#xff0c;做完以后&#xff0c;再往下阅读。或许你用了JavaScript&am…

数学建模--二分法

目录 二分法的基本原理 应用实例 求解方程根 查找有序数组中的元素 注意事项 Python代码示例 ​编辑 延伸 二分法在数学建模中的具体应用案例有哪些&#xff1f; 如何选择二分法的初始区间以确保收敛速度和精度&#xff1f; 在使用二分法求解方程时&#xff0c;如何…

排序算法2:直接选择排序与快速排序

目录 1.直接选择排序 1.1直接选择排序的优化 2.快速排序 2.1基准值的置位&#xff08;Hoare版&#xff09; 2.2挖坑法 2.3lomuto前后指针 前言 前面我们进入了排序算的讲解。今天我们将继续学习几种重要的排序思想&#xff0c;好&#xff0c;咱们三连上车开始今天的内容。…

ChatTTS文本转语音本地部署结合内网穿透实现远程使用生成AI音频

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目&#xff0c;并且我们还可以结合Cpolar内网穿透工具创建公网地址&#xff0c;随时随…

动态规划.

目录 &#xff08;一&#xff09;递归到动规的一般转化方法 &#xff08;二&#xff09;动规解题的一般思路 1. 将原问题分解为子问题 2. 确定状态 3. 确定一些初始状态&#xff08;边界状态&#xff09;的值 4. 确定状态转移方程 &#xff08;三&#xff09;能用动规解…

【网络】HTTP协议

目录 概述 URL 结构 urlencode&#xff08;URL编码&#xff09; urldecode&#xff08;URL解码&#xff09; 工具网址 HTTP请求 请求行 请求头 请求体 HTTP响应 状态行 响应头 响应体 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 概述 HTTP协议是应用层协议…