STM32实现LED闪烁、流水灯与蜂鸣器功能详解教程

一、LED闪烁

1.新建文件夹

2.配置文件

3.添加工程组合文件

4.工程选项配置

5.工程编译

如果报错,可以这样解决

6.操作STM32的GPIO总共3步

跳转定义点这个

7. 正式开始,GPIO初始化

8.实现LED闪烁

GPIO4个输出函数

特殊

9.完整代码

二、LED流水灯

完整代码

三、蜂鸣器

完整代码

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

作者:鲨鱼爱吃菜

物联沃分享整理
物联沃-IOTWORD物联网 » STM32实现LED闪烁、流水灯与蜂鸣器功能详解教程

发表回复