127 lines
9.6 KiB
Markdown
127 lines
9.6 KiB
Markdown
# 06-STM32与RTOS基础
|
||
|
||
> 资料源: [`1-程序源码_教程文档/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/) (野火系列)
|
||
|
||
---
|
||
|
||
## 一、这些资料是什么?
|
||
|
||
这部分是野火(EmbedFire)出品的 STM32 系列教程,在正点原子 ATK-DLRK356X 的资料盘中一并提供。虽然目标 MCU 是 STM32F4,但**嵌入式通用概念适用于任何平台**。
|
||
|
||
---
|
||
|
||
## 二、核心教程清单
|
||
|
||
### 2.1 HAL 库基础
|
||
|
||
```
|
||
路径: [`1-程序源码_教程文档/1-[野火]《STM32 HAL库开发实战指南》/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/1-%5B%E9%87%8E%E7%81%AB%5D%E3%80%8ASTM32%20HAL%E5%BA%93%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E3%80%8B/)
|
||
|
||
PDF: [`[野火EmbedFire]《STM32 HAL库开发实战指南——基于野火F4系列开发板》—20220913.pdf`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/1-%5B%E9%87%8E%E7%81%AB%5D%E3%80%8ASTM32%20HAL%E5%BA%93%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E3%80%8B/%5B%E9%87%8E%E7%81%ABEmbedFire%5D%E3%80%8ASTM32%20HAL%E5%BA%93%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E2%80%94%E2%80%94%E5%9F%BA%E4%BA%8E%E9%87%8E%E7%81%ABF4%E7%B3%BB%E5%88%97%E5%BC%80%E5%8F%91%E6%9D%BF%E3%80%8B%E2%80%9420220913.pdf)
|
||
|
||
→ 覆盖: GPIO / EXTI / USART / SPI / I2C / ADC / DAC / TIM / PWM / DMA / FSMC / SDIO
|
||
```
|
||
|
||
**这对你有什么用?**
|
||
|
||
虽然你用的是 Linux,但理解外设的硬件工作原理很重要:
|
||
- STM32 的 SPI → 和 RK3568 的 SPI 本质上是一样的(MISO/MOSI/SCK/CS)
|
||
- STM32 的 CAN → 原理和 RK3568 CAN 一样,差别在于 Linux 有 SocketCAN 抽象层
|
||
- HAL 库的"结构体配置外设"模式 → 和 Linux DTS 的"设备树配置外设"思路一致,形式不同
|
||
|
||
### 2.2 RTOS 三部曲
|
||
|
||
| RTOS | PDF | 核心概念 |
|
||
|------|------|------|
|
||
| **FreeRTOS** | [`[野火®]《FreeRTOS 内核实现与应用开发实战—基于STM32》.pdf`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/%5B%E9%87%8E%E7%81%AB%C2%AE%5D%E3%80%8AFreeRTOS%20%E5%86%85%E6%A0%B8%E5%AE%9E%E7%8E%B0%E4%B8%8E%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E2%80%94%E5%9F%BA%E4%BA%8ESTM32%E3%80%8B.pdf) | 任务、队列、信号量、互斥锁、软件定时器、内存管理 |
|
||
| **uCOS-III** | [`[野火®]《uCOS-III内核实现与应用开发实战指南—基于STM32》.pdf`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/%5B%E9%87%8E%E7%81%AB%C2%AE%5D%E3%80%8AuCOS-III%E5%86%85%E6%A0%B8%E5%AE%9E%E7%8E%B0%E4%B8%8E%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E2%80%94%E5%9F%BA%E4%BA%8ESTM32%E3%80%8B.pdf) | 任务调度、时间管理、中断管理、就绪列表 |
|
||
| **RT-Thread** | [`[野火®]《RT-Thread 内核实现与应用开发实战—基于STM32》.pdf`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/%5B%E9%87%8E%E7%81%AB%C2%AE%5D%E3%80%8ART-Thread%20%E5%86%85%E6%A0%B8%E5%AE%9E%E7%8E%B0%E4%B8%8E%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E2%80%94%E5%9F%BA%E4%BA%8ESTM32%E3%80%8B.pdf) | 线程、IPC、设备驱动框架、FinSH 控制台 |
|
||
|
||
**为什么你应该至少学一种 RTOS?**
|
||
|
||
你的 CAN 协议栈最核心的部分(帧收发、超时管理、命令重发)就是 RTOS 经典问题的翻版:
|
||
- CAN 帧接收 → RTOS 中断服务 + 队列
|
||
- 命令超时重发 → RTOS 软件定时器
|
||
- 收发线程分离 → RTOS 任务间通信
|
||
- 信号表读写互斥 → RTOS 互斥锁
|
||
|
||
在 STM32 上理解这些概念,然后移植到 Linux `pthread` / `timerfd` / `eventfd` 上,会非常顺畅。
|
||
|
||
### 2.3 网络协议栈
|
||
|
||
```
|
||
路径: [`1-程序源码_教程文档/7-[野火]《LwIP应用开发实战指南》/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/7-%5B%E9%87%8E%E7%81%AB%5D%E3%80%8ALwIP%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E3%80%8B/)
|
||
PDF: [`[野火]《LwIP应用开发实战指南—基于野火 STM32 全系列(M4-M7)开发板》.pdf`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/1-%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E6%95%99%E7%A8%8B%E6%96%87%E6%A1%A3/7-%5B%E9%87%8E%E7%81%AB%5D%E3%80%8ALwIP%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E3%80%8B/%5B%E9%87%8E%E7%81%AB%5D%E3%80%8ALwIP%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E2%80%94%E5%9F%BA%E4%BA%8E%E9%87%8E%E7%81%AB%20STM32%20%E5%85%A8%E7%B3%BB%E5%88%97%EF%BC%88M4-M7%EF%BC%89%E5%BC%80%E5%8F%91%E6%9D%BF%E3%80%8B.pdf)
|
||
|
||
→ 覆盖: TCP/IP 栈原理、socket API、HTTP/MQTT 应用、Wireshark 抓包分析
|
||
```
|
||
|
||
LwIP 是嵌入式 TCP/IP 实现。理解它有助于理解:
|
||
- 你的 CAN 数据如果要上 MQTT,TCP 层的重传/拥塞控制如何影响时效
|
||
- Wireshark 抓包分析技能(对 CAN 调试同样适用——`candump -l` 生成的日志就是 CAN 的总线抓包)
|
||
|
||
### 2.4 其他指南
|
||
|
||
| 书籍 | 能学到什么 |
|
||
|------|------|
|
||
| 《RT-Thread 内核实现》 | 设备驱动框架——如何用 C 语言实现面向对象风格的驱动,类似 Linux 的 `file_operations` |
|
||
| 《LiteOS开发实战》 | 华为物联网 OS,了解轻量级 IPC (LiteIPC) |
|
||
| 《emWin实战指南》 | 嵌入式 GUI,可选了解 |
|
||
| 《电机应用开发实战指南》 | BLDC/PMSM FOC 控制、编码器、电流采样 |
|
||
|
||
---
|
||
|
||
## 三、配套模块资料
|
||
|
||
```
|
||
路径: [`4-配套模块资料/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/)
|
||
```
|
||
|
||
- [`ADC_DAC模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/ADC_DAC%E6%A8%A1%E5%9D%97/) -- AD5689 (DAC) + AD7192 (ADC) 驱动源码
|
||
- [`DAP下载器/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/DAP%E4%B8%8B%E8%BD%BD%E5%99%A8/) -- Cortex-M 仿真器使用
|
||
- [`GSM模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/GSM%E6%A8%A1%E5%9D%97/) -- AT指令控制
|
||
- [`MP3模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/MP3%E6%A8%A1%E5%9D%97/) -- VS1053 音频解码
|
||
- [`WiFi模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/WiFi%E6%A8%A1%E5%9D%97/) -- ESP8266 AT指令
|
||
- [`传感器模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/%E4%BC%A0%E6%84%9F%E5%99%A8%E6%A8%A1%E5%9D%97/) -- 温湿度/光照/烟雾/红外/超声波
|
||
- [`定位模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/%E5%AE%9A%E4%BD%8D%E6%A8%A1%E5%9D%97/) -- GPS/北斗
|
||
- [`屏幕模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/%E5%B1%8F%E5%B9%95%E6%A8%A1%E5%9D%97/) -- TFT LCD / OLED 驱动
|
||
- [`摄像头模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/%E6%91%84%E5%83%8F%E5%A4%B4%E6%A8%A1%E5%9D%97/) -- OV2640/OV5640 DCMI 接口
|
||
- [`蓝牙模块/`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/A%E7%9B%98%EF%BC%88%E8%B5%84%E6%96%99%E7%9B%98%EF%BC%89/4-%E9%85%8D%E5%A5%97%E6%A8%A1%E5%9D%97%E8%B5%84%E6%96%99/%E8%93%9D%E7%89%99%E6%A8%A1%E5%9D%97/) -- HC-05 串口蓝牙
|
||
|
||
---
|
||
|
||
## 四、学习路径建议
|
||
|
||
### 路径A:快速补课(定向学)
|
||
|
||
```
|
||
1. 只看 FreeRTOS 一本 (1周) → 会任务/队列/定时器
|
||
2. 写一个 "FreeRTOS 任务 + 软件定时器 + 队列" 的小项目
|
||
3. 回到 RK3568,用 pthread + timerfd 复现相同逻辑
|
||
```
|
||
|
||
### 路径B:系统学(2-3个月)
|
||
|
||
```
|
||
1. HAL库基础 (2周) → 裸机外设
|
||
2. FreeRTOS (3周) → 任务调度 + IPC
|
||
3. RT-Thread (2周) → 设备框架 + 驱动模型
|
||
4. LwIP (2周) → 网络协议栈
|
||
5. 电机开发 (2周) → 可选
|
||
```
|
||
|
||
---
|
||
|
||
## 五、STM32 与 Linux 的核心差异
|
||
|
||
| 概念 | STM32 | Linux |
|
||
|------|-------|-------|
|
||
| 外设操作 | 直接读寄存器 `GPIOA->ODR = 0x01` | 通过驱动文件 `/sys/class/gpio/export` |
|
||
| 中断 | NVIC + `HAL_GPIO_EXTI_Callback` | 内核中断 → 下半部(tasklet/workqueue) → `poll()` / `select()` |
|
||
| 定时器 | `HAL_TIM_Base_Start_IT` | `timerfd_create` / `setitimer` |
|
||
| 任务调度 | FreeRTOS `vTaskDelay` | `sched_yield` / `usleep` / `timerfd` |
|
||
| 日志 | `printf` 到串口 | `syslog` / `printf` 到 stdout |
|
||
| 编译 | Keil/IAR | GCC 交叉编译 |
|
||
|
||
**最大的思维转变**:Linux 里你不要直接操作寄存器——你通过文件描述符和标准 API 操作"服务"。
|