STM32实现LED闪烁、流水灯与蜂鸣器功能详解教程
2025-10-17 来源:cnblogs
一、LED闪烁
1.新建文件夹
选择一个地方新建文件夹—3-1 LED灯闪烁
点开keil软件,点击Project–New ,新建工程

选择STM32F103C8,点ok

在刚才创建的文件夹LED灯闪烁里面,新建Start、Library、User 3个文件夹
2.配置文件
将固件库中arm下的文件和STM32F10x文件下的后3个文件,还有core文件复制到start文件夹下



start文件完成

同上步骤,将inc、和src的文件都复制到Library(这里只是一部分)

Project的Template中这些复制到User文件夹中

3.添加工程组合文件
点击有三个箱子的标志(工程文件管理),默认的组×掉,再新建Start、Library、User
选Start,点击右边的添加文件

文件类型选所有文件

添加后缀md的启动文件,还有.c和.h文件


在Library点击右边的添加文件,文件类型选所有文件,全选

在User点击右边的添加文件,文件类型选所有文件,全选

最后点击OK,工程里的组合文件都添加成功
4.工程选项配置
点击魔术棒,选择C/C++,在include paths中把自己建的文件夹路径都添加进去

点击添加按钮,3个文件都添加进来,点击OK

在define中添加USE使用、STD标准、PERIPH外设、DRIVER驱动这个字符串

点击Debug,在Use中选择ST-Link Debugger,然后点击Settings

点击Flash Driverload,勾上复位并执行

点击确定,工程选项配置完成
5.工程编译
在User中把main.c原本的代码删除,右键添加头文件

写上主函数(最后一行一定要空行)

点击编译按钮,不报错,整个工程编译完成

如果报错,可以这样解决

6.操作STM32的GPIO总共3步
使用RCC开启GPIO时钟
使用GPIO_Init函数初始化GPIO
使用输入或输出的函数控制GPIO口
跳转定义点这个

7. 正式开始,GPIO初始化
点开Library的rcc.h文件,调用RCC里的外设时钟控制函数(GPIO属于APB2外设)

复制到main.c,然后右键跳转到定义

要点亮PA0口的LED,选择RCC_APB2Periph_GPIOA放到第一个参数

第二个参数选择ENABLE,此时时钟开启

调用GPIO_Init函数,复制后同样跳转函数

第一个参数选GPIOA,第二个参数是结构体,粘贴在GPIO_Init上面,起名字为GPIO_InitStructure(变量名随便起,自己看懂就行)

复制结构体名字,用“.”引出结构体成员(没有引出试一下保存退出软件,再进入)

选择GPIO_Mode同样右键跳转定义,选择CTRL+F搜索,复制GPIO_Mode_Out_PP(推挽输出)



选择GPIO_Pin,右键跳转定义,GPIO_Pin有多定义,选择member,双击,然后同上操作CTRL+F,选择GPIO_Pin_0



GPIO_Speed同样操作
最后,把GPIO初始化结构体地址放到GPIO_Init第二个参数

GPIO初始化完成
8.实现LED闪烁
GPIO4个输出函数
GPIO_SetBits,把指定的端口设置为高电平
GPIO_ResetBits,把指定的端口设置为低电平
GPIO_WriteBit,前两个指定端口,BitVal根据第三个参数的值设置指定端口
GPIO_Write,GPIOX选择外设,PortVal,对16个端口进行写入操作

在LED灯闪烁文件夹中新建文件夹System,添加延时函数模块,再回到软件,点三个箱子,添加System组

点击魔术棒,添加System头文件路径


使用延时函数模块,在main.c文件上面添加#include 'Delay.h'
复制毫秒延时函数Delay_ms,设置500ms,就可以闪烁了

特殊
如果想要设置1是高电平,0是低电平
复制WriteBit,设置强制类型转换,将1和0类型转换为BitAction枚举类型

9.完整代码
#include 'stm32f10x.h' // Device header
#include 'Delay.h'
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
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_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//点亮
Delay_ms(1000);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);//熄灭
Delay_ms(1000);
}
}
二、LED流水灯
直接复制前面做的LED灯闪烁的文件夹,改为LED流水灯
All(L小写)

低电平点亮,前面加“~”按位取反,依此类推~0x0004、~0x0008、~0x0010、~0x0020、~0x0040、~0x0080(有几个灯写几个就行)

完整代码
#include 'stm32f10x.h' // Device header
#include 'Delay.h'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_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
GPIO_Write(GPIOA, 0x0001);//0000 0000 0000 0001
Delay_ms(1000);
GPIO_Write(GPIOA, 0x0002);//0000 0000 0000 0010
Delay_ms(1000);
GPIO_Write(GPIOA, 0x0004);//0000 0000 0000 0100
Delay_ms(1000);
GPIO_Write(GPIOA, 0x0008);//0000 0000 0000 0100
Delay_ms(1000);
GPIO_Write(GPIOA, 0x0010);//0000 0000 0000 0100
Delay_ms(1000);
GPIO_Write(GPIOA, 0x0020);//0000 0000 0000 0100
Delay_ms(1000);
GPIO_Write(GPIOA, ~0x0040);//0000 0000 0000 0100
Delay_ms(1000);
GPIO_Write(GPIOA, ~0x0080);//0000 0000 0000 0100
Delay_ms(1000);
}
}
三、蜂鸣器
直接复制前面做的LED灯闪烁的文件夹,改为蜂鸣器
这里用到的是PB口,改为GPIOB,端口改为Pin_12


想要实现不同的响声可以这样改

完整代码
#include 'stm32f10x.h' // Device header
#include 'Delay.h'int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度
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);
}
}
上一篇: STM32CUBEMX(2)--USART通过DMA方式接收不定长数据
下一篇:STM32中中断标志位与中断挂起位详解:TIM_ClearFlag与TIM_ClearITPendingBit函数应用指南
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析





