news 2026/3/9 21:18:29

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/3/8 1:03:13

Sentinel 开源框架适配说明

开源框架适配 云原生微服务体系 Spring Boot/Spring CloudQuarkus Web 适配 Web ServletSpring WebSpring WebFluxJAX-RS (Java EE) RPC 适配 Apache DubbogRPCFeignSOFARPC HTTP client 适配 Apache HttpClientOkHttp Reactive 适配 Reactor API Gateway 适配 Spring Cloud G…

作者头像 李华
网站建设 2026/3/8 18:00:43

网盘不再有局域网限制!Copyparty 轻量文件管理,随时随地访问

文章目录1 关于Copyparty2 群晖nas部署安装Copyparty3 简单使用copyparty4 介绍cpolar以及群晖安装cpolar5 创建Copyparty的公网地址6 结尾Copyparty 是一款轻量化的跨平台文件服务器工具&#xff0c;集成在单个 Python 文件中&#xff0c;支持 Linux、Windows、macOS 等多系统…

作者头像 李华
网站建设 2026/3/7 0:01:53

企微API自动化:外部群消息高效推送

QiWe开放平台 个人名片 API驱动企微自动化&#xff0c;让开发更高效 核心能力&#xff1a;为开发者提供标准化接口、快速集成工具&#xff0c;助力产品高效拓展功能场景 官方站点&#xff1a;https://www.qiweapi.com 团队定位&#xff1a;专注企微API生态的技术服务团队 对接…

作者头像 李华
网站建设 2026/3/9 15:55:45

分享|生成式人工智能应用工程师职业技术证书含金量

在人工智能的发展过程中&#xff0c;技术革新正重构社会生产与生活的每一个维度。政策东风与行业变革双重驱动&#xff0c;正将生成式人工智能应用工程师推向更高的发展舞台。生成式人工智能应用工程师已超越传统的代码编写者&#xff0c;成为推动产业智能化转型的关键架构师。…

作者头像 李华
网站建设 2026/3/8 7:32:09

【计算机毕业设计案例】基于springboot的面向企业用户的复合型活动基地,活动场地,会议室预订系统基于SpringBoot+Vue的会议室预约管理系统(程序+文档+讲解+定制)

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

作者头像 李华