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 会报错找不到函数。

整体运行流程(超级重要)

  1. 开机 → 进入 main
  2. 调用 LED_Init()
  3. 打开 GPIOA 时钟
  4. 配置 PA1 为推挽输出
  5. 回到 main
  6. while(1) 里让 PA1 输出低电平
  7. 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、完整执行流程

  1. 开机
  2. 初始化 LED 引脚
  3. 进入死循环
  4. 亮 → 延时 1 秒
  5. 灭 → 延时 1 秒
  6. 回到第 4 步
  7. 一直闪烁......

4、小知识(可以随便改)

  • delay(500) → 闪得快
  • delay(2000) → 闪得慢
  • delay(1000) → 刚好 1 秒
相关推荐
硅基造物主几秒前
STM32 从 0 到 1 做智能家居(十):串口与 printf 重定向
stm32·单片机·智能家居·usart·中断
新晨单片机设计2 小时前
S033A-基于STM32单片机拼图游戏机【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件·拼图游戏机
Silicore_Emma3 小时前
D2596HV:高压异步DC-DC降压芯片简介
嵌入式硬件·消费电子·dc-dc系列电路·电源管理电路·降压(buck)开关稳压器
2501_922639583 小时前
率能半导体 SS6811H双通道H桥驱动芯片:38V/1.6A,覆盖舞台灯光、安防相机、办公自动化、游戏机、机器人五大应用场景
单片机·嵌入式硬件·硬件工程
恒锐丰科技林技术员5 小时前
EG2304L 高压半桥驱动芯片:中小功率电力电子方案优选器件
经验分享·嵌入式硬件·硬件工程
comyccccc6 小时前
STM32F407VET6核心板的部分电路绘制学习笔记
笔记·stm32·学习
OIDCAT6 小时前
CH9433技术解析:一颗芯片搞定CAN总线和9线串口
单片机·嵌入式硬件·工控·调试工具·国产芯片
简单电磁炮6 小时前
关于can的调试
c语言·stm32·单片机
2501_922639586 小时前
率能半导体 SS6812T双通道H桥驱动芯片:32V/1.0A,覆盖POS打印机、安防相机、办公自动化、游戏机、机器人五大应用场景
单片机·嵌入式硬件·硬件工程
女神下凡6 小时前
芯参谋(77):裸机(无 OS)存储驱动开发指南
arm开发·单片机·嵌入式硬件·设计规范·1024程序员节