3.5.13 DEVICE 阶段详解
2026/4/29大约 3 分钟启动流程初始化DEVICE设备注册外设传感器
3.5.13 DEVICE 阶段详解
📚 本节导读
学习时长: 约 20 分钟
难度级别: ⭐⭐⭐☆☆(中级)
前置知识:
- 3.5.12 PRE_DEVICE 阶段详解
- 3.5.2.5 __driver_stm32_usart_early_driver_init 函数详解
- 了解 OS_DEVICE_DEFINE 设备注册机制
🎯 学习目标
- 理解 DEVICE 级别的定位和目的
- 掌握 PRE_DEVICE 与 DEVICE 的分工
- 理解 10 个 DEVICE 函数的职责
- 理解设备注册完成后系统的功能状态
一、阶段概述
1.1 阶段定位
DEVICE 是设备注册与初始化级别。PRE_DEVICE 完成了驱动注册(probe/driver 匹配),DEVICE 级别则完成设备的具体注册和初始化——包括 ADC、Flash、EEPROM、SPI Flash、FAL 分区、时间管理、LCD、红外、传感器等。
1.2 基本信息
| 属性 | 值 |
|---|---|
| 初始化级别 | OS_INIT_LEVEL_DEVICE(值 5) |
| 调用位置 | _k_sys_task_entry 第 203 行 |
| 调用时机 | PRE_DEVICE 初始化之后 |
| 前置条件 | 驱动已注册(PRE_DEVICE 完成),设备框架就绪 |
| 总函数数 | 11 个(1 个标记 + 10 个实际函数) |
1.3 从 project.map 看实际注册
.init_call.5."" → device_start ← 标记函数
.init_call.5.1 → __driver_stm32_adc_driver_init ← ADC 驱动
.init_call.5.1 → __driver_stm32_flash_driver_init ← Flash 驱动
.init_call.5.2 → eeprom_probe ← EEPROM 探测
.init_call.5.2 → sflash_init ← SPI Flash 初始化
.init_call.5.3 → fal_part_init ← FAL 分区初始化
.init_call.5.3 → os_timekeeping_init ← 时间管理初始化
.init_call.5.3 → os_hw_lcd_init ← LCD 初始化
.init_call.5.3 → os_hw_infrared_init ← 红外初始化
.init_call.5.3 → remote_control_atk_init ← 遥控器初始化
.init_call.5.3 → os_hw_photo_diode_light_init ← 光敏传感器初始化二、子级别结构
2.1 三个子级别
| 子级别 | 函数数 | 职责类型 |
|---|---|---|
| 5.1 | 2 | 基础存储与模拟外设(ADC、Flash) |
| 5.2 | 2 | 存储设备(EEPROM、SPI Flash) |
| 5.3 | 6 | 高级设备和传感器(FAL、时间、LCD、红外、遥控、光敏) |
2.2 依赖关系
5.1(ADC、Flash 基础驱动)
└─ 5.2(EEPROM、SPI Flash 存储设备)
└─ 5.3(FAL 分区、时间、LCD、红外等高级设备)三、各函数详解
3.1 5.1 子级别:基础存储与模拟外设
| 函数 | 源文件 | 职责 |
|---|---|---|
__driver_stm32_adc_driver_init | drivers/hal/st/drivers/drv_adc.c | 注册 STM32 ADC 驱动 |
__driver_stm32_flash_driver_init | drivers/hal/st/drivers/drv_flash_f1.c | 注册 STM32 内部 Flash 驱动 |
3.2 5.2 子级别:存储设备
| 函数 | 源文件 | 职责 |
|---|---|---|
eeprom_probe | drivers/eeprom/eeprom.c | 探测并注册 EEPROM 设备 |
sflash_init | drivers/sflash/sflash.c | 初始化 SPI Flash 框架 |
3.3 5.3 子级别:高级设备与传感器
| 函数 | 源文件 | 职责 |
|---|---|---|
fal_part_init | drivers/fal/fal_part.c | FAL(Flash Abstraction Layer)分区初始化 |
os_timekeeping_init | drivers/timer/timekeeping.c | 时间管理框架初始化 |
os_hw_lcd_init | 板级 LCD 驱动 | 正点原子 LCD 屏幕初始化 |
os_hw_infrared_init | drivers/infrared/infrared.c | 红外接收框架初始化 |
remote_control_atk_init | 板级遥控器驱动 | 正点原子遥控器初始化 |
os_hw_photo_diode_light_init | 板级光敏驱动 | 光敏二极管传感器初始化 |
FAL 分区初始化
fal_part_init 是 FAL(Flash Abstraction Layer)的关键初始化。它将 Flash 存储空间划分为多个分区(如 bootloader、app、download、easyflash 等),为上层的文件系统和 OTA 提供统一的 Flash 操作接口。
四、PRE_DEVICE 与 DEVICE 的分工对比
| 维度 | PRE_DEVICE(4) | DEVICE(5) |
|---|---|---|
| 定位 | 驱动注册(probe) | 设备注册与初始化 |
| 典型操作 | driver_match_devices 匹配驱动 | os_device_register 注册设备 |
| 串口 | __driver_stm32_usart_driver_init(驱动注册) | — |
| ADC | — | __driver_stm32_adc_driver_init(设备注册) |
| 存储 | — | eeprom_probe, sflash_init, fal_part_init |
| 控制台 | os_console_init(控制台初始化) | — |
| 传感器 | — | LCD、红外、遥控、光敏 |
五、启动流程上下文
_k_sys_task_entry()
├─ POST_KERNEL 初始化 ← 3.5.11
├─ PRE_DEVICE 初始化 ← 3.5.12(驱动注册)
│
├─ DEVICE 初始化 ← 本节(3.5.13)
│ ├─ 5.1: stm32_adc, stm32_flash
│ ├─ 5.2: eeprom, sflash
│ └─ 5.3: fal_part, timekeeping, LCD, 红外, 遥控, 光敏
│
├─ COMPONENT 初始化 ← 3.5.14
├─ APPLICATION 初始化 ← 3.5.15
└─ app_entry() → main()💡 本节总结
重点回顾
- DEVICE 是设备注册与初始化级别:PRE_DEVICE 注册驱动,DEVICE 注册设备
- 10 个实际函数分 3 个子级别:基础存储 → 存储设备 → 高级设备/传感器
- FAL 分区是存储系统的核心:为 OTA 和文件系统提供统一的 Flash 操作接口
- DEVICE 完成后,所有外设均可使用
关键函数速查
| 子级别 | 函数数 | 典型函数 |
|---|---|---|
| 5.1 | 2 | stm32_adc, stm32_flash |
| 5.2 | 2 | eeprom, sflash |
| 5.3 | 6 | fal_part, timekeeping, lcd, infrared, remote, photo_diode |
下一步
接下来请学习:
- 3.5.14 COMPONENT 阶段详解 - 组件初始化