找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4|回复: 3
打印 上一主题 下一主题
收起左侧

单片机「四区一线」完整讲解(嵌入式标准程序分层框架)

[复制链接]
跳转到指定楼层
楼主
ID:60178 发表于 2026-7-9 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、定义来源
是国内单片机教学通用代码分层规范,用来规范工程代码结构,方便阅读、排错、维护,四区 = 四类功能代码区,一线 = 分区隔离延时。

二、四区分别是什么
第一区:系统初始化 SystemInitial ()
上电最优先执行,只操作单片机内核、时钟、看门狗、中断总开关、IO 默认电平。
作用:防止上电瞬间 IO 乱电平造成外设误动作(继电器、电机、背光误触发)。
典型内容:

  • 系统时钟分频、内部 RC / 外部晶振配置
  • 关闭看门狗、配置中断总使能 EA
  • IO 口全部输出高 / 低电平,锁定初始状态
  • 内部寄存器、堆栈初始化

第二区:外设初始化 PeripheralInitial ()
系统底层稳定后,再初始化外部硬件外设。
必须放在隔离延时之后,避免上电时序冲突。
典型内容:

  • 串口 UART、I2C、SPI 配置
  • 定时器 T0/T1、外部中断初始化
  • LCD、按键、ADC、PWM、DS18B20 等外设寄存器配置

第三区:主循环任务区 while (1)
无限循环里所有业务任务函数,轮询执行。
所有前台逻辑都放这里:

  • LedTask () 指示灯刷新
  • KeyTask () 按键扫描处理
  • UartTask () 串口收发解析
  • DisplayTask () 屏幕刷新
  • 温度采集、风机控制、通讯上报等业务逻辑

第四区:定时中断函数 interrupt
所有实时、高精度、不能阻塞的任务放中断里,独立于主循环运行。
典型场景:

  • 1ms 定时消抖、计时、计时统计
  • 高频 ADC 采样、PWM 波形生成
  • 1-Wire 单总线时序、按键定时扫描
  • 超时检测、看门狗喂狗

三、一线:隔离延时 Delay ()
夹在系统初始化和外设初始化中间的延时函数,是两区分割线。
作用:

  • 给单片机内部寄存器、电源电平足够稳定时间;
  • 避免上电瞬间 IO 电平不稳,外设初始化误判;
  • 防止外设上电冲击电流损坏器件。


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:60178 发表于 2026-7-9 14:51 | 只看该作者
STM32 下的「四区一线」完整说明
一、先说核心结论
四区一线是国内 51 单片机教学通用简易程序框架,不是 STM32 官方标准架构,但逻辑完全可以平移套用在 STM32 裸机工程,用来规范 main 函数执行顺序,新手调试非常友好。
STM32 本身有两套分层体系,不要混淆:
软件执行流程分层:四区一线(main 内执行顺序)(运行时序分层)
工程文件分层:HAL 标准四层(HAL/Driver/BSP/App)(文件目录分层)
STM32 是 Cortex-M 内核,上电流程、时钟、中断、外设初始化比 51 复杂,只需要微调对应初始化函数即可适配四区一线。
二、四区一线定义复刻到 STM32(四区 + 一线含义不变)
四区
第一区:系统内核初始化(SystemInit)
对应 51 的 SystemInitial (),只做芯片底层内核配置,不碰外部器件:
HAL 库基础初始化 HAL_Init()
系统时钟配置 SystemClock_Config()
中断分组配置 HAL_NVIC_SetPriorityGrouping()
关闭外设默认电平、复位内核、滴答定时器 SysTick 初始化
只操作芯片本身,不初始化 LED、串口、ADC 等外设
一线:隔离延时 Delay_ms ()
一区和二区中间的延时,作用:
等待电源、晶振稳定
防止上电 IO 电平跳变导致外设误触发(继电器、显示屏、传感器乱动作)
STM32 用 HAL_Delay(100) 即可
第二区:外设初始化(PeripheralInit)
系统稳定后再初始化所有片内外设与外部器件:
CubeMX 自动生成的 MX 初始化函数全部放这里:
MX_GPIO_Init()、MX_USART1_Init()、MX_TIM1_Init()、MX_ADC1_Init()、OLED / 按键 / 温感 BSP 初始化
第三区:主循环前台任务 while (1)
轮询执行所有非实时业务,不能放阻塞长延时:
按键扫描、屏幕刷新、串口解析、风机控制、数据上报、指示灯刷新
所有xxx_Task()任务函数都属于第三区
第四区:中断后台实时任务
定时器中断、外部中断、串口中断回调函数,处理高精度、不能阻塞的任务:
1ms 计时、软定时器、ADC 高速采样、按键消抖、通讯帧缓存、看门狗喂狗
STM32 推荐:中断只做置标志位、缓存数据,业务逻辑丢到主循环第三区处理,避免中断过长
回复

使用道具 举报

板凳
ID:60178 发表于 2026-7-9 14:52 | 只看该作者
三、STM32 标准四区一线完整 main 代码模板(HAL 库)
#include "main.h"
#include "gpio.h"
#include "usart.h"
#include "tim.h"
#include "bsp_led.h"
#include "bsp_key.h"

// 第一区:系统内核初始化
void System_Init(void)
{
  HAL_Init();                     // HAL底层初始化
  SystemClock_Config();           // 系统时钟配置
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); // 中断分组
}

// 第二区:外设初始化
void Peripheral_Init(void)
{
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
  BSP_LED_Init();
  BSP_KEY_Init();
}

// 第三区:前台任务
void App_Task(void)
{
  LED_Task();
  Key_Task();
  UART_Process();
}

int main(void)
{
  // ========== 第一区:系统内核初始化 ==========
  System_Init();

  // ========== 一线:分区隔离延时 ==========
  HAL_Delay(100);

  // ========== 第二区:外设初始化 ==========
  Peripheral_Init();

  while (1)
  {
    // ========== 第三区:主循环前台任务 ==========
    App_Task();
  }
}

// ========== 第四区:定时中断后台任务(TIM2中断示例) ==========
void TIM2_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM2)
  {
    // 1ms计时、消抖、计时统计(实时任务)
  }
}

// 错误处理
void Error_Handler(void)
{
  while(1);
}
回复

使用道具 举报

地板
ID:60178 发表于 2026-7-9 14:53 | 只看该作者
STM32 全系列软件架构分类(分三大类:裸机运行架构、工程目录分层架构、RTOS 多任务架构)
前面讲的四区一线只是简易裸机执行时序框架,STM32 还有大量工业标准、项目常用架构,下面全部梳理,区分「运行逻辑架构(代码执行流程)」和「工程文件分层架构(文件夹结构)」。
一、裸机运行逻辑架构(无操作系统,main 执行流程)
1. 最简顺序轮询架构(最基础,新手)
无分层、无状态、无时间片,初始化后 while (1) 依次执行任务
c
运行
main{
  初始化;
  while(1){
    按键();LED();串口();采集();
  }
}

优点:最简单;缺点:实时性差,一个任务阻塞整体卡死;适合单功能小产品。
2. 四区一线架构(你之前问的,51 移植通用)
四段代码 + 中间隔离延时,时序规范,小家电 / 采集板主流裸机框架
1 区系统初始化 → 一线延时 → 2 区外设初始化 → 3 区主循环轮询 → 4 区中断后台任务
3. 事件驱动标志位架构(标准前后台)
前台(中断):串口、外部中断、定时器只置全局 flag,不处理复杂逻辑
后台(while (1)):循环判断 flag,有事件再执行对应业务
c
运行
void USART_IRQ(){ rx_flag = 1; }
while(1){
  if(rx_flag){ 解析数据; rx_flag=0; }
}

优势:中断短小、不阻塞;所有裸机项目都会结合使用。
4. 时间片轮询架构(裸机进阶,替代简易 RTOS)
定时器 1ms 中断做系统节拍,每个任务分配固定执行时间片,分时调度
c
运行
//1ms计数,10ms执行按键,50ms刷新屏幕,100ms上传数据
if(tick%10==0) KeyTask();
if(tick%50==0) DisplayTask();

特点:多任务均分 CPU,不会单任务长期霸占;中等设备首选裸机方案。
5. 有限状态机 FSM 架构(复杂设备专用)
整机拆成多个运行状态:初始化、待机、运行、故障、校准,状态切换驱动业务
c
运行
enum{STA_INIT,STA_IDLE,STA_RUN,STA_ERR} state;
while(1){
  switch(state){
    case STA_INIT: Init(); state=STA_IDLE; break;
    case STA_RUN: 采集+控制; break;
    case STA_ERR: 报警停机; break;
  }
}

适用:变频器、温控、环保数采仪、吹风机多档位设备,逻辑不会嵌套大量 if。
6. 前后台 + 状态机复合架构(工业裸机顶配)
时间片轮询 + 事件标志 + 整机状态机三合一,复杂无 OS 项目标准写法。
二、工程目录分层架构(文件夹规范,不分裸机 / RTOS)
1. ST 官方 Cube 标准五层分层(HAL 原生架构)
自上而下:
Application 应用层:main、业务任务、状态机
Middleware 中间件层:LwIP、FATFS、emWin、USB、Modbus
HAL 硬件抽象层:STM32 标准外设驱动(GPIO/UART/TIM)
BSP 板级支持包:屏幕、传感器、按键、功放等外部硬件驱动
CMSIS 内核层:内核寄存器、中断向量、系统初始化
优势:跨芯片通用,换 F1/F4/H7 只需替换 HAL 文件夹,上层代码不动。
2. 企业通用四层模块化分层(国内工厂固件标准)
目录划分:App / Service / BSP / Driver
Driver 底层:HAL/LL 寄存器封装,只操作芯片外设
BSP 板级:外部器件(温感、屏、485 模块)
Service 服务层:算法、协议解析、滤波、数据缓存
App 应用层:整机业务、状态机、主任务
核心规则:上层可调用下层,禁止下层调用上层,解耦极强,多人协作开发。
3. 极简三层架构(小项目简化版)
User(业务) + BSP(外设) + Drivers(官方库),去掉独立 Service,适合学生、小型样机。
三、RTOS 实时操作系统多任务架构(复杂设备)
裸机架构解决不了多任务抢占、定时阻塞时,使用 RTOS,主流 FreeRTOS、RT-Thread、UCOS。
1. FreeRTOS 标准多任务架构
每个功能独立任务 Task,分配优先级、独立栈,内核抢占调度:
高优先级:故障保护、高速 AD 采集、闭环控制
中优先级:串口通信、屏幕刷新
低优先级:指示灯、日志上报
配套内核组件:队列 Queue、信号量 Semaphore、互斥锁、软件定时器。
2. RT-Thread 组件化架构(物联网设备)
在多任务基础上增加设备驱动框架、FinSH 命令行、文件系统、网络组件,模块化插件式开发。
3. 双核 MPU 架构(STM32MP1 系列,A7+M4)
Cortex-A7:跑 Linux,UI、网络、APP
Cortex-M4:裸机 / FreeRTOS,实时电机、采集控制
软硬双架构分离,高端工控、网关专用。
四、小众特殊架构
LL 库寄存器直写架构:不使用 HAL,直接操作寄存器,极致执行效率,电机 FOC 高频控制场景;
协程 Coroutine 架构:裸机模拟多任务,无独立栈,资源极小;
MicroPython/Arduino 上层框架:Python / 简易 C 封装,快速原型,底层仍是 HAL 驱动。
五、各架构适用场景速查表
表格
架构类型        适用产品        优缺点
顺序轮询 / 四区一线        小家电、吹风机、简易采集板        简单易调试;多任务实时性弱
时间片轮询 + 状态机        环保数采、温控、检测仪        无 OS、资源占用低、逻辑清晰
四层模块化分层        量产工业控制器、批量项目        易维护、可移植、团队协作友好
FreeRTOS 多任务        带以太网、多路串口、多传感器设备        抢占实时,任务隔离;占用 RAM 更大
RT-Thread 组件化        物联网 4G/WiFi 设备        丰富中间件,自带 shell 调试
STM32MP1 双核 Linux        人机界面、网关、高端工控        兼顾实时控制与复杂操作系统
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表