STM32——led灯点亮
·
一、LED点亮
1、main.c (主函数,程序的入口)
#include "stm32f10x.h" // STM32核心库
#include "main.h" // 工程头文件
#include "led.h" // 引入LED的函数声明
- 这三行是引入头文件,告诉编译器要用哪些功能。
led.h里写了LED_Init(),所以这里才能调用。
int main()
{
- main 函数 = 程序的入口
- 单片机上电后,第一行就跑这里。
//1.初始化灯的引脚GPIOA1
LED_Init();
- 调用你写在
led.c里的初始化函数 - 作用:把 PA1 引脚设置成输出模式
- 不初始化,LED 永远不会亮!
while(1)
{
// 2.让GPIOA1输出低电平,灯就亮了
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
while(1)= 死循环,单片机永远在这里循环GPIO_ResetBits= 输出 低电平(0V)- 我的 LED 是 低电平点亮,所以一输出低电平就亮了

2、led.c (真正控制 LED 硬件的文件)
#include "led.h"
#include "stm32f10x.h"
- 引入需要的库,不然编译器不认识结构体。
//初始化LED的函数
void LED_Init()
{
- 这是你自己写的 LED 初始化函数
- main 函数会调用它。
GPIO_InitTypeDef led_initstruct;
- 定义一个 GPIO 结构体变量
- 作用:用来存放 PA1 引脚的配置信息(引脚号、速度、模式)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- 最重要的一句!
- 作用:打开 GPIOA 的时钟
- 单片机所有外设必须开时钟才能工作!
led_initstruct.GPIO_Pin = GPIO_Pin_1;
- 选择 PA1 引脚
led_initstruct.GPIO_Speed = GPIO_Speed_2MHz;
- 设置引脚速度 2MHz(LED 随便选都可以)
led_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
- 设置模式:推挽输出
- 用来控制 LED 亮灭
GPIO_Init(GPIOA, &led_initstruct);
- 把刚才配置的参数 真正写入单片机硬件
- 执行完这句,PA1 就变成输出模式了!
3、led.h (函数声明)
void LED_Init(void);
- 告诉 main.c
- “LED_Init () 这个函数存在,你可以调用”
- 没有这个声明,main 会报错找不到函数。
整体运行流程(超级重要)
- 开机 → 进入
main - 调用
LED_Init() - 打开 GPIOA 时钟
- 配置 PA1 为推挽输出
- 回到 main
while(1)里让 PA1 输出低电平- LED 常亮
我最终点亮了,但是期间有也遇到了很多问题,其中最多的也是处理最久的就是路径问题,如果你想顺利进行单片机编程,一定要注意,keil安装的路径和工程保存的路径不要有中文,空格,特殊字符,否则容易出现A3906U这个错误。
二、led闪烁
1. 延时函数
void delay(uint16_t time) //延时 1ms函数
{
uint16_t i = 0;
while(time --) // 循环 time 次
{
i = 12000;
while(i --); // 内部循环,消耗时间
}
}
在刚才的主函数上加上这个延时函数
- 这个函数的作用就是 “空转、耗时间”
- 你传进去
delay(1000) - 它就会空转 大约 1 秒
为什么是 1 秒?
- 外面
time--循环 1000 次 - 每次内部
i=12000循环 - 加起来 刚好大约 1 秒
2. main 主函数
int main()
{
LED_Init(); // 初始化 PA1 引脚
- 开机第一件事:配置 PA1 为输出模式
- 不初始化,LED 无法控制
while(1) // 死循环,永远在这里跑
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
// 输出低电平 → LED 亮
delay(1000);
// 延时 1 秒 → 灯亮 1 秒
GPIO_SetBits(GPIOA, GPIO_Pin_1);
// 输出高电平 → LED 灭
delay(1000);
// 延时 1 秒 → 灯灭 1 秒
}
}
3、完整执行流程
- 开机
- 初始化 LED 引脚
- 进入死循环
- 亮 → 延时 1 秒
- 灭 → 延时 1 秒
- 回到第 4 步
- 一直闪烁……
4、小知识(可以随便改)
delay(500)→ 闪得快delay(2000)→ 闪得慢delay(1000)→ 刚好 1 秒
更多推荐
所有评论(0)