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

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,清除端口的值为1GPIO_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函数初始化GPIO3: 使用输入或输出函数控制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函数初始化GPIO3: 使用输入或输出函数控制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.hqwc.cn/news/526394.html

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

相关文章

【考研数学】打基础,张宇《30讲》还是武忠祥《基础篇》?

张宇的30讲还是不太适合零基础的考研党去听...因为宇哥整体节奏较快&#xff0c;如果目标分较高&#xff0c;有一定的基础还是建议的 身边真的很多130-140的大佬都是跟着张宇从头到尾&#xff0c;张宇老师的习题册非常适合基础扎实&#xff0c;想冲刺高分的考研党 我是属于基…

docker-swarm集群搭建

目录 一、docker swarm介绍 二、部署docker 三、搭建集群 3.1 工作模式 3.2 将当前主机作为leader 3.3 将第二个节点slave1加入到worker 3.4 将第三个节点slave2也加入到worker 3.5 将第四个节点(slave3)加入到manager 四、总结 一、docker swarm介绍 Docker Swarm…

【OpenCV】如何在Linux操作系统下正确安装 OpenCV

前言 我是在虚拟机上跑的 Linux 5.8.0-44-generic。 配置如下&#xff1a; 目录 第一步&#xff1a;下载依赖文件 第二步&#xff1a;下载 opencv 和 opencv_contrib 源码 第三步&#xff1a;解压缩包 第四步&#xff1a;移动文件 第五步&#xff1a;生成 makefile 文件 …

Linux高级IO之poll

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、poll函数接口 1.接口 2.poll做了什么工…

C++程序设计-第六/七/八章 运算符重载/包含与继承/虚函数和多态性【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函…

《探索虚拟与现实的边界:VR与AR谁更能引领未来?》

引言 在当今数字时代,虚拟现实(VR)和增强现实(AR)技术正以惊人的速度发展,并逐渐渗透到我们的日常生活中。它们正在重新定义人与技术、人与环境之间的关系,同时也为各行各业带来了全新的可能性。然而,究竟是VR还是AR更有潜力改变未来?本文将围绕这一问题展开深入探讨。…

Canal安装使用

一 Canal介绍 canal是阿里巴巴旗下的一款开源项目&#xff0c;纯Java开发。基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费&#xff0c;目前主要支持了MySQL&#xff08;也支持mariaDB&#xff09;。 背景 早期&#xff0c;阿里巴巴B2B公司因为存在杭州和美国…

少儿编程 蓝桥杯青少组科技素养题 信息素养真题及解析第25套

少儿编程 科技素养 信息素养真题第25套 1、旅行结束之后&#xff0c;回到家的小蓝决定将照片备份在云端的网盘上。备份照片主要占用的是小蓝家的( )带宽 A、下行 B、上行 C、文件 D、数据 答案&#xff1a;B 考点分析&#xff1a;主要考查网络相关知识&#xff0c;要将照…

公众号IP白名单已添加服务器IP 122.88... 依然给出 40164 错误

公众号的IP白名单已添加 122.88... 依然给出 40164 错误。 {"errcode":40164,"errmsg":"invalid ip 122.88... ipv6 ::ffff:122.88..., not in whitelist rid: 65e85a07-458dfc0d-16003e03"} 解决方案&#xff1a; 一、检查 AppID 是否正确&…

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

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

Javaweb之Maven高级之继承的详细解析

2.1 继承 我们可以再创建一个父工程 tlias-parent &#xff0c;然后让上述的三个模块 tlias-pojo、tlias-utils、tlias-web-management 都来继承这个父工程 。 然后再将各个模块中都共有的依赖&#xff0c;都提取到父工程 tlias-parent中进行配置&#xff0c;只要子工程继承了…

C++单例模式、工厂模式

一、单例模式 (一) 什么是单例模式 1. 是什么&#xff1f; 在系统的整个生命周期内&#xff0c;一个类只允许存在一个实例。 2. 为什么&#xff1f; 两个原因&#xff1a; 节省资源。方便控制&#xff0c;在操作公共资源的场景时&#xff0c;避免了多个对象引起的复杂操作…