STM32从零笔记 #1:2026.07.18 灯还没亮,但脑子亮了 📅 2026/7/19 13:20:34 写在最前面本笔记主要基于江协科技的课程内容并结合DeepSeek的回答进行整理与补充。我将其记录下来既是为了巩固自身的学习脉络也希望能为同样走在这条路的小伙伴提供一份参考。由于个人水平有限笔记中难免存在理解不到位或表述不精确的地方这都将是我未来持续修正和深耕的方向。如有错漏还望大家不吝指正我们共同进步。了解STM32STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器1.1片上资源/外设不同的型号所具有的外设不同。1.2课程上所用的芯片-命名含义等这些内容我后续再补充我现在想快速上手因为我觉得理论相关的东西会消磨我的积极性。新建工程2.1开发方式基于寄存器、库函数和HAL库2.1.1了解三种开发方式1.寄存器手搓调料比喻你从种菜、磨盐开始自己调配每一种调料的分量。做法直接操作单片机的物理内存地址比如GPIOA-ODR 0x01。你得翻开几百页的芯片手册查每个二进制位代表什么。特点效率最高、最省内存但代码繁琐、可读性极差。换个芯片型号所有地址可能就变了移植非常困难。适用对性能或芯片容量有极端要求的场景或者刚入门想彻底搞懂底层原理的学习阶段。2.库函数标准化菜谱【课程使用的方式】比喻别人把“放3克盐、5毫升酱油”封装成了一张菜谱你照着菜谱写“加盐()”、“加酱油()”。做法ST官方把寄存器的操作封装成一个个函数比如GPIO_SetBits()。你不用记地址了但函数里依然是在操作寄存器。特点可读性好移植性中等。你不用背手册但调用的每个函数依然很底层写几十行代码才能点亮一个灯。适用前几年比较主流的标准库现在ST已经不再更新它了针对新芯片不推出标准库。3. HAL库请个保姆做饭比喻你说“我想吃宫保鸡丁”保姆直接帮你把菜切好、调料配好、火候控制好端到你面前。做法HAL硬件抽象层把底层硬件彻底抽象了。你只需要调用HAL_GPIO_TogglePin()管你是什么型号的芯片管你底层寄存器怎么变这句代码通用。特点极度易用、可移植性极强换芯片几乎不用改代码。缺点是因为封装太厚代码量大、执行效率比寄存器低。适用目前最主流的开发方式尤其是需要图形化配置工具STM32CubeMX的项目。2.2为工程添加基本文件2.2.1添加文件我按照deepseek的方法在右侧写代码的时候系统会报错它找不到相关的文件也就是没有文件可以调用按照课程的内容我们需要先将文件添加到文件库里供程序调用。2.2.1.1我们先俩明确一下这些文件是干什么的工程结构先看整体你的工程现在分成了两大部分startfile启动相关文件——这是芯片“开机”时需要的东西User用户文件——这是你自己写的代码下面我挨个解释每个文件是干什么的。第一部分startfile启动文件组这一组文件的作用是在芯片上电后、执行你的main()函数之前先做准备工作。1.startup_stm32f10x_md.s项目说明文件类型.s汇编文件通俗解释这是芯片的“开机引导程序”。芯片上电后先运行这个文件它负责① 设置堆栈指针 ② 设置中断向量表 ③ 跳转到main()函数要不要管它完全不用编译器会自动处理它为什么有_mdmd Medium Density表示你这个 STM32F103C8 是中容量芯片选这个是对的打个比方就像你电脑开机时先加载BIOS然后才进Windows。startup.s就是芯片的“BIOS”。2.core_cm3.c和core_cm3.h项目说明通俗解释这是ARM Cortex-M3内核的核心文件。STM32F103C8 用的就是 Cortex-M3 内核。这两个文件定义了内核最基本的操作比如中断开关、系统时钟控制等。要不要管它完全不用它们是底层文件你写的代码用不到它们编译器内部会用到。打个比方这就像汽车的发动机底层控制系统——你只管踩油门和刹车不需要直接去调发动机的喷油量。3.system_stm32f10x.c和system_stm32f10x.h项目说明通俗解释这是STM32芯片的系统初始化文件。主要作用是芯片上电后帮你把时钟系统配置好比如设置主频为 72MHz。要不要管它几乎不用。它会自动被调用你只需要知道它帮你的芯片“跑起来”了。打个比方就像你手机开机后系统自动把CPU频率调到最高——你不需要手动设置。4.stm32f10x.h项目说明通俗解释这是STM32芯片的“地图”。它定义了所有寄存器叫什么名字、在哪个地址、每个位的含义是什么。你写的RCC-APB2ENR、GPIOC-CRH这些东西都是从这个文件里来的。要不要管它不用管但要include它。你的代码里#include stm32f10x.h就是把这个“地图”拿过来用。打个比方就像你要去一个陌生的城市手里拿着一张地图。stm32f10x.h就是这张地图。第二部分User用户文件组main.c项目说明通俗解释这就是你写代码的地方。程序从main()函数开始执行你控制 LED 亮的代码就写在这里。要不要管它这是你唯一需要关心和修改的文件。打个比方就像你做饭的操作台——你站在这里操作其他东西锅、灶、调料都在旁边备好了。2.2.2魔法棒通过这个魔法棒来告诉系统所需要调用的说明的路径。设置的是整个文件的全局路径。2.3我们刚才半天干啥呢第一件事把文件拖进Target 1作用告诉编译器“我要编译这个文件”你把main.c、core_cm3.c拖进去编译器就会去编译它们把它们变成机器码。但是编译器在编译main.c的时候是一行一行读你写的代码的。第二件事设置Include Paths作用告诉编译器“如果遇到#include去哪里找那个被引用的文件”当编译器读到你写的#include stm32f10x.h时它需要打开这个文件看看里面写了什么。问题是你虽然把stm32f10x.h拖进了工程列表但编译器打开文件的时候不是从工程列表里找的而是从硬盘上的文件夹路径里找的。我用我的话总结就是将文件拖到工程列表告诉μ5要用到它们设置路径来告知μ5应该去哪里找。我已经慢慢感受到阻力了一下子觉得门槛好高甚至感觉面前就是一堵墙我连门把手都看不到。这是在干啥呢2.4.1.1我先是在第一行写了#include stm32f10x.h这是何意味这是在说“编译器大哥在正式开始翻译我的代码之前请你先打开一个叫stm32f10x.h的文件把里面所有内容复制粘贴到这一行。”它的作用呢就相当于一个导游图或者说是地名手册就比如我想去天安门我写我想去天安门【RCC-APB2ENR】但其实天安门的地址【RCC的真实地址是0x40021000】所以有了这段头文件我去天安们编译器就知道我要去哪里了。2.4.1.3第三行int main(void)从这一行开始程序正式启动了。后面用{包起来的部分就是程序要执行的步骤。这里mainMan告诉你要冲这里启动2.4.1.5这行我没写完应该是RCC-APB2ENR 0x000000102.4.1.6while(1)这东西的意思就是让程序永远执行{}中的动作比如2.4.1.7教程中的代码不想手打可以让ai整理出来今天先到这了不行了没看点已经明天了灯还没点亮…