STM32点亮LED灯与蜂鸣器发声

news2024/11/22 0:07:34

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/1512968.html

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

相关文章

EM算法详解

EM(Expectation-Maximum)算法也称期望最大化算法,曾入选“数据挖掘十大算法”中,可见EM算法在机器学习、数据挖掘中的影响力。EM算法是最常见的隐变量估计方法,在机器学习中有极为广泛的用途,例如常被用来学习高斯混合模型(Gaussian mixture model,简称GMM)的参数;隐…

3D产品配置器帮助您更快进入市场的 5 种方式

如果您的电子商务商店可以从产品配置器的使用中受益&#xff08;而且大多数都可以&#xff09;&#xff0c;您还应该知道&#xff0c;此功能还可以帮助您的公司采用更具创新性的产品开发姿态。 更简单地说&#xff1a;它可以帮助您更快地构建更好的产品。 继续阅读以了解3D 产…

FPGA Vivado环境下实现D触发器

题目要求&#xff1a;使用Verilog HDL语言设计一个D触发器。请提交程序源代码和Word格式的作业文档&#xff0c;作业文档中应给出程序源代码及RTL分析原理图。 D触发器的工作原理&#xff1a; 初始状态下&#xff0c;触发器处于复位状态&#xff0c;输出为复位信号的稳定状态…

springboot266基于Web的农产品直卖平台的设计与实现

农产品直卖平台的设计与实现 摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#x…

2024 前端javaScript+ES6

JavaScript 基础 1、基本数据类型&#xff1a; 1.1 基本数据类型&#xff1a; Number&#xff08;数值&#xff09;&#xff1a;表示数字&#xff0c;包括整数和浮点数。例如&#xff1a;5、3.14。 String&#xff08;字符串&#xff09;&#xff1a;表示文本数据&#xff…

Docker容器化技术(互联机制实现便捷互访)

容器的互联是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系&#xff0c;接收容器可以通过容器名快速访问到源容器&#xff0c;而不用指定具体的IP地址。 1.自定义容器命名 连接系统依据容器的名称来执行。因此&#xff0c;首先需要自定义一…

【数据挖掘】实验2:R入门2

实验2&#xff1a;R入门2 一&#xff1a;实验目的与要求 1&#xff1a;熟悉和掌握R数据类型。 2&#xff1a;熟悉和掌握R语言的数据读写。 二&#xff1a;实验内容 1&#xff1a;R数据类型 【基本赋值】 Eg.1代码&#xff1a; x <- 8 x Eg.2代码&#xff1a; a city …

谷歌破解 OpenAI 模型关键信息;微软更改默认浏览器,不再主推 Edge 丨 RTE 开发者日报 Vol.163

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

fate隐私求交案例

intersect组件是解决纵向联邦学习中的隐私求交问题 fate隐私求交的方式有三种&#xff1a;raw,rsa,dh。raw方式不安全&#xff0c;rsa和dh方式是安全的&#xff0c;dh是基于对称加密的安全交集 rsa是基于RSA(非对称加密)的安全交集&#xff0c;&#xff0c;dh方法也用于安全的…

Uni-app跟学笔记(一):新建项目、运行、tabbar、全局配置

文章目录 1&#xff09;新建项目2&#xff09;项目运行3&#xff09;项目结构4&#xff09;开发规范5&#xff09;globalStyle全局外观配置6&#xff09;pages页面配置7&#xff09;tabbar8&#xff09;Condition 本博客为 uni-app 此门课的跟学笔记&#xff0c;目的是便于个人…

如何在安卓端的SAP里配置打印机

1、转到 SPAD 事务&#xff08;“假脱机管理”屏幕&#xff09;。单击“设备/服务器”选项卡&#xff0c;输入输出设备的名称&#xff0c;然后点击显示按钮。 2、如果打印机已配置&#xff0c;它将显示设备属性、输出设备属性和纸盒信息的所有详细信息。如果输入新的打印机名称…

基于ssm的志愿者招募系统的设计与实现(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

Java学习笔记------常用API(二)

Object 无有参构造 public Object() 空参构造 成员方法&#xff1a; public String toString() 返回对象的字符串表示 public boolean equals(object obj) 比较两个对象是否相等 Object默认用号比较地址值&#xff0c;需要重写才能比较属性值 protected O…

基于java+springboot+vue实现的自习室管理和预约系统(文末源码+Lw)23-177

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装自习室管理和预约系统软件来发挥其高效地信息处理的作用&a…

vue脚手架创建项目失败,报错淘宝镜像地址证书过期问题解决

场景&#xff1a; 使用vue-cli脚手架创建vue新项目时&#xff0c;控制台报错&#xff0c;创建失败 控制台报错&#xff1a;ERROR Failed to get response from https://registry.npm.taobao.org/binary-mirror-config 尝试过的方式&#xff1a; 清除npm缓存或删除npm-cache文…

YashanDB亮相2024年中国石油石化信息通信技术交流大会

3月6日-8日&#xff0c;2024年中国石油石化信息通信技术交流大会在成都举办。YashanDB携智慧油气化数据管理解决方案亮相本次展会&#xff0c;展示最新的研发成果和场景应用。 当前&#xff0c;石油石化行业数字化转型不断深化&#xff0c;随之而来的是海量数据的计算与交互&a…

代码随想录算法训练营第day41|背包理论基础、416. 分割等和子集

目录 a.背包理论基础——01背包 1.二维数组的01背包表示 2.一维滚动数组表示 b. 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; a.背包理论基础——01背包 背包问题分类&#xff1a; 对于面试的话&#xff0c;其实掌握01背包&#xff0c;和完全背包&#xff…

Vulkan 围炉夜话

系列文章目录 OpenGL 围炉夜话 Vulkan 围炉夜话 文章目录 系列文章目录Vulkan参考书教程学习摘要VkImage 、VkBufferVkImage 相关VkBuffer 相关VkDeviceMemory 映射 理解代码流线渲染通道理解渲染通道创建渲染通道 VkFramebuffer 帧缓存流水线创建流水线缓冲对象&#xff08;PC…

ECC算法理论,基础椭圆+曲线的形状

目录 ECC算法理论基础 椭圆+曲线的形状 DH算法:Diffie-Hellman 简称ECC ECC算法理论基础</

C++训练营:引用传递

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 一、引用传递 简单来说&#xff0c;“引用”就是给已有的变量起一个别名。引用并没有自己单独的内存空间&#xff0c;作为引用&#xff0c;它和原变量共用一段内存空间。引用的定义格…