一、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函数应用指南
推荐阅读最新更新时间:2026-03-25 16:07
- 使用 Analog Devices 的 ADP3334 的参考设计
- LTC3588IMSE-1 5V 至 16V 太阳能供电 2.5V 电源的典型应用电路,具有用于增加输出能量存储和电池备份的超级电容器
- XRP7659、1.5A DC 至 DC 非同步降压稳压器的典型应用
- 使用 ON Semiconductor 的 NCP3120MNTX 的参考设计
- MAXREFDES1003:150mA、4通道、LED驱动器,SEPIC配置
- LTC4223-2 演示板,用于 AMC 的双电源热插拔控制器(故障后自动重试)
- MC33072ADR2G 运算放大器用作晶体管驱动器的典型应用
- 使用 Diodes Incorporated 的 AP1509-12S 的参考设计
- NCP382HD10AAGEVB:单输入双输出高侧配电开关评估板
- 使用 Analog Devices 的 AD7730 的参考设计


STM32模拟串口
dm9000cep网卡通信
非常经典的关于LLC的杨波博士论文
CLC5612IMX
XC6406PP60DL






京公网安备 11010802033920号