- 博客(163)
- 问答 (1)
- 收藏
- 关注
原创 【江科大STM32学习笔记-00】汇总:从入门到进阶(已完结)
写这套笔记的初衷,是想让后来者少走一些弯路。因为自己踩过坑,所以知道初学STM32时面对寄存器、结构体指针和复杂工程结构时的迷茫。如果你在学习过程中发现任何笔误,或者有想要探讨的技术点,非常欢迎在评论区留言交流,也可以直接通过博客私信联系我。希望这篇汇总能成为你学习STM32路上的一盏指路灯。
2026-10-08 19:57:15
247
原创 【STM32学习笔记-15】FLASH 闪存
Store 模块(Store.c / Store.h)是参数存储管理的核心,其设计思路为:将 FLASH 的最后一页视为掉电不丢失的后备存储,同时在 SRAM 中定义一个与之等大的数组 Store_Data[ ] 作为日常数据操作的中间缓冲区。由于 FLASH 不支持字节级写入,且编程前必须整页擦除(擦除会导致整页数据丢失),正确的做法是:先将目标页的全部数据读入 SRAM 中的缓冲区,在 SRAM 中修改需要变更的字节,然后擦除目标页,最后将 SRAM 缓冲区的整页数据逐一半字编程回 FLASH。
2026-06-12 21:36:01
600
原创 【STM32学习笔记-14】WDG看门狗 - 14.2 WWDG窗口看门狗
窗口看门狗(Window Watchdog,WWDG)是 STM32 微控制器内部集成的第二个看门狗外设。与普通看门狗仅检测“是否超时未喂狗”不同,WWDG 在此基础上进一步引入了“时间窗口”机制,对程序刷新计数器(又叫刷新/喂狗操作)的时机进行双向约束。在 WWDG 中,程序不仅必须在规定时间内完成喂狗,还必须避免过早喂狗。如果喂狗时机超出允许范围,无论过早还是过晚,WWDG 都会认为系统运行节拍异常,并立即触发系统复位。
2026-05-29 21:44:13
449
原创 【STM32学习笔记-14】WDG看门狗 - 14.1 IWDG独立看门狗
在嵌入式系统中,程序通常需要长时间连续运行。程序陷入死循环指针越界导致程序跑飞阻塞等待不可达的硬件条件电磁干扰引发程序计数器异常一旦发生上述问题,系统可能进入卡死或失控状态。对于无人值守设备而言,这类故障往往意味着系统长时间停机。看门狗(Watchdog,WDG)是一种硬件保护机制,用于判断程序是否仍在按预期节奏运行。其基本工作原理是:系统必须在规定时间内周期性执行"喂狗"操作,否则硬件将自动复位系统。从工作机制上看,看门狗本质上是一个持续递减的计数器。
2026-05-18 18:51:35
429
原创 【STM32学习笔记-13】PWR电源控制
在嵌入式系统设计中,功耗控制是衡量设备可靠性与续航能力的重要指标。对于无线传感节点、便携式仪表、安防设备等长期运行的嵌入式终端而言,系统大部分时间通常处于空闲等待状态。若微控制器(MCU)始终保持全速运行,不仅会造成大量无效功耗,还可能带来发热增加、续航缩短等问题。因此,如何在"保持系统可响应"的同时尽可能关闭不必要的硬件电路,成为低功耗设计的核心。STM32F10x系列内部集成了专用的电源控制模块PWR(Power Control),用于统一管理芯片不同供电区域与低功耗状态。睡眠模式(Sleep)
2026-05-15 21:03:11
655
原创 【STM32学习笔记-12】Unix 时间戳、BKP 备份寄存器与 RTC 实时时钟
在嵌入式系统设计中,实时计时与掉电数据保持是两类关联紧密的共性需求。无论是工业设备的运行日志、电子仪器的定时控制,还是消费类产品的时钟显示,均要求系统在主电源断开后,依然能够维持时间的流逝并保留关键配置参数。这类应用的共同挑战在于:时间基准不仅需要被精确记录,更需要在系统复位或断电后保持逻辑的连续性。然而,以 STM32F103C8T6 为代表的通用微控制器,其内部 SRAM 属于易失性存储器,在主电源(VDD)掉电或系统复位后数据将彻底丢失。
2026-05-05 18:07:30
596
原创 【江科大STM32学习笔记-11】SPI通信协议 - 11.2 硬件SPI读写W25Q64
最后一个字节写入后,软件等待 RXNE = 1 并读取最后一个接收字节,随后轮询等待 BSY 降为 0,确认移位寄存器已完全空闲后,通过 GPIO 将片选信号线拉高,从机检测到 /CS 上升沿后终止通信并恢复至待机状态。除轮询模式外,TXE 与 RXNE 标志位均可配置为中断源——置 1 时触发 SPI 中断,在中断服务函数中通过检查对应标志位来区分事件并分别处理。
2026-04-27 15:16:46
507
原创 【江科大STM32学习笔记-11】SPI通信协议 - 11.1 软件SPI读写W25Q64
为方便理解后续的时序图,需先明确这两个核心控制参数的物理含义。(1)时钟极性(CPOL)定义 SCK 在通信空闲状态(即 SPI 通讯开始前、NSS 处于高电平时)的默认电平。CPOL = 0:空闲时 SCK 保持低电平。CPOL = 1:空闲时 SCK 保持高电平。(2)时钟相位(CPHA)定义数据移入(采样)与数据移出(输出)所对应的时钟边沿次序。CPHA = 0:数据在 SCK 的第 1 个边沿被采样移入寄存器。
2026-04-22 21:54:00
720
原创 【江科大STM32学习笔记-10】I2C通信协议 - 10.2 硬件 I2C 读写MPU6050
I2C(Inter-Integrated Circuit)是一种广泛应用于嵌入式系统中的同步串行通信总线。该协议通过 SCL(Serial Clock)时钟线与 SDA(Serial Data)数据线实现设备之间的数据交换。I2C 通信以字节为基本单位进行传输,每个设备通过唯一地址进行识别与寻址。在实现方式上,I2C 通信可以通过软件或硬件两种路径完成。传统的软件实现方式是利用普通 GPIO 引脚手动控制 SDA 和 SCL 的电平变化,以模拟协议时序,这种方式称为软件 I2C而所谓 STM32。
2026-04-15 17:56:15
525
原创 【江科大STM32学习笔记-10】I2C通信协议 - 10.1 软件I2C读写MPU6050
I2C(Inter-Integrated Circuit)是一种同步串行通信总线,由飞利浦公司提出,广泛应用于微控制器与传感器、存储器及各种外围模块之间的数据交换。I2C 采用主从式通信结构,仅需少量信号线即可实现多个器件之间的互联。在 I2C 总线中,通信双方依赖同步时钟机制。通信过程中的时钟信号由主机产生,从机在该时钟节拍下完成数据的发送与接收。在 STM32 等微控制器中,I2C 通信的实现方式分为硬件 I2C和软件 I2C两种。
2026-04-05 23:02:36
568
原创 【江科大STM32学习笔记-09】USART串口协议 - 9.2 USART串口数据包
为了彻底解决这些问题,在工程实践中通常会在原始数据之上增加一层简单的通信协议,将多个零散的字节组织成结构化的数据帧。这种具有特定格式和边界的数据帧,称为数据包(Data Packet)。通过引入协议字段,接收端就可以在连续的串口字节流中识别出完整的数据帧,从而正确解析其中的有效数据。
2026-03-25 21:28:38
645
原创 【江科大STM32学习笔记-09】USART串口协议 - 9.1 STM32 USART串口外设
如果不希望修改标准输出路径,也可以先使用 sprintf() 将格式化结果输出到字符数组中,再调用串口字符串发送函数将其发出。// 1、定义字符串缓冲区// 用于保存 sprintf() 格式化后的结果// 数组长度需要能够容纳完整字符串以及结尾的 '\0'// 2、按照指定格式将数据写入字符串缓冲区String[]// 第一个参数 String 表示输出位置,"\r\nNum3=%d" 为格式字符串,333 为待替换的数据。
2026-03-21 19:29:33
755
原创 【江科大STM32学习笔记-08】DMA直接存储器存取
是微控制器中用于实现高效数据搬运的专用外设。其核心工程意义在于:在无需 CPU 连续干预的情况下,通过硬件逻辑直接接管总线控制权,建立起外设与存储器(Peripheral-to-Memory)、存储器与外设(Memory-to-Peripheral)或存储器与存储器(Memory-to-Memory)之间的高速数据传输通道。在传统的轮询或中断驱动方式中,CPU 需要参与数据的逐次读写搬运。当数据量较大或传输频繁时,会占用大量 CPU 时间,降低系统的并发处理能力。
2026-03-13 17:42:15
781
原创 【江科大STM32学习笔记-07】ADC 模数转换器
模数转换器(Analog-to-Digital Converter, ADC)是嵌入式系统中连接连续模拟信号与离散数字信号的核心接口。微控制器(如 STM32)内部逻辑电路仅能处理以高、低电平表征的数字信号,无法直接解析传感器输出的连续变化电压。ADC 的核心职能在于通过**采样(Sampling)、保持(Holding)、量化(Quantizing)与编码(Encoding)**四个物理过程,将模拟电压转换为处理器可识别的二进制数值。
2026-03-07 21:56:33
1048
1
原创 【江科大STM32学习笔记-06】TIM 定时器 - 6.4 定时器编码器接口功能
定时器基本定时功能(已学习)定时器输出比较功能(已学习)定时器输入捕获功能(已学习)定时器编码器接口功能(本篇内容)在深入探讨了通用定时器(TIM)的时基单元计数逻辑、输出比较(OC)波形合成技术,以及输入捕获(IC)信号特征分析之后,本篇技术文档将聚焦定时器在运动控制领域的进阶应用——编码器接口。作为电机闭环控制与伺服驱动中不可或缺的硬件模块,编码器接口通过内部硬件状态机对正交信号进行自动化解码,彻底取代了传统的“外部中断+软件计次”方案。
2026-02-28 22:30:41
987
原创 【江科大STM32学习笔记-06】TIM 定时器 - 6.3 定时器输入捕获功能
定时器基本定时功能(已学习)定时器输出比较功能(已学习)定时器输入捕获功能(本篇内容)定时器编码器接口功能在前两部分中,我们掌握了时基单元的定时逻辑与输出比较(OC)的波形产生技术。本章将深入探讨输入捕获功能。该功能不仅是测量外部信号频率与占空比的核心手段,更是理解定时器主从触发自动化机制的关键。目录前言1 频率测量理论基础1.1 测频法 (适合高频信号)1.2 测周法 (适合低频信号)1.3 中界频率2 输入捕获原理概述3 输入捕获硬件电路分析3.1 信号链路与核心处理模块3.1.1 输入滤波器。
2026-02-25 17:48:23
1520
原创 【江科大STM32学习笔记-06】TIM 定时器 - 6.2 定时器的输出比较功能
CNT在0到ARR之间循环计数(决定频率)。CCR设定了一个阈值切割点。比较器根据 CNT 与 CCR 的关系,输出逻辑电平。极性电路决定最终的高低电平。最终效果: 随着 CNT 的周期性变化,输出引脚TIMx_CHx上会产生连续的脉冲波形。我们只需要通过软件修改 CCR 寄存器的值,就可以在不停止定时器的情况下,平滑地改变输出波形的占空比,实现对电机速度或 LED 亮度的精准控制。寄存器名称作用描述TIMx_CNT计数器核心计数器,不断递增或递减,其值反映时间流逝。TIMx_CCR。
2026-02-21 17:43:58
1335
原创 【江科大STM32学习笔记-06】TIM 定时器 - 6.1 定时器的基本定时功能
定时器(TIM)本质上是一个受控的计数器单元。它通过对基准时钟信号进行分频和累加,实现精确的时间管理功能。虽然名为“定时”,但其底层逻辑其实是对时钟脉冲进行计数。STM32 的定时器架构主要由时钟源、预分频器(PSC)和计数器(CNT)组成。计数:在驱动时钟下,计数器(CNT)按步长递增;匹配:当 CNT 达到自动重装载寄存器(ARR)设定的阈值时;响应:硬件产生“更新事件”并触发中断。这种基于硬件计数的定时方式,不仅精度极高,还能配合 DMA 或其他外设实现复杂的自动化控制逻辑。
2026-02-14 21:01:43
1284
原创 【江科大STM32学习笔记-05】EXTI外部中断
STM32 拥有一套功能完善、结构清晰的中断系统,其核心是嵌套向量中断控制器(NVIC,Nested Vectored Interrupt Controller)。在 STM32 中,几乎所有片上外设——如 GPIO、定时器、串口、ADC 等——都具备产生中断请求的能力,并统一由 NVIC 进行管理和调度。
2026-02-07 22:47:10
1284
原创 【江科大STM32学习笔记-04】0.96寸OLED显示屏
OLED(Organic Light-Emitting Diode,有机发光二极管)是一种基于有机半导体材料的电致发光显示技术。其基本原理是:当电流通过有机材料层时,电子与空穴在发光层中复合,并以光子的形式释放能量,从而产生可见光。OLED 的每一个像素都是独立的自发光单元,不需要背光源,这一点与依赖背光源的传统 LCD 显示技术存在本质区别。因此,OLED 具备对比度高、响应速度快、视角大、功耗低等优点。
2026-01-28 21:24:16
811
原创 【江科大STM32学习笔记-03】GPIO通用输入输出口
推挽输出模式是GPIO最常用的输出配置,它利用一对P-MOS和N-MOS管协同工作,能够主动、有力地输出高电平和低电平。其名称形象地描述了这两个MOS管像两个人推挽一个开关一样协同工作。开漏输出模式是一种特殊的输出配置,其核心特征是只能主动输出低电平,无法主动输出高电平。当需要输出高电平时,引脚会进入高阻态,必须依赖外部上拉电阻才能实现高电平输出。
2026-01-22 19:20:16
872
原创 【江科大STM32学习笔记-02】标准固件库工程模板创建&寄存器/库函数点亮LED灯
Keil 安装目录下就有ST-Link驱动,如图所示,双击运行即可:也可以选择官网下载,官网下载地址:https://www.st.com/zh/development-tools/stsw-link009.html#get-software将文件解压到文件夹中:然后双击运行之后一步步运行就可以了LED灯,也称发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。
2026-01-16 00:13:57
1004
原创 【江科大STM32学习笔记-01】STM32简介 & 深入理解ARM Cortex-M内核
STM32是ST公司基于ARM Cortex-M内核的32位微控制器,具有高性能、低功耗和丰富外设等特点,广泛应用于嵌入式系统。该芯片包含内核和片上外设两大部分,采用总线矩阵架构连接各模块。STM32通过存储器映射将功能部件分配到4GB地址空间,开发者可通过寄存器编程控制外设。文档详细介绍了STM32的选型方法、命名规则、引脚分类、内部组成、存储器结构以及C语言寄存器封装技术,包括位操作方法。同时提供了GPIO外设寄存器的具体操作示例,解释了如何通过结构体指针访问寄存器。最后列出了STM32参考手册和数据手
2025-08-24 18:58:14
2202
原创 DAC 数模转换实验
DAC(Digital-to-Analog Converter,数字-模拟转换器)是一种将数字信号转换成连续模拟信号的电子器件。它的功能正好与ADC(模数转换器)相反。各种传感器将外界的物理量(温度、声音、光强等)转换成模拟电压或电流信号;ADC将这些模拟信号转换成数字量,供计算机或单片机存储和处理;经过运算处理后,如果需要控制外部的模拟设备(如扬声器播放声音、驱动马达、调节灯光亮度等),就由DAC将处理后的数字量还原成对应的模拟信号输出。
2025-08-14 16:41:37
1143
原创 51 单片机单文件&多文件结构工程模板的创建教程
单文件结构是指将所有代码(包括主函数、外设控制、逻辑处理、宏定义、变量声明和延时函数等)集中编写在一个.c文件中,通常命名为main.c。多文件结构是指将工程代码按功能或职责进行划分,分别存放在多个.c源文件和.h头文件中,常见模块包括主函数、外设驱动、公共函数、类型定义等,并通过模块化接口进行调用。每个功能模块通常拥有自己独立的一对.c/.h文件,主函数只负责调用这些模块接口。
2025-07-25 20:38:30
1024
原创 C/C++每日一练:图的邻接矩阵和邻接表表示
图是一种非线性数据结构,由和组成。可以将图抽象地表示为一组和一组的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。将顶点看作节点,边看作连接各个节点的引用(指针),就可以将图看作一种从链表拓展而来的数据结构。如图所示,相较于和的自由度更高,因而更为复杂。
2024-12-09 16:46:27
1049
原创 C/C++每日一练:合并K个有序链表
本篇博客将探讨如何 “合并K个有序链表” 这一经典问题。本文将从题目要求、解题思路、过程解析和相关知识点逐步展开,同时提供详细注释的代码示例。
2024-12-01 18:54:49
1124
原创 C/C++ 每日一练:在矩阵中查找特定值
本次练习将解决一个经典问题——在一个二维矩阵中查找特定的值。通过这个练习,可以更好地掌握二维数组的操作,以及优化算法的设计。给定一个二维矩阵 matrix,每行从左到右递增排序,每列从上到下递增排序,以及一个目标值 target。编写一个函数来判断目标值是否存在于矩阵中。如果存在,返回 true;否则,返回 false。
2024-11-26 18:31:04
749
原创 C/C++ 每日一练:实现字符串的大小写转换
实现一个函数,将字符串中的所有字母的大小写进行转换,即将大写字母转换为小写字母,小写字母转换为大写字母,非字母字符保持不变。
2024-11-24 19:11:11
1049
原创 C/C++每日一练:查找链表的中间节点
链表是一种线性数据结构,由一系列节点(Node)通过指针链接在一起。给定一个单链表,编写一个算法来查找链表的中间节点。如果链表长度为奇数,则返回唯一的中间节点;如果为偶数,则返回两个中间节点中的第一个。这种方法效率高且不需要额外的空间,适合单链表查找问题。假设链表为:1 -> 2 -> 3 -> 4 -> 5。假设链表为:1 -> 2 -> 3 -> 4。寻找链表的中间节点可以用。
2024-11-12 12:39:15
1198
原创 C/C++每日一练:编写一个查找子串的位置函数
编写一个函数,用于在一个字符串中查找一个子串的位置。如果找到子串,则返回子串在主字符串中第一次出现的位置(从0开始计数);如果未找到子串,则返回-1。
2024-11-12 10:47:52
1046
原创 C/C++ 每日一练:二叉树的先序遍历
二叉树是一种树状数据结构,非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。节点值:存储该节点的数据。左子节点(left-child node):指向该节点左侧的子树或为空。右子节点(right-child node):指向该节点右侧的子树或为空。/* 二叉树节点结构体 */int val;// 节点值// 左子节点指针// 右子节点指针当给定一个二叉树的节点时,将该节点的左子节点及其以下节点形成的树称为该节点的左子树(left subtree),同理可得。
2024-11-01 19:03:29
1212
原创 C/C++每日一练:实现选择排序
实现一个选择排序算法,用于对整数数组进行升序排序。输入是一个包含若干整数的数组,输出是排序后的数组。要求在原数组上进行排序,不借助额外的数组空间(即就地排序)。选择排序的基本思想是:每次从未排序部分选择最小的元素,将其放到已排序部分的末尾。这样经过多轮操作后,整个数组会被逐步排好序。假设有一个数组 arr,长度为 n。,其中 n 是数组长度,不适合大数据集的排序,适合于元素较少且对性能要求不高的场景。选择排序是一种简单直观的排序算法,时间复杂度为。
2024-10-28 17:58:03
1000
原创 C/C++ 每日一练:计算斐波那契数列的第 n 项(递归、记忆化、迭代)
因此,斐波那契数列的前几项为:1, 1, 2, 3, 5, 8, 13, 21, 34, ...。斐波那契数列在自然界、艺术和数学中都有广泛的应用,例如兔子繁殖问题、植物生长、黄金分割等,是数学中一种典型的递推数列。与递归相比,迭代法无需栈空间,时间复杂度为 O(n),空间复杂度为 O(1)。记忆化递归是对递归方法的优化。递归法的核心思想是将一个大的问题分解成两个较小的子问题,再继续递归地分解,直到到达递归终止条件。第 n 项 F(n) = F(n-1) + F(n-2),其中 n > 2。
2024-10-27 18:30:17
3974
原创 C/C++每日一练:实现冒泡排序
冒泡排序是一种简单直观的排序算法。其基本思想是通过多次遍历数组,逐步将未排序部分中的最大或最小元素“冒泡”到数组的一端,直到整个数组有序。编写一个程序,实现冒泡排序算法。给定一个由 n 个整数组成的数组,要求通过冒泡排序对数组从小到大进行排序。一个整数数组,长度为 n,数组中的元素可能是正数或负数。按照升序排序后的数组。
2024-10-24 17:35:55
1252
2
原创 C/C++每日一练:实现一个环形队列
环形队列是对普通队列的一种优化,它使用一个固定大小的数组来存储数据。当队列的尾部到达数组末尾时,它会“环绕”到数组的开头,从而高效地利用空间。在环形队列中,当队列满时,rear 和 front 的位置关系非常特殊。与普通队列不同的是,环形队列的末尾与头部相连,使得当队列满时,队列可以循环使用。最先进入队列的元素最先被处理,而后加入的元素则排在队列的末尾。下面将展示从空队列到满队列,以及出队和入队操作动态管理队列中的元素的状态变化。的位置空缺(在第4步已被出队),但实际上不能再插入新元素,因为队列已满。
2024-10-22 19:04:34
1548
原创 C/C++每日一练:合并两个有序数组
给定两个已经排好序(从小到大)的数组 arr1 和 arr2,将它们合并为一个新的有序数组,并返回结果。要求最终的数组仍然是从小到大排序的,且不使用额外的排序函数。两个升序排序的数组 arr1 和 arr2 ,长度分别为 m 和 n。一个包含所有元素并且升序排序的新数组。
2024-10-20 18:08:26
2408
空空如也
VS code中运行C++代码时,通过cin输入中文字符,输出无显示或为乱码
2025-04-15
上班的时候,空闲时间看书学习,老板会认为你是在摸鱼吗?
2021-11-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅