





















单片机(Microcontroller Unit,MCU)是一块集成了中央处理器(CPU)、内存、定时器和多种输入/输出(I/O)接口的微型计算机芯片
**in short 可以理解为一个非常非常精简的小电脑,甚至于没有操作系统。当然可以移植运行一些极其精简的实时操作系统, 如: FreeRTOS、RT-Thread 等。通常这些系统具有线程、任务、内存管理,方便你开发。
采用 ARM Cortex-M 系列内核(从 M0+ 到最新的 M85),主频跨度极大(几十 MHz 到 800 MHz)。它拥有极高的运算性能和纳秒级的中断延迟,非常适合处理复杂的逻辑、电机控制和传感器融合算法。
特点是便宜,绝对的实时性(对与工业这点很重要), 开发需要非常了解硬件底层要了解 时钟树、中断、DMA、外设寄存器、开发个TCP甚至需要你自己实现..
通常是裸机运行或 FreeRTOS,适合PLC控制器、电机驱动器、工业机器人、温度调节器等,保证绝对的实时性和高可靠性。
早期 Xtensa LX6/LX7 双核架构,最新型号全面转向开源的 RISC-V 架构(如 C3/C6/P4)。其主频通常在 160MHz~400MHz 之间
**特点是原生集成 Wi-Fi 、BLE、Zigbee 自带支持协议栈 MQTT、HTTP/HTTPS、WebSocket、CoAP 等开箱即用。它开发相对简单点支持 MicroPython(可以理解为python) 脚本控制,大幅降低入门门槛。
缺点是实时性不足(Wi-Fi 协议栈会占用大量 CPU 时间,中断延迟不可预测)
架构决定了它的指令集、功耗和生态兼容性。如同桌面的端分为ARM和X86 架构 目前市场上主要分为两大阵营:
STM32 和 ESP32 中的"32",指的都是 CPU 的通用寄存器宽度为 32 位。
那就是意味着:CPU 在一个时钟周期内可以直接对 32 位数据进行运算(加减乘除、逻辑运算等)
也意味着:这个CPU能管理的内存最大能寻址 2^32 个内存单元(管理最小的内存单元是Byte),也就是 4GB(2^32 Bytes=4GB 2^32 Bytes=4 GB )。这就是为什么 32 位 Windows 电脑最多只能识别 4G 内存的原因。
嵌入式开发入门 - https://stm32f407-tech-doc.readthedocs.io/en/latest/pre/1嵌入式入门/嵌入式入门.html
波特律动 - https://docs.keysking.com/
HAL库函数速查手册 - https://docs.keysking.com/docs/stm32/HAL/
FreeRTOS极速通关 - https://docs.keysking.com/docs/stm32/freertos/course
TM32CubeMX 工程创建 - https://x509p6c8to.feishu.cn/wiki/LfMpwjktZiMAuMkayt6c0LGZnpx
https://www.keil.com/download/product/
Keil 是一款由德国 Keil 公司开发、后被美国 ARM 公司收购的嵌入式系统集成开发环境(IDE),主要用于 ARM、8051、C166 等微控制器的软件开发。在 STM32 开发领域,大家常说的"Keil"通常指的是 Keil MDK(Microcontroller Development Kit),其核心编译器为 ARMCC / ARMCLANG。
在 ARM Cortex-M 系列(如 STM32、NXP、GD32 等)开发中,Keil 是使用最广泛的 IDE 之一,尤其在工业控制、汽车电子等领域几乎是行业标杆。
但它是个收费软件,未注册时编译有 32KB 代码大小限制
工具栏上的“魔术棒”图标(Options for Target)
Use: 中,根据你实际使用的硬件选择对应的调试器。例如使用 ST-Link 就选 ST-Link Debugger,使用 J-Link 就选 J-Link / J-Trace Cortex。Settings 按钮,在弹出的窗口中:
SW (Serial Wire),这是目前最主流的调试接口。Connect: under Reset。这个选项能让调试器在芯片处于复位状态时强行建立连接,能有效解决很多因程序跑飞或低功耗模式导致的“无法连接”问题。注意该命令仅在仿真环境中有效!
KEIL 的 ASSIGN 命令本质上是在软件仿真层面进行了一次“信号劫持”或“虚拟映射”。它会将单片机内部串口(UART/USART)发出的数据,直接通过 J-Link/SWD 调试接口传输到你的电脑屏幕上,从而绕过了物理硬件引脚
在 Keil 仿真器中,单片机的串口被抽象为虚拟通道,通常支持 4 个串口:
| 单片机外设 | Keil 虚拟通道 (输入/输出) | 常用映射目标 |
|---|---|---|
| USART1 / UART1 | S0IN / S0OUT |
WIN1 或 COMx |
| USART2 / UART2 | S1IN / S1OUT |
WIN2 或 COMx |
| USART3 / UART3 | S2IN / S2OUT |
WIN3 或 COMx |
| UART4 | S3IN / S3OUT |
WIN4 或 COMx |
执行命令
调试模式下 -> View -> Command Window
如果只想在 Keil 内部直接看打印,不需要外接任何工具:
ASSIGN WIN1 <S0IN> S0OUT
ASSIGN WIN1 <S3IN> S3OUT
把 MCU 的 UART4 映射到 Keil 的 UART #1 窗口
串口重定向 debug.ini
每次进入调试都要手动敲命令很麻烦,你可以将这些命令写进一个 .ini 配置文件(例如命名为 debug.ini),然后在 Keil 中自动加载:
debug.ini 文本文件,内容如下:MODE COM2 115200,0,8,1
ASSIGN COM2 <S3IN> S3OUT
在使用
ASSIGN之前,通常需要先用MODE命令设置好电脑端串口的波特率等参数。例如:MODE COM2 115200,0,8,1(设置 COM2 波特率为 115200,无校验位,8位数据,1位停止位)
在 Keil 中点击“魔法棒” -> Debug 选项卡。
勾选右侧的 Initialization File,浏览并选中你刚刚创建的 debug.ini 文件。
这样,以后每次点击 Debug 进入仿真时,Keil 就会自动帮你执行这些映射命令了。
准备虚拟串口软件:使用如 VSPD (Virtual Serial Port Driver) 等软件,在电脑上创建一对互相连通的虚拟串口(例如创建了 COM2 <-> COM3 这一对)。
在 Keil 的 Debug (printf) Viewer 窗口中查看 printf 的输出,核心步骤是在代码中将输出重定向到 ARM Cortex-M 内核内置的 ITM(Instrumentation Trace Macrocell) 端口
fputc 到 ITM/SWO (无需额外硬件) int fputc(int ch, FILE *f)
{
ITM_SendChar((uint32_t)ch);
return ch;
}
如果你的工程中已经包含了 CMSIS 的核心头文件(如 core_cm4.h、core_cm7.h 等),也可以直接调用封装好的 ITM_SendChar(ch); 函数来代替上述的手动寄存器操作。
在芯片的默认复用功能配置(AF0)下,PB3 引脚同时具备 JTAG 调试输出(JTDO)和 SWO 跟踪输出的功能。确认该引脚已连接到 J-Link 的 SWO 脚。
勾选微库(MicroLIB):点击工具栏的魔术棒图标(Options for Target),在 Target 选项卡中,务必勾选 Use MicroLIB。这是为了让 printf 能够适配资源受限的嵌入式环境。
查看打印: 启动调试,在菜单栏选择 View -> Serial Windows -> Debug (printf) Viewer。
获取 Core Clock?
在代码中添加或找到系统全局变量 SystemCoreClock。
启动 Keil 仿真调试(Debug 模式)。
将 SystemCoreClock 添加到 Watch 1 窗口。
https://www.st.com.cn/zh/development-tools/stm32cubemx.html#tools-software
STM32CubeMX 是意法半导体(ST)官方推出的一款图形化配置工具,专门用于简化 STM32 系列芯片的开发流程。它的牛逼在于:用鼠标点选代替手动配置寄存器,并能自动生成完整的初始化 C 代码。
强烈推荐新同学, 它可以通过可以提供图形化:
J-Link 和 ST-Link 与 STM32 的通讯方式主要有两种:SWD 和 JTAG。
这两种工具本质上都是将电脑上的调试指令翻译成单片机(MCU)能听懂的电信号。目前最常用的是 SWD 模式。
ARM 公司推出的一种新型调试协议,最大的优势是极其省引脚。它只需要 2 根信号线(加上电源和地线共 4 根)就能实现完整的下载和调试功能。
SWD全称是Serial Wire Debug(串行调试),SWD模式下用JLink给我们的板子debug时,是用标准的二线DIO和CLK,RESET管脚可不接,当你频繁下载失败时,可接上RESET管脚再试。
在高速模式下,SWD比JTAG更可靠一些,常见的接线信号如下所示,根据具体情况自主选择。
SWD模式下,SWDIO的上拉电阻可预留不贴,在ST的一些MCU参考设计中,有提到建议添加,实际测试不加不影响下载。
一种标准的国际标准测试协议。它的功能非常强大,除了调试,还支持复杂的“边界扫描”测试(用于检查 PCB 板上的芯片连通性)。
JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试,现在多数的器件都支持JTAG协议,ARM、DSP、FPGA等,JTAG接口的单片机用电脑USB下载调试程序,需要用到J-Link(USB转JTAG)。
标准的JTAG是四线:TDI,TMS,TCK,TDO,分别对应数据输入,模式选择,时钟,数据输出,复位管脚可不接。
RST (nRESET) 复位引脚。
如果你的单片机代码中已经正确配置并开启了 SWD 调试功能(比如使用了 Serial Wire 模式),那么 RST 线是可以不接的,仅靠上面的 4 根线就能完美下载和调试。
如果你不小心在代码里
__HAL_AFIO_REMAP_SWJ_DISABLE(); // 关闭SWD、JTAG接口
把 SWD 调试引脚禁用了(或者配置成了普通 GPIO),导致单片机“变砖”无法连接,这时候就必须接上 RST 线。通过在复位状态下强行连接(Connect under Reset),才能重新夺回单片机的控制
短接复位
如果你的板子没有引出复位按键,就需要找到单片机芯片旁边的 复位电路。通常是一个贴片电容或贴片电阻,一端连着单片机的 NRST 引脚,另一端连着 GND(地)。
用金属镊子或一根杜邦线,短接这个复位电容/电阻的两端(也就是把 NRST 引脚强行拉低到 GND)。
修改 Keil 调试设置
Under Reset 或 with Pre-reset。在实际接线中,真正干活的通常只有以下 4 到 5 根线:
| 引脚名称 | 实际作用 | 注意 |
|---|---|---|
| GND | 共地。提供信号参考基准,消除电平偏差。 | 最容易被忽视! 如果不接 GND,通信会直接失效或极其不稳定。 |
| SWCLK | 时钟线。由 ST-Link 发出节拍,同步所有操作。 | 接反了或者虚焊,软件会提示“找不到目标设备 (Target not found)”。 |
SWDIO SWO 或 TDO |
数据线。双向传输命令和数据,读写全靠它。 | dio 和 clk容易接反! |
| V_TGT / TVCC | 电压检测。仅用于检测目标板是否有电及电平匹配。 | 严禁当作主供电引脚! 目标板已有独立电源时若强行接入,可能导致电流倒灌烧坏芯片。 |
| NRST / RESET | 复位控制。允许 ST-Link 主动重启 MCU。 | 不接的话,如果程序跑飞或关闭了调试接口,就只能手动按板子上的复位键。 |
J-Link 和 ST-Link 一样,都是连接电脑与单片机(如 STM32)的调试下载器,但它是由德国 SEGGER 公司开发的高性能通用调试探针,兼容市面上几乎所有的 ARM Cortex-M 内核芯片。
目前最主流、最推荐使用的同样是 SWD 模式,它只需要极少的几根线就能完成工作。
J-Link 通常使用标准的 10-pin (2x5) 接口,真正干活的通常只有以下 4 到 5 根线:
| 引脚名称 | 实际作用 | 注意 |
|---|---|---|
| GND | 共地。提供信号参考基准,消除电平偏差。 | 最容易被忽视! 如果不接 GND,通信会直接失效或极其不稳定。 |
| SWCLK/clk | 时钟线。由 J-Link 发出节拍,同步所有操作。 | 接反了或者虚焊,软件会提示“找不到目标设备 (Target not found)”。 |
| SWDIO/dio | 数据线。双向传输命令和数据,读写全靠它。 | dio 和 clk容易接反! |
| VTref/vt3.3 | 电压检测。仅用于检测目标板的工作电压以匹配电平。 | 严禁当作主供电引脚! 绝对不能把 5V 接到 VTref 上,否则会直接烧毁 J-Link! |
| RESET/rst | 复位控制。允许 J-Link 主动重启 MCU。 | 不接的话,如果程序跑飞或关闭了调试接口,就只能手动按板子上的复位键。 |
以最常见的 STM32 为例, 其调试引脚的复用关系如下:
| STM32 引脚 | 复用的调试功能 | 说明 |
|---|---|---|
| PA13 | SWDIO / JTMS | 在 SWD 模式下作数据线,在 JTAG 下作模式选择 |
| PA14 | SWCLK / JTCK | 在 SWD 模式下作时钟线,在 JTAG 下作时钟 |
| PA15 | JTDI | 仅在完整 JTAG 模式下作为数据输入 |
| PB3 | JTDO / TRACESWO | 在 JTAG 下作数据输出,或输出跟踪数据 |
| PB4 | NJTRST | JTAG 的复位引脚 |
| 虽然它们共用物理引脚,但不能同时激活。STM32 在上电启动时,会根据内部配置(如选项字节)自动决定这一组引脚是进入 SWD 模式、JTAG 模式,还是被释放出来当作普通的 GPIO(输入/输出)引脚使用。 |
在日常开发 STM32 时,除非有特殊的板级测试需求,否则推荐使用 SWD 通讯方式。它不仅能帮你省下宝贵的 MCU 引脚,而且接线简单(只需 4 根线),J-Link 和 ST-Link 都能完美支持
| 格式 | 扩展名 | 说明 | |
|---|---|---|---|
| 二进制文件 | .bin |
原始二进制镜像,不含地址信息,烧录时需手动指定起始地址 | |
| Intel HEX | .hex |
ASCII编码的十六进制格式,包含地址、数据和校验信息,可读性强 | |
| ELF文件 | .elf |
可执行与可链接格式,包含完整的符号表、调试信息和段信息 | |
| AXF文件 | .axf |
ARM编译器生成的可执行格式,本质上是ELF的变种 | |
| OUT文件 | .out |
编译器输出的可执行文件格式 | |
| S-Record | .srec / .s19 |
摩托罗拉S-record格式,类似HEX的ASCII编码格式 | |
0x08000000)。.elf 文件。https://www.st.com/en/development-tools/stsw-link004.html
STM32 ST-LINK Utility 是意法半导体(ST)官方推出的一款轻量级图形化烧录工具,专用于 STM32 系列微控制器的 Flash 编程与调试辅助。它独立于 Keil、IAR 等大型 IDE,可以直接加载编译好的固件文件完成烧录。
ST 官方目前已将开发重心转向新一代工具 STM32CubeProgrammer,它支持更多文件格式(.elf、.axf、.srec 等)、跨平台(Windows/Linux/macOS),并提供图形界面和命令行两种模式。不过 ST-LINK Utility 因其轻量、简洁的特点,在研发调试和简单烧录场景中仍然被广泛使用。
**连接芯片
Target → Connect,与 STM32 芯片建立连接读取芯片内存
Target → Read Memory0x08000000(STM32 Flash 起始地址)保存为文件
File → Save As命令脚本烧录
"C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe" -c SWD UR -P "E:\workspace\embedded\lora-gateway\lora-gateway-eth\Project\Objects\demo.hex" -V -Rst
https://www.st.com/en/development-tools/stm32cubeprog.html
ST-LINK 或 J-LINK)。Reset mode(复位模式) 选项。Software system reset 修改为 Hardware reset 或 Connect under reset。Connect 按钮。此时软件会自动控制调试器的 NRST 引脚来复位芯片并建立连接。Memory & File editing(内存和文件编辑)图标(通常是一个类似内存条的图标)。Memory 选项卡被选中。0x08000000。0x40000 字节;或者直接在 Size 框里输入十进制的 262144)。Read 按钮。此时,软件会将芯片 Flash 中的数据读取出来,并在下方的十六进制编辑器中显示。Save as(另存为)按钮。Binary,并将其命名为例如 firmware_backup.bin,点击保存即可。注意备份选项字节(Option Bytes)
OB(Option Bytes)图标。.bin 后,需要在这里把参数改成一模一样的并点击 Apply 写入。先把芯片的“底层配置”恢复回去,这样能确保烧录固件时的运行环境(如启动模式、看门狗、读写保护等)与之前完全一致。
OB(Option Bytes)图标。-ob displ 命令备份了配置代码,可以直接在 Erasing & Programming 界面的 Automatic Mode(自动化模式)下的 Option bytes commands 输入框中,粘贴那行命令(例如 -ob rdp=0xAA bor_lel=0...),点击运行即可一键还原。Apply 按钮。配置环境就绪后,就可以把备份的程序代码写回芯片了。
Erasing & Programming(擦除与编程)图标。Browse,选择你之前备份的固件文件(.bin 或 .hex)。.hex 文件,地址会自动识别;如果是 .bin 文件,务必手动填入起始地址 0x08000000。Full chip erase(整片擦除,确保没有旧数据干扰)和 Verify programming(编程后校验,确保烧录万无一失)。Start Programming 按钮。https://www.segger.com/downloads/jlink/
J-Flash 是德国 SEGGER 公司开发的一款专业级 Flash 编程与固件烧录工具,作为 J-Link 调试器配套软件包(J-Link Software and Documentation Pack)的一部分发布,广泛应用于 ARM Cortex-M 系列 MCU 的研发调试和量产烧录场景
Target → Select Target 选择芯片型号Target → Connect 连接芯片File → Open data file 加载固件Target → Program & Verify 开始烧录File -> New Project。在弹出的设备选择框中,厂商(Manufacturer)选择 STMicroelectronics,设备(Device)找到并选择你的芯片型号 STM32F407ZGT6,点击 OK。Target -> Connect(或直接按快捷键 F2)。如果连接成功,软件底部的日志窗口会提示 "Connected",并显示出芯片的 Flash 大小、内核等信息。Target -> Read back -> Entire chip(读取整个芯片的 Flash 内容)。File -> Save data file as...。字节选项
0x1FFFF800 或 0x1FFFC0000x1FFFF800File → Save data file as... 保存该地址范围的数据此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。