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);
}
}
作者:鲨鱼爱吃菜
