LED 闪烁 & LED 流水灯 & 蜂鸣器

发布于:2025-07-08 ⋅ 阅读:(24) ⋅ 点赞:(0)

1. 编译心得:

① 在 ISO C标准中强制要求一个C源代码文件的最后一行必须是一个换行符(即必须以一个新行结束),否则会有警告。

② 杜邦线如图所示:

PS:在做该实验的时候,记得要把杜邦线连到 ST-Link 下面一排,不然会无法驱动!

2. LED 闪烁工程

① 常见的函数声明:

// 时钟控制 (RCC)
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); // ★ 使能GPIO端口时钟(必须调用)

// GPIO初始化和配置
void GPIO_DeInit(GPIO_TypeDef* GPIOx);          // 复位指定的GPIO端口
void GPIO_AFIODeInit(void);                     // 复位AFIO外设(用于复用/重映射)
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); // ★ 核心配置函数
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); // 初始化结构体为默认值

// GPIO读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 读取指定输入引脚状态
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);                      // 读取整个端口的输入数据
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 读取指定输出引脚状态
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);                     // 读取整个端口的输出数据

// GPIO输出控制函数 ★常用
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);     // 置位指定引脚(输出高电平)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);   // 复位指定引脚(输出低电平)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); // 写入单个引脚状态
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);        // 写入整个端口的输出状态

② LED 流水灯

 (1) 如何“同时控制” 16个引脚?

  • 初始化配置:通过 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All 一次性配置了 PA0 ~ PA15 全部引脚为输出模式,使能了整组端口的控制能力。
  • 批量写入数据:GPIO_Write(GPIOA,data) 函数会向 GPIOA 寄存器一次性写入 16 位数据,每条指令都能同时设置全部 16 个引脚的电平状态。

(2) 为什么要按位取反(使用了 ~ 符号)

① 实际运算顺序:

  • 先计算 0x0001 → 结果:0000 0000 0000 0001(这个是16进制)
  • 再执行取反 ~ → 结果:1111 1111 1111 1110
  • 最后写入寄存器:PA0=0(低电平),其他=1(高电平)

② LED 物理连接方式

  • 假设您的 LED 是 阴极接地(更常见的接法)
  • 此时 GPIO 输出低电平(0)时导通点亮
  • GPIO输出高电平(1)时截止熄灭

3. 蜂鸣器

 ① 电平控制原理

  • GPIO_ResetBits(GPIOB, GPIO_Pin_12):将 PB12 设为低电平(0) → 蜂鸣器响
  • GPIO_SetBits(GPIOB, GPIO_Pin_12):将 PB12 设为高电平(1) → 蜂鸣器停

网站公告

今日签到

点亮在社区的每一天
去签到