STM32_3-1点亮LED灯与蜂鸣器发声

news2025/2/27 1:20:14

STM32之GPIO

GPIO在输出模式时可以控制端口输出高低电平,用以驱动Led蜂鸣器等外设,以及模拟通信协议输出时序等。

输入模式时可以读取端口的高低电平或电压,用于读取按键输入,外接模块电平信号输入,ADC电压采集灯

GPIO的位模式图如下所示:

这个模式图接了一个上拉电阻和一个下拉电阻,上拉表示的是高电平的输入模式,下拉表示的是低电平的输入模式。

施密特触发器 的功能作用以及原理

施密特触发器对输入的电压进行整型,如果输入的电压大于某一个阈值,输出会瞬间升为高电平,如果输入电压小于某一个阈值,输出就会小于某一个阈值

输入数据寄存器存储施密特触发器整形的波形进入输入寄存器,读取输入寄存器得到输入的电平,

 相关外设介绍:led外设以及蜂鸣器外设

面包板介绍:

接线:连接STM32和最小系统班,接线图

此处:默认led项目创建完成

GPIO所包含的库函数如下所示


            调用GPIO_DeInit这个函数后指定的gpio外设会被复位,这是这个函数用途
            void GPIO_DeInit(GPIO_TypeDef* GPIOx);
            复位AFIO外设
            void GPIO_AFIODeInit(void);
            用结构体的参数初始化gpio口
            void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
            把结构体变量赋一个默认的值
            void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
            uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
            uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
             以上是GPIO的读取函数
            void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
            void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
            以上是GPIO的写入函数
            void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
            void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t   GPIO_PinSource);
            void GPIO_EventOutputCmd(FunctionalState NewState);
            void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
            void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

typedef enum
{ GPIO_Mode_AIN = 0x0,   // 模拟输入
  GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
  GPIO_Mode_IPD = 0x28,// 下拉输入
  GPIO_Mode_IPU = 0x48, //上拉输入
  GPIO_Mode_Out_OD = 0x14, // 开漏输出
  GPIO_Mode_Out_PP = 0x10, // 推挽输出
  GPIO_Mode_AF_OD = 0x1C, // 复用开漏
  GPIO_Mode_AF_PP = 0x18  // 复用推挽
}GPIOMode_TypeDef;

点亮led灯使用的是推挽输出

使用GPIO ResetBits来点亮LED灯

#include "stm32f10x.h"                  // Device header
    	 // 操作GPIO 1: 使用rcc开启gpio时钟
		   // 使用GPIO_Init函数初始化GPIO
			 // 使用输入或输出函数控制GPIO口
int main(void){
	  // 开启时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	  // GPIO的结构体
	  GPIO_InitTypeDef GPIO_InitStructure;
	  // 选择输出模式为推挽输出
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	  // 选择输出的引脚
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	  // 输出速度
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	  // GPIO初始化结构体的地址放到GPIO——Init的第二个参数
	  GPIO_Init(GPIOA,&GPIO_InitStructure);
	  // GPIO设置A0口的灯亮
	  GPIO_ResetBits(GPIOA,GPIO_Pin_0);
      // 设置LED灯熄灭
       GPIO_SetBits(GPIOA,GPIO_Pin_0);
      
    while(1){

		}

}

查看函数的定义了解函数的功能以及如何使用函数

#include "stm32f10x.h"                  // Device header
         // 操作GPIO 1: 使用rcc开启gpio时钟
           // 使用GPIO_Init函数初始化GPIO
             // 使用输入或输出函数控制GPIO口
int main(void){
      // 开启时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
      // GPIO的结构体
      GPIO_InitTypeDef GPIO_InitStructure;
      // 选择输出模式为推挽输出
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      // 选择输出的引脚
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
      // 输出速度
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      // GPIO初始化结构体的地址放到GPIO——Init的第二个参数
      GPIO_Init(GPIOA,&GPIO_InitStructure);
      // GPIO设置A0口的灯亮,最后一个参数Bit_RESET表示的是清除端口的值为0,清除端口的值为1
      GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// Bit_RESET时LED灯是点亮状态,当为Bit_SET时LED灯是熄灭状态
    while(1){

        }

}

STM32实现LED灯的亮灭

#include "stm32f10x.h"    // Device header
#include "Delay.h"
    	 // 操作GPIO 1: 使用rcc开启gpio时钟
		   // 使用GPIO_Init函数初始化GPIO
			 // 使用输入或输出函数控制GPIO口
int main(void){
	  // 开启时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	  // GPIO的结构体
	  GPIO_InitTypeDef GPIO_InitStructure;
	  // 选择输出模式为推挽输出
      // 选择输出模式为推挽输出PP表示的是推挽输出模式,OD表示开漏输出模式
	  // 推挽输出高电平和低电平均有输出能力,开漏输出自由在低电平的情况下才有驱动能力
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	  // 选择输出的引脚
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	  // 输出速度
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	  // GPIO初始化结构体的地址放到GPIO——Init的第二个参数
	  GPIO_Init(GPIOA,&GPIO_InitStructure);
	  // GPIO设置A0口的灯亮,最后一个参数Bit_RESET表示的是清除端口的值为0,清除端口的值为1
	  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// Bit_RESET时LED灯是点亮状态,当为Bit_SET时LED灯是熄灭状态
    while(1){
        // 实现led灯光闪烁的功能需要在主循环中写上点亮led灯熄灭led灯光的操作并在while中循环
			  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
			  Delay_ms(500);
			  // 添加延时函数进行延时
			  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
			  Delay_ms(500);
          /*   使用GPIO点亮led灯
               GPIO_ResetBits(GPIOA,GPIO_Pin_0);
			  Delay_ms(500);
			  GPIO_SetBits(GPIOA,GPIO_Pin_0);
			  Delay_ms(500);
          */
		}

}

延时函数从文件中引入

使用STM32实现LED流水灯

1:接线

2:编写流水灯功能代码,在单片机中是无法使用二进制直接进行控制的因此我们需要使用16进制的方式控制单片机进行工作。

#include "stm32f10x.h"    // Device header
#include "Delay.h"
 /*
		 1: 操作GPIO 1: 使用rcc开启gpio时钟
		 2: 使用GPIO_Init函数初始化GPIO
		 3: 使用输入或输出函数控制GPIO口
 */   	 
int main(void){
	  // 开启GPIOA时钟,该程序连接的是GPIOA的端口
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	  // GPIO的结构体
	  GPIO_InitTypeDef GPIO_InitStructure;
	  // 选择输出模式为推挽输出PP表示的是推挽输出模式,OD表示开漏输出模式
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	// 选择输出的引脚,GPIO_Pin_All将16个端口都设置为推挽输出模式
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	  // 输出速度
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	  // GPIO初始化结构体的地址放到GPIO——Init的第二个参数
	  GPIO_Init(GPIOA,&GPIO_InitStructure); 
    while(1){
			 //控制A号引脚
			GPIO_Write(GPIOA,~0x0001); // 0000 0000 0000 0001 二进制转换为16进制的写法
		  Delay_ms(500);
			GPIO_Write(GPIOA,~0x0002); // 0000 0000 0000 0010 二进制转换为16进制的写法
		  Delay_ms(500);
			GPIO_Write(GPIOA,~0x0004); // 0000 0000 0000 0100 二进制转换为16进制的写法
		  Delay_ms(500);
			GPIO_Write(GPIOA,~0x0008); // 0000 0000 0000 1000 二进制转换为16进制的写法
		  Delay_ms(500);
			GPIO_Write(GPIOA,~0x0010); // 0000 0000 0001 0000 二进制转换为16进制的写法
		  Delay_ms(500);
			GPIO_Write(GPIOA,~0x0020); // 0000 0000 0010 0000 二进制转换为16进制的写法
		  Delay_ms(500);
			GPIO_Write(GPIOA,~0x0040); // 0000 0000 0100 0000 二进制转换为16进制的写法
		  Delay_ms(500);
			GPIO_Write(GPIOA,~0x0080); // 0000 0000 1000 0000 二进制转换为16进制的写法
		  Delay_ms(500);
		}

}

实现蜂鸣器功能:

蜂鸣器接线,使用最小系统班3根公对母的杜邦线完成蜂鸣器的接线工作

#include "stm32f10x.h"    // Device header
#include "Delay.h"
 /*
		 1: 操作GPIO 1: 使用rcc开启gpio时钟
		 2: 使用GPIO_Init函数初始化GPIO
		 3: 使用输入或输出函数控制GPIO口
 */   	 
int main(void){
	  // 开启GPIOA时钟,该程序连接的是GPIOA的端口
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	  // GPIO的结构体
	  GPIO_InitTypeDef GPIO_InitStructure;
	  // 选择输出模式为推挽输出PP表示的是推挽输出模式,OD表示开漏输出模式
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	// 选择输出的引脚,GPIO_Pin_All将16个端口都设置为推挽输出模式
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	  // 输出速度
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	  // GPIO初始化结构体的地址放到GPIO——Init的第二个参数
	  GPIO_Init(GPIOB,&GPIO_InitStructure); 
    while(1){
			GPIO_ResetBits(GPIOB,GPIO_Pin_12);
			Delay_ms(100);
			GPIO_SetBits(GPIOB,GPIO_Pin_12);
			Delay_ms(100);
			GPIO_ResetBits(GPIOB,GPIO_Pin_12);
			Delay_ms(100);
			GPIO_SetBits(GPIOB,GPIO_Pin_12);
			Delay_ms(700);
		}

}

将程序运行并下载进STM32系统班中完成蜂鸣器发声功能。

库函数使用方式

第一种方式,打开头文件,拉到最下面,查看有哪些函数,然后查看函数的定义函数的使用方法,<建议使用这种方式>

第二种方式,查看库函数用户手册,所有函数的介绍个使用方法

第三种方式,最后一种方式是百度,借助别人的代码进行使用

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

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

相关文章

【C语言】linux内核ip_generic_getfrag函数

一、讲解 这个函数ip_generic_getfrag是传输层用于处理分段和校验和的一个辅助函数&#xff0c;它通常用在IP层当需要从用户空间拷贝数据构建成网络数据包时。这个函数的实现提供了拷贝数据和进行校验和计算&#xff08;如果需要的话&#xff09;的功能。函数的参数解释如下&a…

JVM知识整体学习

前言&#xff1a;本篇没有任何建设性的想法&#xff0c;只是我很早之前在学JVM时记录的笔记&#xff0c;只是想从个人网站迁移过来。文章其实就是对《深入理解JVM虚拟机》的提炼&#xff0c;纯基础知识&#xff0c;网上一搜一大堆。 一、知识点脑图 本文只谈论HotSpots虚拟机。…

利用华为CodeArts持续交付项目演示流程

软件开发生产线&#xff08;CodeArts&#xff09;是面向开发者提供的一站式云端平台&#xff0c;即开即用&#xff0c;随时随地在云端交付软件全生命周期&#xff0c;覆盖需求下发、代码提交、代码检查、代码编译、验证、部署、发布&#xff0c;打通软件交付的完整路径&#xf…

前端实现跨域的六种解决方法

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

高吞吐SFTP连接池设计方案

背景 在现代的数据驱动环境中&#xff0c;安全文件传输协议&#xff08;SFTP&#xff09;扮演着至关重要的角色&#xff0c;它提供了一种安全、可靠的文件传输方式。我们目前项目是一个大型数据集成平台&#xff0c;跟上下游有很多文件对接是通过SFTP协议&#xff0c;当需要处…

Speech Processing (LASC11158)

大纲 PHON – phonetics and phonology 1. Phonetics and Representations of Speech2. Acoustics of Consonants and VowelsSIGNALS – signal processing, with a focus on speech signals 3. Digital Speech Signals4. the Source-Filter ModelTTS – text-to-speech synth…

基本计算器II

文章目录 题目解析算法解析算法模拟第一步 第二步第三步第四步第五步第六步最后一步 代码 题目解析 题目链接 我们先来看一下题目这个题目的意思很明确就是给你一个算数式让你计算结果并返回并且给了很多辅助条件来帮助你。 算法解析 那么我们来看看这个题目有哪些做法&…

基于机器学习的工业用电量预测完整代码数据

视频讲解: 毕业设计:算法+系统基于机器学习的工业用电量预测完整代码数据_哔哩哔哩_bilibili 界面展示: 结果分析与展示: 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing…

【LGR-176-Div.2】[yLCPC2024] 洛谷 3 月月赛 I(A~C and G<oeis>)

[yLCPC2024] A. dx 分计算 前缀和提前处理一下区间和&#xff0c;做到O&#xff08;1&#xff09;访问就可以过。 #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);…

【数学】【组合数学】1830. 使字符串有序的最少操作次数

作者推荐 视频算法专题 本博文涉及知识点 数学 组合数学 LeetCode1830. 使字符串有序的最少操作次数 给你一个字符串 s &#xff08;下标从 0 开始&#xff09;。你需要对 s 执行以下操作直到它变为一个有序字符串&#xff1a; 找到 最大下标 i &#xff0c;使得 1 < i…

深入理解 Webpack 热更新原理:提升开发效率的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于php的用户登录实现(v2版)(持续迭代)

目录 版本说明 数据库连接 登录页面&#xff1a;login.html 登录处理实现&#xff1a;login.php 用户欢迎页面&#xff1a;welcome.php 密码修改页面&#xff1a;change_password.html 修改执行&#xff1a;change_password.php 用户注册页面&#xff1a;register.html …

报错Importing ArkTS files to JS and TS files is not allowed. <etsLint>

ts文件并不支持导入ets文件&#xff0c;为了方便开发应用卡片&#xff0c;entryformAbility创建的时候默认是ts文件&#xff0c;这里只需要把ts文件改成ets便可以轻松的导入所需要的ets即可 我创建了一个鸿蒙开发的交流群&#xff0c;喜欢的鸿蒙朋友可以扫码或者写群号&#xf…

指针详解(从基础到入门)

一、什么是指针 在计算机科学中&#xff0c;指针是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它直接指向存在电脑储存器中另一个地方的值。由于通过地址能找到所需的变量单元&#xff0c;可以说&#xff0c;指针指向该变量单元。因此&#xff0c;将地址形象化地称…

如何使用Hexo搭建个人博客

文章目录 如何使用Hexo搭建个人博客环境搭建连接 Github创建 Github Pages 仓库本地安装 Hexo 博客程序安装 HexoHexo 初始化和本地预览 部署 Hexo 到 GitHub Pages开始使用发布文章网站设置更换主题常用命令 插件安装解决成功上传github但是web不更新不想上传文章处理方式链接…

python处理geojson为本地shp文件

一.成果展示 二.环境 我是在Anaconda下的jupyter notebook完成代码的编写&#xff0c;下面是我对应的版本号&#xff0c;我建议大家在这个环境下编写&#xff0c;因为在下载gdal等包的时候会更方便。 二.参考网站 osgeo.osr module — GDAL documentation osgeo.ogr module …

Codesys的Memory存储区数据定义

以上为例&#xff1a; 假定&#xff0c;数据整个大小为131072个字节 即存在 MB0-MB131071个地址 MW0-65534个地址 MD0-32766个地址 每一个MD2个MW4个MB 即MD0MW0-MW1MB0-MB1-MB2-MB3。 即MD75MW150-MW151MB300-MB301-MB302-MB303。 对以上地址赋值时&#xff0c;会同时…

SQL中常见的DDL操作及示例,数据库操作及表操作

目录 一、数据库操作 1、创建数据库 2、查看所有数据库 3、使用数据库 4、删除数据库 二、表操作&#xff1a; 1、创建表 2、查看表结构 3、修改表结构 3.1 添加列 3.2 修改列数据类型 3.3 修改列名 3.4 删除列 3.5 修改表名 3.6 删除表 注意&#xff1a; 在数…

2.15SRAM,DRAM,ROM,主存与CPU连接

MDR取出数据&#xff0c;然后通过数据总线传递给CPU&#xff0c; 地址总线传递信号给到MAR 就是说片选线是用来选择操作哪个芯片 8*8位 第一个代表存储单元的数量&#xff0c;第二个代表存储字长 有几个存储单元&#xff0c;就对应多少位地址以及多少的地址线 存储字长决定数…

【兔子机器人】修改GO电机id(软件方法、硬件方法)

一、硬件方法 利用上位机直接修改GO电机的id号&#xff1a; 打开调试助手&#xff0c;点击“调试”&#xff0c;查询电机&#xff0c;修改id号&#xff0c;即可。 但先将四个GO电机连接线拔掉&#xff0c;不然会将连接的电机一并修改。 利用24V电源给GO电机供电。 二、软件方…