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开发的老牌工具,我用了快十年。优点是编译快、调试方便;缺点是收费,不过社区版够用。

安装步骤:

  1. 从ARM官网下载MDK-Arm安装包(当前推荐5.38或以上版本)
  2. 运行安装程序,一路Next
  3. 安装器件支持包:打开Pack Installer,搜索STM32F4,安装对应DFP
  4. 注册:社区版有32KB代码限制,咱们课程代码不大,够用

注意:安装路径不要有中文!不要有空格!我见过有人把Keil装到"Program Files (x86)"里,结果编译某些库时报路径错误。建议直接装到 C:\Keil_v5。

1.3.2 STM32CubeIDE

如果你喜欢开源工具,STM32CubeIDE是更好的选择。基于Eclipse + GCC,免费,而且集成了CubeMX配置工具。

安装步骤:

  1. 从ST官网下载STM32CubeIDE安装包
  2. 解压后运行安装程序
  3. 选择工作空间路径(同样不要中文)
  4. 首次启动会自动下载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 知识体系总览

下面这张图,是我画的本课程知识体系。你可以把它当作学习地图,每学完一章,回来看看自己走到了哪里。

课程知识体系总览 基础篇 环境搭建 + FreeRTOS移植 进阶篇 内核机制 + 中间件集成 实战篇 Bootloader + OTA升级 Keil/CubeIDE + ST-Link FreeRTOS 移植与配置 任务调度与优先级 队列/信号量/互斥量 Flash分区与固件管理 YModem/OTA升级协议 每章包含:理论讲解 + 代码实战 + 避坑指南 建议按顺序学习,不要跳章

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。如果你用的是其他板子,查一下原理图,改引脚号就行。