1. 课程导学与开发环境搭建

各位同学,欢迎来到这门实战课。我是你们的老朋友,一个在嵌入式圈子里摸爬滚打了十几年的工程师。今天咱们正式开始第一讲——先把路铺好,把工具备齐。

说实话,我见过太多人一上来就急着写代码,结果卡在环境配置上半天搞不定。磨刀不误砍柴工,咱们先把基础打牢。

1.1 这门课到底讲什么?

简单说,就是教你用 FreeRTOS 去驱动 STM32 的各种外设。不是纯理论,也不是纯应用,而是把两者拧在一起。

我当年刚接触 RTOS 时,总觉得它很神秘。后来发现,说白了就是个任务调度器。但怎么用好它,怎么跟硬件打交道,这里面的坑可不少。

课程核心目标:

  • 掌握 FreeRTOS 内核机制(任务、队列、信号量、中断管理)
  • 学会在 RTOS 环境下驱动 GPIO、UART、I2C、SPI、ADC、定时器等外设
  • 能独立完成一个带 RTOS 的嵌入式项目

1.2 学习路径怎么走?

我把课程分成了三个阶段,你跟着走就行。

阶段 内容 目标
基础篇(第1-10章) 环境搭建、FreeRTOS 移植、任务管理、队列、信号量 能跑通第一个 RTOS 工程
进阶篇(第11-20章) 外设驱动 + RTOS 整合(UART、I2C、SPI、ADC) 能独立编写驱动代码
实战篇(第21-30章) 综合项目:传感器采集、数据显示、通信协议 能完成完整产品原型

我个人建议,别跳着学。基础篇虽然简单,但很多坑都在那里埋着。比如任务优先级设置不当,系统直接卡死——我当年就吃过这个亏。

1.3 开发环境搭建

工欲善其事,必先利其器。咱们用两套工具:STM32CubeMX 做初始化配置,Keil MDK 写代码调试。

1.3.1 STM32CubeMX 安装

这个工具是 ST 官方的图形化配置软件。你点点鼠标,它就能生成初始化代码。省去了手动写寄存器配置的麻烦。

  1. 去 ST 官网下载 STM32CubeMX(需要注册账号)
  2. 安装时选默认路径就行
  3. 安装完成后,打开软件,它会提示你安装固件包
  4. 选择你用的芯片型号(比如 STM32F103C8T6)

小技巧: 固件包下载可能比较慢。我一般晚上挂机下载,第二天早上就好了。别急,这一步急不来。

1.3.2 Keil MDK 安装

Keil MDK 是 ARM 的集成开发环境。咱们用它来编译、下载、调试代码。

  1. 下载 Keil MDK-ARM(建议用 5.38 或更新版本)
  2. 安装时勾选所有组件
  3. 安装完成后,需要注册(你懂的)
  4. 安装对应芯片的器件包(STM32F1 系列用 Keil.STM32F1xx_DFP)

注意: 安装路径不要有中文!不要有空格!我见过有人因为路径里有“新建文件夹”导致编译报错,折腾了一下午。

1.4 FreeRTOS 简介

FreeRTOS 是个开源的实时操作系统。小、轻、快,非常适合单片机。

你想想看,裸机编程就像只有一个厨师在厨房里干活。他得自己切菜、炒菜、洗碗,忙得团团转。而 RTOS 就像请了个厨师长,他能同时安排多个厨师干活——一个切菜,一个炒菜,一个洗碗。这就是多任务。

1.4.1 FreeRTOS 的核心概念

概念 说明 类比
任务(Task) 独立的执行线程 每个厨师负责一道菜
队列(Queue) 任务间传递数据 传菜窗口
信号量(Semaphore) 同步或互斥访问资源 厨房里唯一的一把刀
中断管理 处理硬件事件 火警响了,所有人停下手里的活

嗯,这里要注意:RTOS 不是万能的。它适合任务多、实时性要求高的场景。如果只是点个灯、读个按键,裸机反而更简单。

1.4.2 FreeRTOS 的调度方式

FreeRTOS 默认用抢占式调度。什么意思?高优先级的任务可以打断低优先级的任务。就像急诊病人来了,普通门诊得让路。

我曾经在一个项目里,把两个任务的优先级设反了。结果低优先级的任务一直抢不到 CPU,系统直接“假死”。排查了半天才发现是优先级的问题。从那以后,我每次设优先级都会再三确认。

1.5 本章知识体系

下面这张图,把咱们第一章的核心内容串起来了。你保存好,后面学习时随时回来看。

第一章知识体系图 第一章:课程导学与开发环境搭建 课程目标与学习路径 开发环境搭建 FreeRTOS 简介 RTOS 内核机制 外设驱动开发 STM32CubeMX Keil MDK 任务与调度 队列与信号量 本章是基础中的基础 环境搭好了,后面才能跑得快 基础篇(第1-10章) 进阶篇(第11-20章) 实战篇(第21-30章)

1.6 第一个工程:点亮 LED

理论说完了,咱们动手。用 CubeMX 生成一个工程,让 LED 闪烁。这是嵌入式界的“Hello World”。

  1. 打开 CubeMX,新建工程,选择芯片型号
  2. 配置 GPIO:选一个引脚作为输出,比如 PA5
  3. 配置时钟:用内部 HSI 或外部晶振
  4. 生成代码,用 Keil 打开
  5. 在 main 函数里写:HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);

避坑指南: 我第一次用 CubeMX 时,忘了配置时钟树。结果芯片跑在默认的 8MHz,LED 闪得跟快进似的。后来才意识到,时钟配置是第一步。

好了,第一章就到这里。工具装好了,环境搭好了,第一个工程也跑通了。后面咱们就开始正式进入 FreeRTOS 的世界。