当前位置: 首页 > news >正文

LED 闪烁 LED 流水灯 蜂鸣器

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) → 蜂鸣器停
http://www.dtcms.com/a/269067.html

相关文章:

  • IROS 2025|RL vs MPC性能对比:加州理工无人机实测,谁在「变形控制」中更胜一筹?
  • pg_class 系统表信息
  • React + Express 传输加密以及不可逆加密
  • OpenCV人脸分析------绘制面部关键点函数drawFacemarks()
  • day08-Elasticsearch
  • MinIO与SpringBoot集成完整指南
  • maven 发布到中央仓库常用脚本-02
  • 视频序列和射频信号多模态融合算法Fusion-Vital解读
  • 力扣 hot100 Day37
  • C++笔记之和的区别
  • Isaac Lab:让机器人学习更简单的开源框架
  • Go defer(二):从汇编的角度理解延迟调用的实现
  • RAG实战指南 Day 8:PDF、Word和HTML文档解析实战
  • Stirling-PDF 本地化部署,建立自己的专属PDF工具箱
  • 力扣_链表(前后指针)_python版本
  • 虚幻引擎UE5 GAS开发RPG游戏-02 设置英雄角色-18 改成网络多人游戏
  • C++:string类(3)(string类的模拟实现)
  • 批量OCR的GitHub项目
  • Linux 进程控制:全面深入剖析进程创建、终止、替换与等待
  • UI自动化常见面试题
  • qt-C++笔记之QSplitter
  • PyTorch笔记3----------统计学相关函数
  • AI PPT探秘
  • ARMv7单核CPU上SWI(软件中断)验证
  • 策略与工厂的演进:打造工业级Spring路由框架
  • window显示驱动开发—X 通道解释
  • 如何远程管理Linux服务器
  • Rust 内存结构:深入解析
  • DPDK 网络驱动 之 UIO
  • 如何使用 Renode(快速入门)