STM32点亮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灯

cpp 复制代码
#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灯的亮灭

cpp 复制代码
#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进制的方式控制单片机进行工作。

cpp 复制代码
#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根公对母的杜邦线完成蜂鸣器的接线工作

bash 复制代码
#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系统班中完成蜂鸣器发声功能。

库函数使用方式

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

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

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

相关推荐
好家伙VCC1 小时前
STM32与51单片机的区别:是否应该直接学习STM32?
stm32·学习·51单片机
szpc16211 小时前
28V_1MHZ电子烟,无线鼠标,医疗器械等专用恒频升压转换器超小体积封装
单片机·嵌入式硬件·计算机外设
luckyluckypolar3 小时前
STM32——SPI
stm32·单片机·嵌入式硬件·物联网
极客小张4 小时前
基于STM32MP157与OpenCV的嵌入式Linux人脸识别系统开发设计流程
linux·stm32·单片机·opencv·物联网
OH五星上将5 小时前
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
linux·嵌入式硬件·harmonyos·openharmony·鸿蒙开发·liteos-a·鸿蒙内核
浅陌pa5 小时前
24:RTC实时时钟
c语言·stm32·单片机·嵌入式硬件
敲上瘾5 小时前
多态的使用和原理(c++详解)
开发语言·数据结构·c++·单片机·aigc·多态·模拟
小熊在忙fpga6 小时前
STM32如何修改外部晶振频率和主频
stm32·单片机·嵌入式硬件
我命由我123456 小时前
GPIO 理解(基本功能、模拟案例)
linux·运维·服务器·c语言·c++·嵌入式硬件·c#
学习日记hhh7 小时前
STM32G431RBT6(蓝桥杯)串口(发送)
stm32·单片机·嵌入式硬件