单片机
返回首页

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);
    
    }
}



进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 红外开关

  • LM317过压保护

  • 0-30V/20A 大功率稳压电源(采用LM338)

    相关电子头条文章