3.2 LED闪烁流水灯蜂鸣器

news/2025/1/16 1:36:39/
  1. LED闪烁

1.1 电路连接示意图

LED采用低电平点亮的方式,利用ST-Link的3.3V进行供电。

1.2程序设计

1.21知识储备

GPIO配置步骤步骤:

1. 第⼀步,使⽤RCC开启GPIO的时钟

2. 第⼆步,使⽤GPIO_Init()函数初始化GPIO

3. 第三步,使⽤输出或者输⼊的函数控制GPIO口

常⽤的RCC库函数

开启时钟

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph,FunctionalStateNewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalStateNewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph,FunctionalStateNewState);

其中包含两个参数:参数1:选择外设,参数2:使能或者失能

常用的GPIO库函数

  • 复位GPIO外设函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx);

调用函数,所指定的GPIO外设就会被复位。

  • 复位AFIO外设函数

void GPIO_AFIODeInit(void);
  • 初始化GPIO⼜函数

⽤结构体的参数来初始化GPIO口,先定义⼀个结构体变量,然后把再给结构体赋值,最后调⽤此函数,函数内部会⾃动读取结构体的值,然后⾃动把外设的各个参数配置好。

void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypedef*GPIO_InitStruct);
  • 为GPIO结构体变量赋一个默认值

void GPIO_StructInit(GPIO_InitTypedef* GPIO_InitTypedef);
  • GPIO的4个输入函数

读取输⼊数据寄存器某端口的输⼊值,返回值是⾼低电平函数

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取GPIO的每⼀位,返回值是16位的数据,每⼀位代表⼀个端⼜值

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

读取输出数据寄存器的某⼀位

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取整个输出寄存器

uint16_t GPIO_ReadOutputData(GPIO_InitTypedef* GPIOx);
  • GPIO的4个输出函数

把指定的端口设置为⾼电平

void GPIO_SetBits(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);

把指定的端口设置为低电平

void GPIO_ResetBits(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);

根据第三个参数的值来设置电平

void GPIO_WriteBit(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin,BitAction BitVal);

对GPIOx的16个端口同时进⾏写⼊操作:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

1.22 小灯闪烁

约定低电平点亮,高电平熄灭

配置好GPIO后,再循环内点亮LED延时一段时间,再熄灭LED

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//两个参数1.点亮PA0口 2.开启时钟GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体(局部变量)//结构体成员GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//使用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选择GPIO外设的0号引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置输出速度GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO初始化结构体的地址while (1){GPIO_ResetBits(GPIOA, GPIO_Pin_0);//把指定的端口设置为低电平,点亮LEDDelay_ms(500);//延时GPIO_SetBits(GPIOA, GPIO_Pin_0); //把指定的端口设置为高电平,熄灭LEDDelay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//Bit_RESET置低电平Delay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);// Bit_SET置高电平Delay_ms(500);//若给具体的数,1是高电平,0是低电平需要加上强制类型转换,将0和1转换为枚举类型GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);Delay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);Delay_ms(500);}
}

注意:在推挽输出模式下,⾼低电平都具有驱动能⼒,开漏输出模式的高电平是没有驱动能⼒的,开漏输出模式的低电平具有驱动能力。

2. LED流水灯

2.1 电路连接示意图

2.2 程序设计

16个端口依次点亮熄灭,延时100ms

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//两个参数1.点亮PA0口 2.开启时钟GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体(局部变量)//结构体成员GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//使用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择GPIO外设的16个端口GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置输出速度GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO初始化结构体的地址while (1){//0x0001就是指向GPIO_Pin_XXX ,加上按位取反 那么则可以低电平点亮GPIO_Write(GPIOA, ~0x0001);    //0000 0000 0000 0001Delay_ms(100);GPIO_Write(GPIOA, ~0x0002);    //0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA, ~0x0004);    //0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA, ~0x0008);    //0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA, ~0x0010);    //0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0020);    //0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0040);    //0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0080);    //0000 0000 1000 0000Delay_ms(100);//GPIO_Write(GPIOA,~0x0001<<i);//Delay_ms(100);}
}

3. 蜂鸣器

3.1 电路连接示意图

3.2 程序设计

使用PB12号端口,给PB12输出低电平,蜂鸣器响,输出高电平,蜂鸣器不响。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启时钟GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体(局部变量)//结构体成员GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//使用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//选择GPIO外设的16个端口GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置输出速度GPIO_Init(GPIOB, &GPIO_InitStructure);//GPIO初始化结构体的地址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);}
}

http://www.ppmy.cn/news/890350.html

相关文章

简述机器学习和深度学习的区别

&#x1f64c;秋名山码民的主页 &#x1f602;一个打过一年半的oier&#xff0c;写过一年多的Java&#xff0c;现在致力于学习iot应用的普通本科生 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f64f;作者水平有限&#xff0c;如发现…

[MySQL]MySQL表中数据的增删查改(CRUD)

[MySQL]MySQL表中数据的增删查改(CRUD) 文章目录 [MySQL]MySQL表中数据的增删查改(CRUD)1. 新增数据1.1 单列插入1.2 多列插入1.3 插入否则更新1.4 替换 2. 基本查询数据2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 为查询结果指定别名2.5 结果去重2.6 where子句2.7 or…

eclipse卡死问题优化

https://blog.csdn.net/dengjili/article/details/78562140

eclipse右键之后卡死

在打开eclipse之后&#xff0c;右键项目直接卡死 加载的项目过多&#xff0c;没有初始化完成就去右键项目导致卡死 解决方法 ①&#xff1a;等待初始化完成在右键项目&#xff1b; ②&#xff1a;删除workspace下面的.metadata目录&#xff0c;重启eclipse

win10 Microsoft Edge浏览器崩溃, Microsoft Edge 提示 网页无限次打开,直至电脑卡死

win10 edge 浏览器一直弹出 Microsoft Edge 提示 网页&#xff0c;无限次的打开。求大神帮帮忙

eclipse按Ctrl键卡死的问题。已解决!

我在eclipse中编辑3万行左右的代码时&#xff0c;在用ctrlc/v复制时eclipse经常会卡住较长的时间。 后来发现只要按下ctrl键就会卡&#xff0c;我猜测应该是因为eclipse中按住ctrl后可以用鼠标单击跳转到变量定义的地方&#xff0c;所以当按下ctrl键时eclipse会去生成这个映射…

IDEA卡死解决

找到IDEA的安装目录bin&#xff0c;修改这个文件 修改为&#xff1a; -Xms128m -Xmx1024m -XX:MaxPermSize250m -XX:ReservedCodeCacheSize150m

ie降级,解决ie卡死,打不开,弹出页空白等问题

刚刚碰到了ie的这个问题&#xff0c;找了百度&#xff0c;找了电脑管家修复&#xff0c;都未能解决此问题。无奈我想到去卸载ie。 结果卸载后重启&#xff0c;ie就没了&#xff0c;勾选上后就会又安装了原来的不能用的ie。并且在勾选和反勾选中还会出现一些部分未安装的问题。 …