第1章:在 Ubuntu 上点亮你的第一盏 STM32 LED
教程系列《Ubuntu 上做 STM32 开发》 本章目标✅ 完成 STM32 裸机开发环境的配置基于 Ubuntu✅ 用 VSCode 编写、编译、烧录、调试代码✅ 点亮 BluePill 板载 LEDPC13✅ 全程只使用开源工具 所需工具硬件准备BluePillSTM32F103C8T6ST-Link调试器USB 数据线软件准备Ubuntu 系统sudo apt update sudo apt install gcc-arm-none-eabi gdb-multiarch openocd build-essentialVSCode 插件Cortex-DebugSerial MonitorC/C Extension PackST-Link udev 规则配置echo SUBSYSTEMusb, ATTR{idVendor}0483, ATTR{idProduct}3748, MODE0666 | \ sudo tee /etc/udev/rules.d/49-stlinkv2.rules sudo udevadm control --reload-rules sudo udevadm trigger 项目结构bluepill_blink/ ├── main.c ├── startup.s ├── linker.ld ├── Makefile └── .vscode/ ├── launch.json └── tasks.json main.c点灯代码#define RCC_APB2ENR (*(volatile unsigned int*)0x40021018) #define GPIOC_CRH (*(volatile unsigned int*)0x40011004) #define GPIOC_ODR (*(volatile unsigned int*)0x4001100C) void delay(volatile int t) { while (t--); } int main(void) { RCC_APB2ENR | (1 4); // Enable GPIOC clock GPIOC_CRH ~(0xF 20); // Clear PC13 config GPIOC_CRH | (0x2 20); // Output push-pull, 2MHz while (1) { GPIOC_ODR ^ (1 13); // Toggle PC13 delay(500000); } } startup.s启动文件.syntax unified .cpu cortex-m3 .thumb .global _start .global Reset_Handler .extern _estack .section .isr_vector, a, %progbits .word _estack // Initial Stack Pointer .word Reset_Handler // Reset Handler .section .text .type Reset_Handler, %function Reset_Handler: ldr sp, _estack // 初始化堆栈 bl main // 跳转到 C 入口 b . // 死循环防止退出 .size Reset_Handler, . - Reset_Handler linker.ld链接脚本/* 必须放在开头 */ ENTRY(Reset_Handler) MEMORY { FLASH (rx) : ORIGIN 0x08000000, LENGTH 64K RAM (rwx) : ORIGIN 0x20000000, LENGTH 20K } /* 一定要按照下面顺序 */ SECTIONS { /* 启动向量表 */ .isr_vector : { KEEP(*(.isr_vector)) } FLASH /* 代码段 */ .text : { *(.text*) /* 代码 */ *(.rodata*) /* 只读数据 */ } FLASH /* 初始化数据段 */ .data : AT (ADDR(.text) SIZEOF(.text)) { *(.data*) } RAM /* 零初始化变量 */ .bss : { *(.bss*) *(COMMON) } RAM /* 栈空间 */ .stack (COPY) : { *(.stack) } RAM /* 明确告诉链接器 _estack 是 RAM 的末尾 */ _estack ORIGIN(RAM) LENGTH(RAM); } Makefile构建与烧录TARGET main CPU -mcpucortex-m3 FPU FLOAT-ABI MCU $(CPU) -mthumb $(FPU) $(FLOAT-ABI) C_SOURCES main.c ASM_SOURCES startup_stm32f103c8t6.s OBJS $(C_SOURCES:.c.o) $(ASM_SOURCES:.s.o) LDSCRIPT linker.ld CC arm-none-eabi-gcc AS arm-none-eabi-as LD arm-none-eabi-ld OBJCOPY arm-none-eabi-objcopy OBJDUMP arm-none-eabi-objdump GDB arm-none-eabi-gdb CFLAGS $(MCU) -Wall -O0 -g -nostdlib -nostartfiles LDFLAGS -T $(LDSCRIPT) all: $(TARGET).elf %.o: %.c $(CC) $(CFLAGS) -c $ -o $ %.o: %.s $(CC) $(CFLAGS) -c $ -o $ $(TARGET).elf: $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $ $(LDFLAGS) $(OBJCOPY) -O ihex $ $(TARGET).hex $(OBJCOPY) -O binary $ $(TARGET).bin $(OBJDUMP) -D $ $(TARGET).lst flash: $(TARGET).elf openocd -f interface/stlink.cfg -f target/stm32f1x.cfg \ -c program $(TARGET).elf verify reset exit clean: rm -f *.o *.elf *.hex *.bin *.lst VSCode 调试配置launch.json{ version: 0.2.0, configurations: [ { name: Debug STM32 (BluePill), type: cortex-debug, request: launch, servertype: openocd, cwd: ${workspaceRoot}, executable: main.elf, device: STM32F103C8, configFiles: [ interface/stlink.cfg, target/stm32f1x.cfg ], runToEntryPoint: main, svdFile: ${workspaceRoot}/STM32F103.svd, preLaunchTask: build } ] }tasks.json{ version: 2.0.0, tasks: [ { label: build, type: shell, command: make, problemMatcher: [$gcc] } ] } 编译 烧录命令示例make # 编译生成 main.elf make flash # 使用 openocd 烧录并复位你应该可以看到板子上PC13连接LED开始闪烁了✅ 本章回顾你已经完成了在 Ubuntu 系统下搭建了完整 STM32 开发链路从零手写裸机程序点亮 PC13 上的 LED使用 VSCode 调试器完成编译、烧录、单步执行你现在真正掌握了裸机开发流程而不是“只会拉图”。下一章我们将加上 UART 输出让 STM32 “说话”。

相关新闻

如何为 Medusa 快速完成移动支付集成:从支付宝到微信支付的实战指南

如何为 Medusa 快速完成移动支付集成:从支付宝到微信支付的实战指南

如何为 Medusa 快速完成移动支付集成:从支付宝到微信支付的实战指南 【免费下载链接】medusa The worlds most flexible commerce platform for agents and developers 项目地址: https://gitcode.com/GitHub_Trending/me/medusa 如果你的线上商城正准备面向…

2026/8/19 20:40:39 阅读更多 →
Rabel 签到与银币积分系统怎么玩?激励社区活跃度的完整解析

Rabel 签到与银币积分系统怎么玩?激励社区活跃度的完整解析

Rabel 签到与银币积分系统怎么玩?激励社区活跃度的完整解析 【免费下载链接】rabel An open-source web forum built on the Ruby on Rails framework. 项目地址: https://gitcode.com/gh_mirrors/ra/rabel Rabel 签到与银币积分系统,是这款基于 …

2026/8/19 20:39:39 阅读更多 →
MediaBrowser 全解析:Swift 6 打造 iOS 照片视频浏览器的终极指南

MediaBrowser 全解析:Swift 6 打造 iOS 照片视频浏览器的终极指南

MediaBrowser 全解析:Swift 6 打造 iOS 照片视频浏览器的终极指南 【免费下载链接】MediaBrowser 🏞 A simple iOS photo and video browser with optional grid view, captions and selections written in Swift5.0 项目地址: https://gitcode.com/gh…

2026/8/21 2:13:24 阅读更多 →

最新新闻

华为OD机试:黑白棋合法移动算法实现与优化

华为OD机试:黑白棋合法移动算法实现与优化

1. 项目背景与问题定义黑白棋(又称翻转棋)是一种经典的策略性棋盘游戏,在华为OD机试中常作为考察编程能力的题目出现。这类题目通常要求考生在NN的棋盘上模拟棋子移动规则,并计算特定条件下的合法移动范围。这个问题的核心在于理解…

2026/8/21 4:53:47 阅读更多 →
深度解析QCA8334-AL3C:高通4端口工业级千兆二层交换芯片架构与应用

深度解析QCA8334-AL3C:高通4端口工业级千兆二层交换芯片架构与应用

QCA8334-AL3C:高通4端口二层千兆以太网交换芯片深度解析 在工业交换机、企业级网关以及物联网边缘设备等网络硬件设计中,以太网交换芯片的选择直接决定了整机的端口密度、转发性能以及长期可靠性。传统的软件桥接方案在带宽和延迟方面存在明显瓶颈&…

2026/8/21 4:53:47 阅读更多 →
深度解析88E6390-A0-TLA2I000:Marvell 11端口工业级TSN千兆交换芯片架构与应用

深度解析88E6390-A0-TLA2I000:Marvell 11端口工业级TSN千兆交换芯片架构与应用

88E6390-A0-TLA2I000:Marvell工业级11端口千兆以太网交换芯片深度解析在企业级接入交换机、工业以太网设备以及需要确定性通信的嵌入式网络系统中,以太网交换芯片的选型直接决定了网络的带宽、时延和长期可靠性。传统消费级交换芯片在宽温支持和时间敏感…

2026/8/21 4:53:47 阅读更多 →
基于LLM多智能体的遗留代码现代化迁移:从PL/SQL到Java的实战解析

基于LLM多智能体的遗留代码现代化迁移:从PL/SQL到Java的实战解析

1. 从“屎山”到“新大陆”:为什么我们需要智能的遗留代码翻译最近在跟一个做金融系统的朋友聊天,他愁眉苦脸地跟我抱怨,说他们核心系统里还有一大堆十几年前写的PL/SQL存储过程,逻辑复杂得像一团乱麻,没人敢动。想迁移…

2026/8/21 4:53:47 阅读更多 →
基于STM32与PID算法的闭环张力控制系统设计与仿真实践

基于STM32与PID算法的闭环张力控制系统设计与仿真实践

你有没有遇到过这样的场景:一个看似简单的机械控制项目,比如给桂皮剥皮,当你真正动手用单片机去实现时,却发现最核心、最折磨人的不是写代码,也不是画电路,而是如何让一根拉线的张力“听话”。你可能已经搭…

2026/8/21 4:53:46 阅读更多 →
卡尔曼滤波算法原理与Python实战:从状态估计到多传感器融合

卡尔曼滤波算法原理与Python实战:从状态估计到多传感器融合

在目标跟踪、传感器融合、自动驾驶和机器人导航等领域,我们常常面临一个核心挑战:如何从充满噪声的观测数据中,准确估计出系统的真实状态?无论是GPS定位的漂移、雷达测距的误差,还是摄像头识别的抖动,噪声无…

2026/8/21 4:52:46 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →