1. 课程导学与开发环境搭建
各位同学好,我是你们的讲师。做嵌入式这些年,从8位单片机一路折腾到Cortex-M内核,踩过的坑确实不少。今天咱们开始这门《FreeRTOS移植与Bootloader升级实战》的第一章。
说实话,很多初学者一上来就盯着RTOS的API啃,或者直接抄Bootloader代码。结果呢?移植完跑不起来,升级程序一刷就变砖。我当年也干过这种事——熬夜到凌晨三点,发现是时钟配置错了。所以这一章,咱们先把地基打牢。
1.1 课程目标与学习路径
这门课不是讲理论,是讲实战。30章内容,我把它分成三个大块:
| 阶段 | 核心目标 | 你将会掌握 |
|---|---|---|
| 基础篇(第1-10章) | 环境搭建 + FreeRTOS移植 | 从零搭建工程,跑通第一个任务 |
| 进阶篇(第11-20章) | 内核机制 + 中间件集成 | 任务调度、队列、信号量、软件定时器 |
| 实战篇(第21-30章) | Bootloader + OTA升级 | 分区管理、固件校验、远程升级 |
我个人建议的学习路径是这样的:先跟着我把环境搭好,然后每个实验都亲手敲一遍代码。别光看,看十遍不如自己写一遍。我在项目中带过不少新人,凡是动手快的,两周就能上手;光看不练的,三个月还在问printf为什么没输出。
学习建议:每章结束后,花15分钟整理自己的笔记。把踩过的坑、想不通的点记下来。这门课的所有代码我都会提供,但请一定自己敲一遍。
1.2 硬件平台介绍:STM32F407
为什么选STM32F407?说白了,这颗芯片是嵌入式界的"万金油"。Cortex-M4内核带FPU,主频168MHz,1MB Flash,192KB SRAM。你想想看,跑FreeRTOS绰绰有余,做Bootloader也有足够的空间折腾。
咱们课程用的是正点原子探索者开发板,核心资源如下:
| 外设 | 型号/规格 | 课程用途 |
|---|---|---|
| 主控 | STM32F407ZGT6 | 运行FreeRTOS + Bootloader |
| Flash | 1MB(内部) | 固件存储、分区管理 |
| SRAM | 192KB(内部) | 任务栈、堆空间 |
| 串口 | USART1/2/3 | 调试输出、YModem升级 |
| SPI Flash | W25Q128(16MB) | 固件备份、OTA存储 |
| LED/按键 | 4个LED + 4个按键 | 任务状态指示、交互控制 |
如果你用的是其他F4开发板,问题不大。只要主控是STM32F4系列,代码稍作修改就能跑。我在项目中就经常在不同板子间移植,核心逻辑基本不变。
小提示:第一次拿到开发板,先别急着写代码。用官方例程点个灯,确认板子能正常工作。这一步能帮你排除硬件故障,省下后面排查问题的时间。
1.3 开发工具链安装
工欲善其事,必先利其器。咱们课程提供两套工具链,你选一套就行。
1.3.1 Keil MDK
Keil MDK是ARM开发的老牌工具,我用了快十年。优点是编译快、调试方便;缺点是收费,不过社区版够用。
安装步骤:
- 从ARM官网下载MDK-Arm安装包(当前推荐5.38或以上版本)
- 运行安装程序,一路Next
- 安装器件支持包:打开Pack Installer,搜索STM32F4,安装对应DFP
- 注册:社区版有32KB代码限制,咱们课程代码不大,够用
注意:安装路径不要有中文!不要有空格!我见过有人把Keil装到"Program Files (x86)"里,结果编译某些库时报路径错误。建议直接装到 C:\Keil_v5。
1.3.2 STM32CubeIDE
如果你喜欢开源工具,STM32CubeIDE是更好的选择。基于Eclipse + GCC,免费,而且集成了CubeMX配置工具。
安装步骤:
- 从ST官网下载STM32CubeIDE安装包
- 解压后运行安装程序
- 选择工作空间路径(同样不要中文)
- 首次启动会自动下载GCC工具链,等它完成就行
我个人习惯是:Keil用于调试和教学,CubeIDE用于项目原型开发。两个工具各有优势,你选一个顺手的就行。
1.4 调试工具:J-Link vs ST-Link
调试工具是嵌入式开发的"听诊器"。没有它,你只能靠printf猜问题。有了它,你能看到寄存器值、变量变化、任务切换过程。
| 特性 | J-Link(SEGGER) | ST-Link(ST官方) |
|---|---|---|
| 速度 | 最高50MHz(SWD) | 最高4MHz(SWD) |
| 调试功能 | 全功能(断点、单步、RTT) | 基础功能(断点、单步) |
| 价格 | 教育版约200元 | 开发板自带 |
| 推荐场景 | 项目开发、性能调试 | 学习、基础调试 |
咱们课程用ST-Link就足够了。开发板上有板载ST-Link,插上USB线就能用。如果你用J-Link,记得在Keil里把调试器改成J-Link。
调试技巧:第一次连接时,打开Keil的"Debug"选项卡,点击"Settings"。如果能读到IDCODE,说明连接成功。如果读不到,检查接线:SWDIO、SWCLK、GND三根线必须接对。我曾经因为SWDIO虚焊,折腾了一下午才发现。
1.5 知识体系总览
下面这张图,是我画的本课程知识体系。你可以把它当作学习地图,每学完一章,回来看看自己走到了哪里。
1.6 第一个实验:点亮LED
环境搭好了,咱们来跑第一个程序。这个实验很简单:用GPIO点亮板子上的LED。但别小看它,这是验证整个工具链是否正常的"试金石"。
代码很简单:
#include "stm32f4xx.h"
void delay(volatile uint32_t count) {
while(count--);
}
int main(void) {
// 使能GPIO时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN;
// 配置PF9为推挽输出
GPIOF->MODER |= GPIO_MODER_MODER9_0;
GPIOF->OTYPER &= ~GPIO_OTYPER_OT_9;
while(1) {
GPIOF->BSRR = GPIO_BSRR_BS_9; // 点亮LED
delay(500000);
GPIOF->BSRR = GPIO_BSRR_BR_9; // 熄灭LED
delay(500000);
}
}
编译下载后,如果LED以大约1秒的频率闪烁,恭喜你,环境搭建成功!
常见问题:如果LED不亮,先检查GPIO引脚号。不同开发板的LED引脚不同。正点原子探索者用的是PF9和PF10。如果你用的是其他板子,查一下原理图,改引脚号就行。