STM32 GPIO输出入门:LED闪烁、流水灯与蜂鸣器控制
创作时间:
作者:
@小白创作中心
STM32 GPIO输出入门:LED闪烁、流水灯与蜂鸣器控制
引用
CSDN
1.
https://m.blog.csdn.net/2403_88007973/article/details/145496056
本文将介绍如何使用STM32微控制器的GPIO(通用输入输出)端口控制LED闪烁、LED流水灯和蜂鸣器。通过本教程,读者可以掌握基本的GPIO输出控制方法。
LED闪烁
硬件电路
LED可以通过高电平驱动或低电平驱动。以下是两种驱动方式的电路图:
代码实现
下面是控制LED闪烁的代码实现:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA的时钟
// 使用各个外设前必须开启时钟,否则对外设的操作无效
/* GPIO初始化 */
GPIO_InitTypeDef GPIO_InitStructure; // 定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO模式,赋值为推挽输出模式,高低电平均有驱动能力
// GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;//开漏输出,只对低电平驱动
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // GPIO引脚,赋值为第0号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO速度,赋值为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 将赋值后的构体变量传递给GPIO_Init函数
// 函数内部会自动根据结构体的参数配置相应寄存器
// 实现GPIOA的初始化
/* 主循环,循环体内的代码会一直循环执行 */
while (1)
{
/* 设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法 */
/* 方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平 */
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 将PA0引脚设置为低电平
Delay_ms(500); // 延时500ms
GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将PA0引脚设置为高电平
Delay_ms(500); // 延时500ms
/* 方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定 */
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); // 将PA0引脚设置为低电平
Delay_ms(500); // 延时500ms
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); // 将PA0引脚设置为高电平
Delay_ms(500); // 延时500ms
/* 方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型 */
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); // 将PA0引脚设置为低电平
Delay_ms(500); // 延时500ms
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); // 将PA0引脚设置为高电平
Delay_ms(500); // 延时500ms
}
}
LED流水灯
接线图
代码实现
下面是控制LED流水灯的代码实现:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA的时钟
// 使用各个外设前必须开启时钟,否则对外设的操作无效
/* GPIO初始化 */
GPIO_InitTypeDef GPIO_InitStructure; // 定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // GPIO引脚,赋值为所有引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO速度,赋值为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 将赋值后的构体变量传递给GPIO_Init函数
// 函数内部会自动根据结构体的参数配置相应寄存器
// 实现GPIOA的初始化
/* 主循环,循环体内的代码会一直循环执行 */
while (1)
{
/* 使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯 */
GPIO_Write(GPIOA, ~0x0001); // 0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
Delay_ms(100); // 延时100ms
GPIO_Write(GPIOA, ~0x0002); // 0000 0000 0000 0010,PA1引脚为低电平,其他引脚均为高电平
Delay_ms(100); // 延时100ms
GPIO_Write(GPIOA, ~0x0004); // 0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平
Delay_ms(100); // 延时100ms
GPIO_Write(GPIOA, ~0x0008); // 0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平
Delay_ms(100); // 延时100ms
GPIO_Write(GPIOA, ~0x0010); // 0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平
Delay_ms(100); // 延时100ms
GPIO_Write(GPIOA, ~0x0020); // 0000 0000 0010 0000,PA5引脚为低电平,其他引脚均为高电平
Delay_ms(100); // 延时100ms
GPIO_Write(GPIOA, ~0x0040); // 0000 0000 0100 0000,PA6引脚为低电平,其他引脚均为高电平
Delay_ms(100); // 延时100ms
GPIO_Write(GPIOA, ~0x0080); // 0000 0000 1000 0000,PA7引脚为低电平,其他引脚均为高电平
Delay_ms(100); // 延时100ms
}
}
蜂鸣器控制
接线图
蜂鸣器的接线图与LED类似,可以通过控制GPIO引脚的高低电平来控制蜂鸣器的鸣叫和停止。
代码实现
下面是控制蜂鸣器的代码实现:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟
// 使用各个外设前必须开启时钟,否则对外设的操作无效
/* GPIO初始化 */
GPIO_InitTypeDef GPIO_InitStructure; // 定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // GPIO引脚,赋值为第12号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO速度,赋值为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 将赋值后的构体变量传递给GPIO_Init函数
// 函数内部会自动根据结构体的参数配置相应寄存器
// 实现GPIOB的初始化
/* 主循环,循环体内的代码会一直循环执行 */
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // 将PB12引脚设置为低电平,蜂鸣器鸣叫
Delay_ms(100); // 延时100ms
GPIO_SetBits(GPIOB, GPIO_Pin_12); // 将PB12引脚设置为高电平,蜂鸣器停止
Delay_ms(100); // 延时100ms
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // 将PB12引脚设置为低电平,蜂鸣器鸣叫
Delay_ms(100); // 延时100ms
GPIO_SetBits(GPIOB, GPIO_Pin_12); // 将PB12引脚设置为高电平,蜂鸣器停止
Delay_ms(700); // 延时700ms
}
}
通过以上三个实例,读者可以掌握STM32微控制器的基本GPIO输出控制方法。这些基础技能对于后续学习更复杂的嵌入式系统开发非常有帮助。
热门推荐
北京动物园秘史:见证近代中国百年沉浮
你没见过的,一百多年前的北京动物园
苏州简介:探秘古典园林与历史文化
武汉汉口四大赏樱胜地:堤角、解放、宝岛公园和江滩公园
房贷提前结清不需要还完全部利息,只需偿还剩余本金
曾是上海第一家连锁超市!电商冲击下却连连亏损,最新宣布:领导调整
武汉大学人民医院多学科协作救治精神障碍合并严重躯体疾病患者
李白诗歌中的夸张手法:从《蜀道难》到《望庐山瀑布》
五行缺木是什么命
紫禁城:中国古代宫殿建筑的集大成者
文化中国行·时光里的古村落⑧丨勾蓝瑶寨:湘桂分疆 瑶乡蕴藏
建设“五好”乡村,共创古村和美未来
颅骨修复手术所有费用大概多少钱
查出了桥本甲状腺炎,怎么办?如何治疗?
身体出现6个症状,小心胆结石!就是筛查,3个治疗方法
哈希函数及其应用
保险公司定损的标准流程是怎样的?定损过程中应注意哪些细节?
手机NFC的使用方法大揭秘!轻松玩转,让生活更便捷!
除了「不许爆粗口」,新赛季F1还有哪些新规则?
考研各阶段各科复习的方法以及复习建议
尼日尔事件敲响警钟:中国企业海外投资需构建多重防护网
中文域名转换成实际域名的规律是什么
列兵直接晋升为二级上士 这其中有着怎样的故事
买羊脂玉是真的吗安全吗,需要注意什么?
洗碗粉检测:从清洁效能到化学安全的全面解析
石雕九龙壁的艺术价值
草莓的成熟季节与月份解析
2025年草莓采摘全攻略:时间、地点、品种一文详解
掌握平板绘画技巧,享受创作乐趣与灵感的旅程
深入理解QEMU-KVM CPU亲和性设置:如何提升性能至极点