STM32 入门笔记(专栏索引)
这一篇是「STM32 入门笔记」专栏的索引页,列了到目前为止每一篇的链接与一句话简介,方便按顺序学习。 专栏说明 目标读者:跟我一样刚入门 STM32 嵌入式开发的同学,主要跟随江科大 / 江协科技 STM32 入门教程的进度。 代码风格:所有示例都用 STM32F103 标准外设库(固件库 v3.5),对应江科大那种「寄存器 + 库函数」混讲的风格。HAL 库 / CubeMX 的 API 名不同,但物理意义可以对照。 阅读顺序:建议从 01 开始按顺序看,每篇都假设你已经看过前面的内容。 目录 篇号 标题 关键内容 链接 01 从点亮一颗 LED 到能看懂固件库 GPIO 的 8 种模式、SetBits / ResetBits 方向、流水灯、Set/Reset 与高低电平对应关系、stdint ↔ STM32 别名 01 从点亮一颗 LED 到能看懂固件库 02 OLED 显示屏与硬件接线注意 有机发光二极管原理、4 针 / 7 针 OLED 引脚定义、杜邦线长度对显示的影响 02 OLED 显示屏与硬件接线注意 03 EXTI 外部中断:原理 + 对...
STM32 入门笔记 01:从点亮一颗 LED 到能看懂固件库
这一篇是 STM32 入门笔记专栏的第一篇,覆盖「点亮一颗 LED」用到的全部固件库调用,再把容易踩坑的几个细节——GPIO 8 种模式、SetBits/ResetBits 的方向、固件库自带的别名——串成一张能用得上的清单。 约定:除非另说,文里所有示例都是基于 STM32F103 标准外设库(也叫「标准库 / 固件库 v3.5」),对应江科大 / 江协科技入门课程那种「寄存器+库函数」混讲的版本。CubeMX / HAL 库的 API 名不一样(HAL_GPIO_WritePin 等),但物理意义是一致的。 一、点亮一颗 LED 的最小步骤以 PC13 引脚接的一颗 LED 为例(很多最小系统板上 PC13 是板载 LED),点亮它要干三件事: 打开 GPIOC 外设的时钟; 把 PC13 配置成「推挽输出」模式; 把 PC13 输出低电平(注意:很多板载 LED 是低电平点亮的,见下文)。 1.1 开时钟STM32 上外设默认是关时钟的(为了省电),用之前必须先开: 1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENAB...
P1150 Peter 的烟 —— 一道看似绕、其实一步推完的小题
题目链接:P1150 Peter 的烟 - 洛谷 一、题目复述Peter 有 n 根烟,每抽完 k 根烟的烟蒂可以换一根新烟。Peter 可以无限次地用烟蒂换烟。问 Peter 一共能抽多少根烟。 数据范围:1 ≤ n, k ≤ 10⁶。 样例:n = 3, k = 2 → 输出 5(抽完 3 根得 3 个烟蒂 → 换 1 根 → 抽完又得 1 个烟蒂,共 5 根)。 二、直觉:循环模拟最直观的写法是「不断用烟蒂换烟,直到不够为止」: 12345678910111213141516171819#include <iostream>using namespace std;int main() { long long n, k; cin >> n >> k; long long total = n; // 已经抽的烟数(也是手里烟蒂数) long long butts = n; // 当前手里的烟蒂数 while (butts >= k) { long...
数位统计:求 m~n 中数字 d 出现的次数
求「m 到 n 区间内数字 d 出现了多少次」,最直接的思路是把区间拆成两半: \text{ans} = f(n) - f(m - 1)其中 f(x) 表示「数字 d 在区间 [0, x] 里出现了多少次」。这一篇重点讲 f(x) 的数位统计法,并把它压成「一行公式」。 一、思路把数字 x 按十进制一位一位看: 12x = high cur low base = high * base * 10 + cur * base + low 其中: 名字 含义 base 当前位的权值(1、10、100、…) cur 当前位的数字(0 ~ 9) high 比 cur 高的部分(左侧) low 比 cur 低的部分(右侧) 例:x = 1304,base = 100,则 high = 1、cur = 3、low = 4。 我们的任务是:在 [0, x] 中,当前位上出现 d 的次数有多少。设这个贡献为 Δ,则 f(x) = Σ Δ。 按 cur 和 d 的大小关系,分三种情况讨论。 二、分情况讨论2.1 cur < d当前位自己已经是 d 了,...
编程小技巧,小知识
这一篇把做题时反复会用到、但每次都要重新查的几条「代码模板」和「容易踩坑」记一下,每个都附最简可运行例子。 一、读整数直到文件结束OJ(在线判题)里经常出现「不告诉你有多少个输入,要读到文件尾」的情况。模板: 1234int value;while (cin >> value) { // 读不到就结束(文件尾 / 类型不符 / EOF) // 在这里处理 value} 同理可读 string、double、char: 12string s;while (cin >> s) { /* ... */ } 注意点:cin >> 会跳过空白字符(空格、换行、制表符),所以一行多个数或一行一个数都能正确读,不需要额外处理。 输入完之后,按: Ctrl + Z,然后再敲一下回车 → 触发 EOF,循环结束。 Linux/Mac 是 Ctrl+D 二、循环 n 次while (n--) 是最简洁的写法: 1234int n = 5;while (n--) { cout <&...
栈 stack:从零搭起一套「后进先出」的工具箱
栈(stack)是一种「后进先出」的数据结构——想象一摞只能从顶部放、取的书,最后放上去的最先被拿走。这一篇把它的 API、四道经典栈题、以及延伸出来的「表达式」相关概念串成一份工具笔记。 一、五分钟上手:std::stack栈在 C++ 标准库里只对外暴露 5 个常用接口: 方法 作用 是否改动栈 push(x) 把 x 压到栈顶 ✅ pop() 弹出栈顶(不返回值) ✅ top() 返回栈顶元素的引用 ❌ empty() 栈是否为空 ❌ size() 元素个数 ❌ 最容易踩的坑:pop() 不返回值。要拿到栈顶值,必须先 top() 再 pop()。 1234567891011121314151617181920#include <iostream>#include <stack>int main() { std::stack<int> s; s.push(1); s.push(2); s.push(3); std::cout << "To...
蓝桥杯 2026 萌新首秀第二场 T4 校园打印
题目链接:「萌新首秀」千校新生编程排位赛·第二场 一句话概括解法:每张打印卡只有「买 / 不买」两种选择,M ≤ 18 → 枚举 2^M 种组合,取花费最小。这道题是二进制枚举(位掩码枚举)的模板题。 一、题目复述小蓝要打印 Q 页资料,打印店有两种方式: 直接打印:每页 P 元; 打印卡:共有 M 种卡,第 i 种需要花 Cᵢ 元购买,买后最多可打印 Lᵢ 页。每种卡最多购买一次,可以同时买多种。没用的页数不退钱。 求打印完全部 Q 页资料,最少要花多少钱。 数据范围: 变量 范围 提示 Q, P 1 ~ 10⁹ Q × P 最大 10¹⁸,必须用 long long M 1 ~ 18 2¹⁸ = 262144,这是本题的突破口 Lᵢ, Cᵢ 1 ~ 10⁹ 累加会超过 int 二、把问题抽象成「子集选择」先写出花费公式。假设我们决定买下一个卡片集合 S: 12345总页数 = Σ Lᵢ (i ∈ S)总卡费 = Σ Cᵢ (i ∈ S)如果 总页数 ≥ Q:花费 = 总卡费如果 总页数 < Q:花费 = 总卡费 + (Q - 总页...
蓝桥杯 2026 萌新首秀第二场 T3 图书归位(书架调整)
题目链接:「萌新首秀」千校新生编程排位赛·第二场 一句话概括解法:先用「奇偶性不变量」判断有无解,再从左到右贪心把每个数归位。这道题的核心考点不是敲代码,而是证明不清不变量就写不对判定条件。 一、题目复述N 本书编号 1 ~ N 排在书架上,顺序可能是乱的。目标状态是 1, 2, 3, ..., N(第 i 个位置放编号为 i 的书)。 一次操作:任选连续的三个位置 x, x+1, x+2,交换 a[x] 与 a[x+2],中间的 a[x+1] 保持不动。 例如 1 2 3 4 5,选第 2 ~ 4 个位置,交换 2 和 4,得到 1 4 3 2 5。 求把书架恢复成 1, 2, ..., N 的最少操作次数;无论如何都无法完成时输出 -1。 数据范围:3 ≤ N ≤ 2000,输入保证是 1 ~ N 的一个排列。 二、第一步:把操作翻译成人话「选连续三个位置、交换两端」听起来复杂,但作用到元素身上只有一句话: 一次操作 = 某个元素向左或向右跳 2 格,代价 1。 因为中间那个位置的书自始至终没被动过,我们完全可以忽略它,只看两端。 于是问题变成:在一个数组里,每次可以把一...
Git 常用命令与工作流
本文记录 Git 的核心模型和日常最常用的命令,配合分支用法和「改坏了怎么救」的排查表,足够覆盖个人博客与日常开发。 一、四个区域:git 的全核心理解 git 的关键,是搞清楚四个区域之间的关系: graph LR A["工作区<br/>你编辑的文件"] -->|git add| B["暂存区<br/>待提交清单"] B -->|git commit| C["本地仓库<br/>提交历史"] C -->|git push| D["远程仓库<br/>GitHub"] D -->|git pull| C 区域 是什么 由谁管理 工作区 你实际编辑的文件 你的编辑器 暂存区 「这次要提交哪些改动」的清单 git add 本地仓库 一次次提交快照组成的历史,全在你电脑上 git commit 远程仓库 GitHub 上的那份,部署平台从这里拉代码 ...
C++ 友元(friend)详解
友元(friend)是 C++ 提供的一种「定向开权限」机制:允许类外部的函数或另一个类访问本类的 private / protected 成员。本文介绍友元的三种形式、为什么需要它,以及使用时的注意事项。 一、友元是什么友元函数不是类的成员函数,却可以访问类的 private / protected 成员。 三个关键认知: 不是成员函数:它属于全局作用域(或另一个类),不在本类作用域内; 没有 this 指针:因为不属于任何对象,想访问某个对象的成员就必须把它作为参数传进来; 权限是「授予」的:由被访问的类自己用 friend 声明,主动权在被访问者手里,而不是想访问的人自己宣布。 二、友元函数语法是类内声明 + 类外定义:在类里加 friend 声明,函数体写在类外面。 123456789101112131415161718192021#include <iostream>using namespace std;class A {private: int num;public: A(int x) : num(x) {} frien...