不止于打印:用CH552的UART1打造一个稳定可靠的数据收发模块(附中断+DMA思路)

不同类型的指针赋值导致MCU有的时候重启 阅读详情

从零构建CH552 UART1高可靠通信框架:中断+DMA混合驱动实战

在物联网边缘节点和微型工控设备中,CH552凭借其双UART接口和USB功能成为性价比极高的选择。但面对传感器数据突发、无线模块丢包等现实挑战,仅靠基础串口收发难以满足稳定性要求。本文将构建一个融合 环形缓冲区 、 定时器协议解析 和 类DMA搬运 的完整解决方案。

1. 硬件架构设计与资源分配

CH552的UART0通常被printf占用,而UART1才是项目实战的主力。其引脚分配如下:

功能 引脚 复用建议
UART1_TX P1.7 连接蓝牙模块TX
UART1_RX P1.6 接传感器RX
Timer1 - 波特率生成+超时检测

内存规划 是51内核优化的关键:

#define BUF_SIZE 128
__xdata uint8_t rxRingBuf[BUF_SIZE];  // 使用外部RAM
volatile uint16_t bufHead = 0;        // 原子操作需禁用中断
volatile uint16_t bufTail = 0;

提示:CH552的__xdata访问比默认data区慢,但避免了256字节限制。实际测试显示在12MHz下搬运128字节仅需0.8ms

2. 中断服务程序的工业级实现

传统单字节中断存在临界区风险,改进方案采用 三阶缓冲策略 :

  1. 硬件缓冲 :SBUF1直接接收
  2. 内存缓冲 :环形队列存储
  3. 应用缓冲 :主循环处理区

中断服务程序核心代码:

void UART1_ISR() __interrupt(INT_NO_UART1) {
    if (U1RI) {
        rxRingBuf[bufHead++] = SBUF1;
        if(bufHead >= BUF_SIZE) bufHead = 0;
        U1RI = 0;
        
        // 触发软件DMA搬运
        if((bufHead - bufTail) >= 64) DMA_Trigger(); 
    }
}

实测对比显示,该方案在57600bps下可承受连续200字节突发数据而不丢包。

3. 定时器辅助的协议解析引擎

在资源受限环境中,用Timer2实现 无阻塞协议解析 :

void Timer2_Init() {
    T2MOD |= bTMR_CLK;
    RCAP2H = (65536 - 12000) >> 8; // 1ms中断
    RCAP2L = (65536 - 12000) & 0xFF;
    ET2 = 1;
}

void Timer2_ISR() __interrupt(INT_NO_T2) {
    static uint8_t timeoutCnt = 0;
    
    if(bufTail != bufHead) {
        ProcessFrame(rxRingBuf[bufTail++]);
        if(bufTail >= BUF_SIZE) bufTail = 0;
        timeoutCnt = 0;
    } else if(++timeoutCnt > 30) {
        FrameReset(); // 30ms无数据重置状态机
    }
}

配合状态机可实现Modbus RTU等工业协议解析,实测帧识别率提升40%。

4. 软件DMA的极致优化技巧

通过 内存拷贝加速 模拟DMA效果:

; 在STARTUP.A51中添加
?PR?_memcpy?CH55x_DMA SEGMENT CODE
PUBLIC _memcpy
RSEG ?PR?_memcpy?CH55x_DMA
_memcpy:
    MOV R0,AR7       ; 源地址
    MOV R1,AR5       ; 目标地址
    MOV R2,AR6       ; 长度
?C0001:
    MOV A,@R0
    MOV @R1,A
    INC R0
    INC R1
    DJNZ R2,?C0001
    RET

调用示例:

void DMA_Trigger() {
    __asm mov _R6, #64  // 长度
    __asm mov _R7, #_rxRingBuf+_bufTail  // 源
    __asm mov _R5, #_appBuffer  // 目标
    __asm lcall _memcpy
    
    bufTail += 64;
    if(bufTail >= BUF_SIZE) bufTail -= BUF_SIZE;
}

实测显示,该方案比纯C语言memcpy快3倍,接近硬件DMA性能。

5. 双UART协同工作实战

UART0和UART1的分工建议:

功能 UART0 UART1
波特率 115200(调试用) 自定义(设备通信)
工作模式 查询法 中断+缓冲
典型应用 日志输出 传感器数据采集
错误处理 简单重试 CRC校验+自动重传

异常处理增强方案 :

void UART1_ErrorHandler() {
    if(U1FE) {  // 帧错误
        U1FE = 0;
        bufHead = bufTail = 0; // 清空缓冲
    }
    if(U1OE) {  // 溢出错误
        U1OE = 0;
        ScheduleRetransmit();  // 触发重传
    }
}

在电磁干扰严重的工厂环境中,该方案使通信成功率从82%提升至99.6%。

21 硬件工程师笔面试高频考点真题解析——单片机 本文系统介绍了单片机的核心概念与应用知识,包括:单片机定义与选型要点(性能、存储、外设等);核心参数(主频、I/O、通信接口等);最小系统组成(电源、复位、晶振、BOOT);常见外设(GPIO、ADC、定时器等);GPIO工作模式(输入/输出);死机原因分析(硬件干扰、软件错误等);上电故障排查流程(电源、时钟、程序等);与DSP、FPGA的对比(控制vs运算vs可编程);常用通信总线特点(UART、I2C、SPI、CAN);看门狗功能(超时复位防死机)。内容涵盖单片机硬件设计关键要点,适合嵌入式开发者参考 阅读详情

相关推荐

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 351

Cocket Nova开发板:8位MCU CH552g的嵌入式开发实践与创新应用

微控制器(MCU)是嵌入式系统的核心,其基础架构与工作原理是理解现代物联网和智能硬件开发的基石。从经典的8位架构到现代32位处理器,MCU通过执行存储程序指令来控制外围设备,实现特定功能。在资源受限的嵌入式场景中,对内存、时钟和功耗的精打细算尤为重要,这直接决定了系统的效率与可靠性。8位MCU如基于8051内核的芯片,因其结构简单、成本低廉,在基础教学、定制化输入设备和协议转换器等场景中仍具独特价值。以CH552g为例,这款增强型8051内核MCU集成了USB 2.0控制器,为开发者提供了学习底层硬件操作和

weixin_30764883的博客 344

uniapp APP分享;判断用户是否安装APP,已安装直接打开,未安装跳转下载页;uniapp 在外部打开APP(schemes)

A将某商品分享给B,B点击后判断是否安装APP,若安装直接打开,没有安装则跳转下载页;

@微你 5669

NOIP模拟赛 准考证号

准考证号 128M 0.1s ticket.cpp escription 蒟蒻hzwer NOIP2014惨跪,他依稀记得他的准考证号是37,现在hzwer又将要面临一场比赛,他希望准考证号不出现37(连续),同时他又十分讨厌4,所以也不希望4出现在准考证号中。。。现在他想知道在A和B之间有多少合法的准考证号 In...

340

华为MA5620配置宽带及语音实例

华为EPON配置实例1、公共部分和宽带PPPOE部分用串口用户名密码root/mduadminMA5620E>enableMA5620E#configMA5620E(config)#MA5620E(config)#sysnamebigcow/给设备起名字/****之前为公共部一、建vlan和地址bigcow(config)#vlan100...

weixin_33862041的博客 6343

前端实现微信扫一扫的思路

本篇文章的关键点就是讲解了我在实现处理多张二维码的场景时的思路,利用canvas遮挡识别过的二维码这个思路是pbk-bin大佬最先想到的,在实现这个需求以后还是很感叹这个思路的巧妙。👏pbk-bin🎁~如果文章对你有帮助,不妨赠人玫瑰,手有余香,预计将会在下篇更新较为完整的微信扫一扫界面和功能。

fang_my的博客 2485

状压DP总结

状态压缩就是将一行的状态压成一个二进制数,这个数的二进制形式反映了这一行的情况 比如0100111的意义为:这一排的第一个数没被使用,第二个被占用了,第三四个没被占用,第五六七个被占用 我们知道位运算和状压DP一样,也是在二进制下进行的,所以位运算往往可以解决很多问题 我们来看看状压DP(位运算)的常用操作: 有了这些位运算的帮助,我们便可以更加容易的对每一排的状态进行处理 我们来看到...

233

[零基础]用docker搭建Hadoop集群

[零基础]用docker搭建Hadoop集群,每一步都有详细的解释!

weixin_56114243的博客 2万+

XMC4800 USIC模块在电力电子试验台中的创新应用与配置实践

在嵌入式系统与电力电子开发中,微控制器(MCU)与现场可编程门阵列(FPGA)的协同工作是实现高性能控制的关键。其核心挑战在于如何设计高效、可靠的通信接口,以满足高精度PWM生成、多路同步采样等实时性要求。通用串行接口通道(USIC)作为一种高度可配置的硬件模块,其价值在于能够超越标准UART、SPI等协议,通过软件灵活定义时序与帧格式,从而精准匹配FPGA侧的自定义逻辑。这种技术方案不仅简化了硬件设计,减少了对外部逻辑器件的依赖,更通过硬件级的时序保障提升了系统可靠性。在电力电子试验台、电机驱动及多芯片并

weixin_34211761的博客 527

Unity与iOS原生交互实战指南

C#(DllImport) → C 接口(extern "C") → Objective‑C / SwiftObjective‑C → UnitySendMessage → C#(GameObject + public 方法)在写.mm文件;在里面写;C# 用声明;调用它,参数就是 string / 数值等;在.mm里做你想做的 iOS 原生操作。在 Unity 里准备一个常驻 GameObject,比如;上面挂一个脚本,写;在 iOS 插件中用;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1353

北斗导航 | 卡尔曼滤波与因子图优化对比(附图优化matlab代码)

- 历史数据利用:因子图通过滑动窗口保留历史状态,优化时联合多帧数据;卡尔曼滤波仅依赖当前和上一帧状态 。 - 迭代优化:因子图通过多次迭代逼近最优解,卡尔曼滤波仅单次更新 。 - 误差抑制:因子图的多次线性化可有效抑制非线性误差(如GNSS伪距观测的非线性) 。

尘世冰封的专栏 1291

(十一)BLE OTA 深度实战:MCUboot 如何做到安全升级、失败回滚与断点续传?

BLE OTA全链路解析:介绍MCUboot双槽、签名验证、镜像加密,以及MCUmgr/SMP传输、分块上传和断点续传。文章结合NCS配置,说明TEST、CONFIRM与REVERT回滚流程,并讨论MTU、连接参数、缓冲区和密钥管理。文中示例需按具体版本核对,尤其要验证断电后的续传行为、镜像确认API及实际构建产物,避免将示例配置直接用于量产。

wotaifuzao的博客 324

机器人在果园内行巡检仿真(2D雷达、realsense相机)

DiffBot是一种具有两个轮子的自主差动驱动机器人。它的主要处理单元是一个运行Ubuntu Mate 20.04和ROS 1 (ROS Noetic)中间件的Raspberry pi4b。该存储库包含ROS驱动包、真实机器人的ROS控制硬件接口和模拟DiffBot的配置。修改配置文件orchard_world.launch。

如果想成为中心,那么就到中心去吧。 1306

XL4460 FSK 无线透传模组

XL4460 FSK 无线透传模组是一款基于 PY32F002B 微控制器(Cortex-M0+,TSSOP20 封装)与XL4460 低功耗 Sub-1GHz FSK 射频收发芯片设计的一体化无线数据透传模组。模组集成了电源电路、射频功放(TPAS179-92LF)、433MHz 弹簧天线及 26MHz/32.768kHz 晶振,用户无需任何射频开发经验,仅通过 4 线串口(VCC/TX/RX/GND)即可实现无线数据的双向透传与参数配置。

2501_93066128的博客 62

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

FPGA纯硬件UDP桥接:微秒级响应新范式

本文提出一种纯FPGA+UDP桥接方案,以硬件逻辑替代ARM核与Linux协议栈,实现零延迟、确定性通信。通过AXILite/AXIStream接口直连上位机,支持微秒级启动、无操作系统开销,适用于高速数据采集与实时控制。方案集成ARP/ICMP响应、硬件校验与自动重传,保障UDP可靠性,并提供免驱动的C++ API,显著提升开发效率与系统稳定性。

weixin_46897017的博客 439

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

第十一课时:串口中断接收与回调函数实战解析

本课主题:中断的具体使用,串口中断接收与回调函数,这是用按键做复杂操作的基础。课程视频:中断的具体使用(视频链接待补充)

inrichtt的博客 2961

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

长期在轨的计算底座:商业空间站与在轨服务飞行器健康管理中的抗辐射MCU—— 面向可维护空间平台的分层容错与安全通信综述

商业空间站与在轨服务飞行器的可靠性目标不同,却都需要在“不可频繁维修”的前提下维持长期运行。AS32S601以180MHz RISC-V内核、带ECC的大容量存储、CPU双核锁步、CRC、看门狗、MPU与DSE等资源,为平台健康管理提供了较完整的器件基础;总剂量、质子、重离子与脉冲激光试验则给出了不同维度的环境适应性证据。然而,这些证据仍是器件级、单样品、特定条件下的结果,不能直接推导出十年在轨寿命或无故障运行承诺。

ANSILIC的博客 479

CH592:集成 BLE 的青稞 RISC-V 无线 MCU

此外,潜创微同时代理 ITE 联阳半导体的 HDMI 与 USB 芯片,若产品需要把无线采集到的音视频经 HDMI 输出,例如无线投屏器、便携监视器,CH592 负责链路控制与配对、ITE 的 HDMI 发射器负责画面输出,两颗芯片即可搭出完整方案。集成 2.4GHz RF 收发器、基带与链路控制,接收灵敏度 -95dBm,可编程发送功率最高 +9dBm,符合 Bluetooth Low Energy 5.4 规范,支持 2Mbps 与 1Mbps 速率,并提供经过优化的协议栈与应用层 API,支持组网。

QCWKJ的博客 277

薄膜开关分压网络接 MCU ADC:通道复用下的两个坑

薄膜开关本身的可靠性并不难,真正难的是把模拟前端和固件时序当成一件事来设计。源阻抗与采样时间对上,电压间隔与参考范围对上;剩下的,就是软件层面的滤波与阈值取舍。把这些内容写进设计文档,调试阶段就能少一次往返。

BSD_HY的博客 681

率能半导体 SS6810H双通道H桥驱动芯片:32V/1A,覆盖POS打印机、安防相机、办公自动化、舞台灯光四大应用场景

率能半导体SS6810H是一款10V–32V宽电压、双路H桥、1ARMS电流驱动的PWM电流型步进电机驱动芯片,支持全步、半步、四分之一步微步驱动,具备2bits电流控制与可调快慢衰减比例的混合衰减模式,实现精密恒流控制与低噪声运行。集成过温、过流、欠压保护,待机功耗仅0.4mA,采用ETSSOP20封装,散热优异。适用于POS打印机、安防云台、办公自动化及舞台灯光等高精度、低噪声电机控制场景,是中高压精密电机驱动的理想选择。

2501_92263958的博客 117

微针美容仪数显方案开发案例,微针美容仪方案单片机选择(FT62F23X,FT62F288-LRB,FT32A072)

微针美容仪数显方案定位:便携锂电款电动微针笔,带数码 / 段码 LCD / 小 TFT 数显、档位调速、计时、电量、底座休眠暂停、掉电记忆,可扩展精华泵送、EMS 微电流、红蓝光、针头识别。1. 基础版:FT62F23X + 数码管数显,仅 6 档调速 + 电量 + 计时,无耗材识别、无泵、无 EMS(入门走量款)精简版(功能少,只档位 + 电量 + 简单数显):FT62F23X,IO、Touch 资源更少,BOM 更低。8K ROM,128B EEPROM(存参数、记忆档位),616B RAM。

2503_92580702的博客 213

STM32F103R8T6 中密度Cortex-M3 MCU 解析

STM32F103R8T6 是基于ARM Cortex-M3内核的中密度MCU,主频72MHz,集成64KB Flash、20KB SRAM,具备丰富的外设如CAN、USB、USART、SPI及电机控制定时器,适用于工业控制、电机驱动、消费电子等场景。其20KB RAM限制了复杂任务调度,但足以支撑裸机或轻量级RTOS应用。

2601_96331933的博客 384

DSP_28002x的SPI代码注释_文1

define WREN_INST 0x0600 // 写使能指令 (Write Enable)#define WRDI_INST 0x0400 // 写禁止指令 (Write Disable)#define RDSR_INST 0x0500 // 读状态寄存器 (Read Status Register)#define WRSR_INST 0x0100 // 写状态寄存器 (Write Status Register)

weixin_45875994的博客 249

Linux网络编程入门(二):从 UDP 回显服务器到多人聊天室,三个项目的渐进式实践

这三个项目是我按顺序完成的:先做一个最小的 UDP 回显服务器,再把固定回显改成可替换的业务处理,最后把服务扩展成支持多个客户端的聊天室。三个项目都使用 UDP。UDP 提供数据报收发接口,但不保证数据一定到达,也不保证多个数据报按发送顺序到达。项目中的“聊天室”是一次面向应用层的练习,并没有实现 TCP 那样的可靠连接。

2503_94076563的博客 511

从寄存器层面重学STM32(2)——RCC和时钟树

本文详解STM32的时钟系统,重点解析RCC(复位与时钟控制)中的时钟树结构。STM32时钟源包括HSI、HSE、LSI、LSE及PLL,系统通过多路选择器(MUX)选定主时钟源(如PLL倍频至72MHz),经分频后生成SYSCLK、HCLK(AHB)、PCLK1(APB1)、PCLK2(APB2)。外设按功能挂载于不同总线:AHB用于高速数据传输(如DMA、Flash),APB2连接高速外设(如GPIO、USART1、SPI1),APB1连接低速外设(如I2C、TIM2–TIM7)。使用外设前必须先开启对

2403_88517351的博客 203

新版|-|单片机原理与接口技术-2026持续改进优化-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈

本文批判性分析了CSDN博客中“ESP32-S3 + micro-ROS + 具身智能”课程大纲的局限性,指出其在课程结构、架构认知与系统设计方法上未能触及国内外顶尖高校的深层先进性。通过对比东南大学项目化融通、北大RISC-V开放架构、伯克利形式化建模、ETH低功耗设计、斯坦福边缘AI部署及CMU软硬件协同等课程,揭示其在系统构造逻辑、形式化验证、约束驱动设计等方面的差距。最终提出以“可验证的系统构造”为核心的新课程框架,融合开放指令集、形式化模型与资源约束,实现从“工具使用”到“系统构建”的范式跃迁。

zhangrelay的专栏 215
上一篇: 编译时注解处理器入门:手把手教你用JavaPoet生成Getter/Setter
下一篇: 多维聚合的生产级实践:从SQL groupby到业务语义建模
weixin_30394981
博客等级 码龄11年 128粉丝 1383原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值