news 2026/4/17 2:30:02

one_channel_hub 移植到CH584M(TMOS适配+移除WiFi网络代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
one_channel_hub 移植到CH584M(TMOS适配+移除WiFi网络代码)

one_channel_hub 移植到CH584M(TMOS适配+移除WiFi网络代码)

一、核心适配背景

原平台特性CH584M/TMOS适配目标
ESP32 + FreeRTOSCH584M(RISC-V) + TMOS(沁恒轻量级OS)
含WiFi/HTTP/UDP/BLE配网移除所有网络相关代码,仅保留LoRa核心逻辑
ESP32 SPI/GPIO/定时器适配CH584M硬件驱动 + TMOS任务/事件/定时器
支持SX126x/LLCC68/LR11xx保留LoRa射频驱动,适配CH584M的RAL层

二、代码裁剪(彻底移除网络相关)

1. 删除网络相关文件

# 核心删除项(从one_channel_hub仓库中删除)rm-rf lorahub/main/wifi.c lorahub/main/wifi.hrm-rf lorahub/main/http_server* lorahub/main/udp_client*rm-rf components/wifi_provisioning/rm-rf components/esp32_net/*# 若有ESP32网络封装

2. 移除代码中的网络依赖

(1)主函数(lorahub/main/main.c)裁剪

删除ESP32网络初始化、FreeRTOS网络任务,保留LoRa核心初始化:

// 移除所有网络相关头文件// #include "wifi.h"// #include "http_server.h"// #include "esp_wifi.h"// #include "esp_netif.h"// 删除网络初始化调用// wifi_sta_init(false);// http_server_start();// udp_client_init();// 保留LoRa核心逻辑,替换FreeRTOS任务为TMOS任务// xTaskCreate(lora_task, "lora_task", 4096, NULL, 5, NULL); // 移除FreeRTOS任务TMOS_TaskCreate(lora_tmos_task,"lora_task",256,NULL,1);// TMOS任务创建
(2)HAL层(components/liblorahub/lorahub_hal.c)裁剪

移除ESP32/FreeRTOS网络依赖,删除WiFi状态关联逻辑:

// 移除ESP32/FreeRTOS头文件// #include <esp_log.h>// #include <freertos/FreeRTOS.h>// #include <freertos/event_groups.h>// 删除WiFi状态相关宏/变量// #define WIFI_CONNECTED_BIT BIT0// static EventGroupHandle_t wifi_event_group;// 删除所有与WiFi联动的Packet Forwarder发送逻辑(原UDP发LNS的代码)
(3)编译配置清理

修改CMakeLists.txt/Makefile,移除ESP32网络组件依赖:

# 移除ESP32网络组件(原配置) # REQUIRES esp_wifi esp_http_server esp_netif freertos # 仅保留LoRa相关编译项 SRCS += components/radio_drivers/sx126x/ral_sx126x.c SRCS += components/liblorahub/lorahub_hal.c

三、CH584M TMOS基础适配

CH584M的TMOS是沁恒自研轻量级OS,需替换原FreeRTOS的任务、事件、定时器为TMOS接口。

1. TMOS基础初始化(main.c)

#include"CH58x_common.h"#include"tmos.h"// TMOS系统初始化voidsystem_init(void){SetSysClock(CLK_SOURCE_PLL_60MHz);// CH584M主频60MHzUART1_Init(115200);// 串口初始化(调试用)TMOS_Init();// TMOS核心初始化TMOS_Start();// 启动TMOS调度}intmain(void){system_init();lgw_connect();// LoRa硬件连接初始化lgw_radio_setup();// LoRa射频配置// TMOS主循环(由TMOS接管,无需裸机while(1))while(1){TMOS_Run();}}

2. TMOS任务替换FreeRTOS任务

原FreeRTOS的LoRa任务替换为TMOS任务:

// 原FreeRTOS任务// static void lora_task(void* arg) { ... }// TMOS LoRa任务staticvoidlora_tmos_task(void*pdata){tmos_event_tevent;while(1){// TMOS事件等待(替代FreeRTOS xEventGroupWaitBits)if(TMOS_EventPend(&event,0xFFFFFFFF,TMOS_WAIT_FOREVER)==TMOS_SUCCESS){switch(event.event){caseEVENT_LORA_RX:// LoRa接收事件lgw_hal_rx_packet_process();// 处理LoRa接收包break;caseEVENT_LORA_TX:// LoRa发送事件lgw_hal_tx_packet_process();break;default:break;}}}}

3. TMOS定时器替换esp_timer

原ESP32的esp_timer替换为TMOS软件定时器:

#include"tmos_timer.h"#defineLORA_TIMER_ID0x01#defineLORA_TIMER_PERIOD10// 10ms// TMOS定时器回调(替代esp_timer_callback)voidlora_timer_cb(uint8_ttimer_id,uint8_tmsg){// 轮询LoRa BUSY状态/超时检测if(GPIO_ReadInputPin(GPIO_Pin_8)==PIN_RESET)// BUSY引脚低电平{TMOS_EventSend(lora_tmos_task_id,EVENT_LORA_RX,0);// 发送接收事件}}// 初始化TMOS定时器voidlora_timer_init(void){TMOS_TimerCreate(LORA_TIMER_ID,lora_timer_cb);TMOS_TimerStart(LORA_TIMER_ID,LORA_TIMER_PERIOD,TMOS_TIMER_PERIODIC);// 周期触发}

四、CH584M硬件驱动适配(核心)

1. SPI驱动适配(LoRa射频通信)

替换ESP32 SPI为CH584M SPI,适配TMOS无DMA冲突:

// 硬件引脚定义(根据实际PCB修改)#defineLORA_SPI_SCLK_PINGPIO_Pin_2#defineLORA_SPI_MOSI_PINGPIO_Pin_3#defineLORA_SPI_MISO_PINGPIO_Pin_4#defineLORA_SPI_NSS_PINGPIO_Pin_5#defineLORA_SPI_RST_PINGPIO_Pin_6#defineLORA_SPI_DIO1_PINGPIO_Pin_7#defineLORA_SPI_BUSY_PINGPIO_Pin_8// CH584M SPI初始化(替代esp32 spi_bus_initialize)voidlora_spi_init(void){// 配置SPI引脚为复用功能GPIO_SetFunc(LORA_SPI_SCLK_PIN,GPIO_FUN_SPI0_SCK);GPIO_SetFunc(LORA_SPI_MOSI_PIN,GPIO_FUN_SPI0_MOSI);GPIO_SetFunc(LORA_SPI_MISO_PIN,GPIO_FUN_SPI0_MISO);// NSS引脚软件控制GPIO_ModeCfg(LORA_SPI_NSS_PIN,GPIO_ModeOut_PP_5mA);GPIO_SetBits(LORA_SPI_NSS_PIN);// 默认拉高// SPI0配置:主机模式,CPOL=0,CPHA=0,速率3.75MHz(60MHz/16)SPI0_MasterDefInit();SPI0_SetClockDiv(SPI_CLK_DIV_16);}// SPI读写函数(替代ESP32 spi_device_transmit)uint8_tspi_lora_rw(uint8_ttx_data){while(SPI0_GetTxFIFOFreeNum()==0);// 等待发送FIFO空闲SPI0_SendData(tx_data);while(SPI0_GetRxFIFOCount()==0);// 等待接收FIFO有数据returnSPI0_RecvData();}// LoRa片选控制voidlora_nss_ctrl(uint8_ten){if(en)GPIO_SetBits(LORA_SPI_NSS_PIN);elseGPIO_ResetBits(LORA_SPI_NSS_PIN);}

2. GPIO/中断适配(DIO1/BUSY/RESET)

CH584M GPIO中断替换ESP32中断,适配TMOS中断处理:

// GPIO初始化voidlora_gpio_init(void){// RST引脚:输出GPIO_ModeCfg(LORA_SPI_RST_PIN,GPIO_ModeOut_PP_5mA);GPIO_SetBits(LORA_SPI_RST_PIN);// BUSY引脚:输入上拉GPIO_ModeCfg(LORA_SPI_BUSY_PIN,GPIO_ModeIN_PU);// DIO1引脚:输入+上升沿中断(LoRa接收完成触发)GPIO_ModeCfg(LORA_SPI_DIO1_PIN,GPIO_ModeIN_PU);GPIO_ITModeCfg(LORA_SPI_DIO1_PIN,GPIO_IT_RisingEdge);PFIC_EnableIRQ(GPIO_IRQn);// 使能GPIO中断}// GPIO中断服务函数(TMOS适配)__interrupt__attribute__((used))voidGPIO_IRQHandler(void){if(GPIO_GetITFlag(LORA_SPI_DIO1_PIN)){GPIO_ClearITFlag(LORA_SPI_DIO1_PIN);// 清除中断标志// 向TMOS任务发送接收事件TMOS_EventSend(lora_tmos_task_id,EVENT_LORA_RX,0);}}// LoRa复位函数(替代ESP32 gpio_reset_pin)voidlora_reset(void){GPIO_ResetBits(LORA_SPI_RST_PIN);TMOS_DelayMs(10);// TMOS毫秒延时GPIO_SetBits(LORA_SPI_RST_PIN);TMOS_DelayMs(50);}

3. RAL层适配(Radio Abstraction Layer)

修改components/smtc_ral/ral_sx126x.c,替换ESP32硬件操作为CH584M接口:

// 替换SPI读写函数ral_status_tral_sx126x_write(constral_t*ral,constuint16_taddr,constuint8_t*data,constuint16_tsize){lora_nss_ctrl(0);// 拉低片选spi_lora_rw(0x02);// 写命令spi_lora_rw((addr>>8)&0xFF);// 地址高字节spi_lora_rw(addr&0xFF);// 地址低字节for(uint16_ti=0;i<size;i++){spi_lora_rw(data[i]);}lora_nss_ctrl(1);// 拉高片选returnRAL_STATUS_OK;}ral_status_tral_sx126x_read(constral_t*ral,constuint16_taddr,uint8_t*data,constuint16_tsize){lora_nss_ctrl(0);spi_lora_rw(0x03);// 读命令spi_lora_rw((addr>>8)&0xFF);spi_lora_rw(addr&0xFF);for(uint16_ti=0;i<size;i++){data[i]=spi_lora_rw(0xFF);// 读数据}lora_nss_ctrl(1);returnRAL_STATUS_OK;}// 替换复位函数ral_status_tral_sx126x_reset(constral_t*ral){lora_reset();returnRAL_STATUS_OK;}

4. LoRa PA功率配置适配(CH584M供电)

保留原Heltec等板子的PA配置(heltec_wifi_lora_32_v3.c),适配CH584M的供电能力:

// 调整PA功率(CH584M 3.3V供电,建议最大20dBm)constsmtc_shield_sx126x_pa_pwr_cfg_tsmtc_shield_sx1262mb1das_pa_pwr_cfg_table[]={// 仅保留-9~20dBm配置(删除超20dBm项,避免供电不足){// -9dBm.power=3,.pa_config={.hp_max=0x01,.pa_duty_cycle=0x01,.device_sel=0x00,.pa_lut=0x01},},// ... 保留中间功率档 ...{// 20dBm.power=22,.pa_config={.hp_max=0x06,.pa_duty_cycle=0x03,.device_sel=0x00,.pa_lut=0x01},},};

五、LoRaHub核心逻辑适配

1. 移除Packet Forwarder网络传输,改为本地处理

修改lorahub_hal_rx.c,删除UDP发送,改为串口打印数据包:

voidlgw_hal_rx_packet_process(void){structlgw_pkt_rx_srx_pkt;if(lgw_hal_rx_read(&rx_pkt)==LGW_HAL_SUCCESS){// 原UDP发送逻辑删除,替换为串口打印UART1_SendString("LoRa RX: ");for(uint16_ti=0;i<rx_pkt.size;i++){UART1_SendHex(rx_pkt.payload[i]);UART1_SendChar(' ');}UART1_SendString("\r\n");}}

2. 替换ESP32日志为CH584M串口日志

esp_log.h替换为CH584M串口打印:

// 替换ESP_LOGI/E等宏#defineLGW_LOGI(...)UART1_SendString(__VA_ARGS__)#defineLGW_LOGE(...)UART1_SendString("ERROR: ");UART1_SendString(__VA_ARGS__)// 示例:替换原ESP_LOGI(TAG, "xxx")// ESP_LOGI(TAG_HAL, "LoRa init ok"); → LGW_LOGI("LoRa init ok\r\n");

3. 适配TMOS的低功耗(可选)

CH584M支持低功耗,结合TMOS实现LoRa休眠时MCU低功耗:

voidlora_enter_sleep(void){ral_set_op_mode(&lgw_ral,RAL_OP_MODE_SLEEP);// LoRa休眠TMOS_LowPowerEnter();// TMOS进入低功耗}

六、编译与调试

1. 编译环境配置

  • 工具链:MounRiver Studio(MRS),导入CH584M TMOS SDK;
  • 工程配置:
    • 加入裁剪后的one_channel_hub核心代码(radio_drivers、smtc_ral、liblorahub);
    • 宏定义:CONFIG_RADIO_TYPE_SX1262(根据实际LoRa芯片)、CH584MTMOS
    • 链接脚本:使用CH584M官方link.lds,适配64KB RAM/512KB Flash。

2. 调试关键点

  1. 硬件接线:确认CH584M与LoRa模块的SPI/DIO1/BUSY/RST引脚连接正确;
  2. SPI速率:CH584M SPI速率≤10MHz(建议3.75/7.5MHz),避免LoRa通信异常;
  3. 中断优先级:GPIO中断优先级高于TMOS定时器,避免事件丢失;
  4. 射频参数:修改lorahub_hal.crxrf_conf(频率)、rxif_conf(扩频因子/带宽)适配本地频段。

七、核心适配清单

原ESP32/FreeRTOS接口CH584M/TMOS替代接口
spi_bus_initializeSPI0_MasterDefInit()+ 自定义SPI读写
gpio_reset_pin/gpio_set_levelGPIO_ModeCfg()/GPIO_SetBits()
esp_timerTMOS_TimerCreate()/TMOS_TimerStart()
xTaskCreateTMOS_TaskCreate()
xEventGroupWaitBitsTMOS_EventPend()/TMOS_EventSend()
esp_log.hCH584M UART串口打印
FreeRTOS延时TMOS_DelayMs()/TMOS_DelayUs()

通过以上适配,one_channel_hub的核心LoRa功能可在CH584M+TMOS平台稳定运行,且彻底移除了WiFi/HTTP等网络相关代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 5:22:08

进阶指南:BrowserUse + AgentRun Sandbox 最佳实践

作者&#xff1a;辰泉 提示&#xff1a;本文是 AgentRun Browser Sandbox 快速上手实践指南的姊妹篇&#xff0c;专注于高级集成方案、生产环境的最佳实践、性能优化和部署策略。如果您还没有完成基础学习&#xff0c;请先阅读《快速上手&#xff1a;LangChain AgentRun 浏览器…

作者头像 李华
网站建设 2026/4/16 19:33:58

RDMA设计36:验证环境设计

本博文主要交流设计思路&#xff0c;在本博客已给出相关博文160多篇&#xff0c;希望对初学者有用。注意这里只是抛砖引玉&#xff0c;切莫认为参考这就可以完成商用IP设计。 验证平台的主要功能是为待测设备提供激励信号并监测其相关接口&#xff0c;通过与参考模型的结果进行…

作者头像 李华
网站建设 2026/4/17 18:57:44

零基础玩转风格迁移与GAN:原理讲透 + 趣味实战,快速生成艺术图与创意图像

文章目录 零基础入门风格迁移与GAN:从原理到趣味实践 引言:当技术邂逅艺术,AI如何玩转“风格穿越”? 一、风格迁移:让图像在艺术风格间“穿越” 1. 什么是风格迁移? 2. 如何实现风格迁移?靠神经网络“拆解+重组” (1)内容损失:确保“灵魂不变” (2)风格损失:确保“…

作者头像 李华
网站建设 2026/4/17 7:25:13

BRC-200控制器板

BRC-200 控制器板BRC-200 是一款用于工业自动化系统中的 控制器板&#xff0c;主要承担系统核心控制、逻辑运算与数据处理任务&#xff0c;常作为控制系统的主控单元或智能控制节点使用。主要功能与特点&#xff1a;作为系统核心控制单元&#xff0c;执行控制逻辑与运算任务支持…

作者头像 李华
网站建设 2026/4/17 1:21:30

鼎捷ERP和MES系统集成方案详解,如何实现现有软件无缝对接?

某汽车零部件制造商通过上述方法将ERP与MES系统对接后&#xff0c;生产数据流转效率提升40%&#xff1b;某零售电商平台整合订单与仓储系统&#xff0c;使订单处理时长缩短至500毫秒内&#xff0c;错误率下降至0.01%。为实现新系统与既有架构的平滑集成&#xff0c;应基于业务流…

作者头像 李华
网站建设 2026/4/17 17:35:01

【课程设计/毕业设计】基于协同过滤推荐算法的线上安全教育平台设计与实现基于springboot+协同过滤课程推荐的线上安全教育平台【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华