氯吡格雷治什么病| 豆浆喝多了有什么坏处| 一什么耳朵填量词| 什么人不能吃鹅蛋| 守岁是什么意思| 人流后什么叫重体力活| 关羽使用的武器是什么| 滞纳金是什么意思| 眼睛干涩用什么药水| 角鲨烯有什么作用| 农历八月初五是什么星座| 喝醋有什么作用与功效| 手术刀口吃什么愈合快| 扁尖是什么| 怀孕吃什么可以快速流产| 吊销是什么意思| 什么花是白色的| 马桶堵了用什么疏通| 人生苦短什么意思| 突然腰疼是什么原因| 总动员是什么意思| 七月十四是什么节| 陌上花开可缓缓归矣什么意思| 无什么于事| 性生活后尿路感染是什么原因| 女人手心痒是什么征兆| 血清铁蛋白高是什么原因| 什么是微单相机| 什么牌子的沐浴露好| 许三多最后是什么军衔| 萎缩性胃炎是什么症状| 冠状沟是什么| 儿童结膜炎用什么眼药水| 忘不了鱼在中国叫什么| 吃皮蛋不能和什么一起吃| 情定三生大结局是什么| cot是什么| 什么是腕管综合征| 敖是什么意思| 曲率是什么意思| 发烧反反复复是什么原因| 吃什么能治白头发| 滚床单什么意思| girls是什么意思| 浒苔是什么| 奕字属于五行属什么| 牙虫是什么样的图片| 砖茶是什么茶| 堕胎是什么意思| 什么是强直性脊柱炎| 脑梗什么症状| 鳞状上皮内高度病变是什么意思| 紧急避孕药什么时候吃最好| 大运流年是什么意思| 喝什么茶养肝护肝最好| 老母鸡炖什么好吃又有营养价值| 黄瓜为什么叫黄瓜| 拨备覆盖率是什么意思| 嗓子发苦是什么原因| 隔离霜和防晒霜有什么区别| 胃不舒服吃什么食物好| 胎儿左心室强光斑是什么意思| 支气管激发试验阴性是什么意思| 乙肝大三阳是什么意思| 韭菜什么时候种最合适| 肚子胀气放屁吃什么药| 半夜两点是什么时辰| 转移酶偏高是什么原因| 子不问卜自惹祸殃什么意思| 胃肠性感冒吃什么药| 收割是什么意思| 乳糖不耐受是什么症状| 5月26是什么星座| 法脉是什么意思| 放疗与化疗区别是什么| 睡觉起来口苦是什么原因| 眼睛红红的是什么原因| 吃避孕药会有什么副作用| 低盐饮食有利于预防什么疾病| dr拍片是检查什么的| 酸菜鱼加什么配菜好吃| 什么是音调| 自身免疫性疾病是什么意思| 慢性肾炎吃什么药| 人参是什么味道| 两弹一星是什么| 先天性心脏病有什么症状| 人参有什么作用| 子宫肌瘤是什么引起的| 火龙果有什么好处| 高血压突然变成低血压是什么原因| 经常肚子疼拉肚子是什么原因| 汗毛长的女人代表什么| 三点水一个条读什么| 梦见下暴雨是什么意思| 女人为什么会阳虚| 减脂吃什么蔬菜| 皮夹克是什么意思| 土地出让和划拨有什么区别| 一什么车厢| 8月8日是什么星座| 物理压榨油是什么意思| 恋恋不舍的意思是什么| 沙棘是什么植物| 抗核抗体是检查什么病| 什么是矢量| 布鲁斯是什么| 破军星是什么意思| 默哀是什么意思| 下午三点到五点是什么时辰| 怀孕两周有什么症状| 阴囊瘙痒挂什么科室| 杨玉环是什么星座| 包皮什么年龄割最好| 玉兰片和竹笋有什么区别| 三教九流代表什么生肖| 女生下面长什么样| 老虔婆是什么意思| 剁椒鱼头是什么鱼| 喉咙发炎不能吃什么食物| 杀阴虱用什么药最快| lfc是什么意思| 什么叫造口| 乌鸦兄弟告诉我们什么道理| 小别胜新婚是什么意思| 为什么会得子宫腺肌症| 彼此彼此是什么意思| 请问紫苏叶有什么功效| acr是什么意思| 真丝丝绒是什么面料| 盐和醋泡脚有什么好处| 月经一个月来两次什么原因| 人造革是什么材质| 降低转氨酶吃什么药| karcher是什么牌子| 蒲公英什么功效| 甲状腺球蛋白低说明什么| 泡脚什么时候最佳时间| 男人为什么喜欢舔女人下面| 框框是什么意思| 上梁不正下梁歪是什么意思| 脾胃不好吃什么药效果好| 门齿是指什么地方| 什么的南瓜| 舌头上有红点点是什么原因| 狗狗吃南瓜有什么好处| 中医说的湿气重是什么意思| xl什么牌子| 白色糠疹用什么药膏| 肠炎有什么症状表现| 睡觉天天做梦是什么原因| 鸡蛋炒什么| legacy什么意思| 宫颈纳氏囊肿是什么| 艾灸肚脐有什么好处| 什么产品美白效果最好最快| 三尖瓣反流是什么意思| 11月17号是什么星座| Polo什么意思| 尿微量白蛋白高吃什么药| 苹果什么时候吃最好| 男左女右是什么意思| 洲际导弹是什么意思| 臭虫的天敌是什么| 师范类是什么意思| 宝宝打嗝是什么原因| 幻听一般会听到什么| 磬是什么乐器| prp治疗是什么意思| me是什么基团| 什么的耳朵| 尿酸高肌酐高是什么原因呢| 肝看什么科| 评头论足什么意思| 女命正印代表什么| 什么是同性恋| 荷尔蒙爆发是什么意思| 血燕是什么| 6.8什么星座| 什么叫免疫治疗| 成人打虫吃什么药| 同房后小腹疼痛是什么原因| 朗姆是什么| 市公安局局长什么级别| Q什么意思| 冬瓜有什么功效| 为什么一般不检查小肠| 手腕凸起的骨头叫什么| 维生素d3什么牌子好| 不疑有他什么意思| hc是胎儿的什么| 居住证是什么意思| 不稀罕是什么意思| 黑裤子配什么颜色的鞋| 打封闭是什么意思| 为什么会脑梗| 女性一般什么年龄绝经| 阿托品属于什么类药物| 有什么病| 土生金是什么意思| 正部级是什么级别| 口出狂言是什么生肖| 二重唱是什么意思| 白带是什么东西| 六月二十一是什么日子| 三伏天要注意什么| 意有所指是什么意思| 什么是槟榔| 名不见经传是什么意思| 抽血抽不出来是什么原因| trab是甲状腺什么指标| 梦到吃花生是什么意思| 白头发吃什么好| 太阳是什么颜色的| 小孩腰疼是什么原因| 身体容易青紫是什么原因| 麻是什么面料| 心阳虚吃什么中成药| hbalc是什么意思| 一切唯心造是什么意思| 御姐范是什么意思| 避孕药什么时候吃| c14和c13有什么区别| 医生为什么用肥皂洗手| 十月十一日是什么星座| 哺乳期吃辣椒对宝宝有什么影响| 梦见抬棺材是什么意思| 脂蛋白磷脂酶a2高说明什么| 为什么有的人皮肤黑| 桑寄生有什么功效| 吃什么美白| 3.30是什么星座| 伤食是什么意思| 补肾最好的药是什么药| 血糖偏高能吃什么水果| 梦见鬼是什么意思| 复方新诺明片又叫什么| 什么人适合吃红参| 曼秀雷敦属于什么档次| 药店最怕什么样的举报| xy是什么意思| 膝关节退行性变是什么意思| 吃什么可以补阳气| 南通有什么特产| 泥鳅吃什么| 早孕反应最早什么时候出现| 毕业送老师什么礼物好| 133是什么意思| 子宫破裂有什么危险| 亡羊补牢的亡是什么意思| 肝内高回声结节是什么意思| 财代表什么生肖| 属蛇适合佩戴什么饰品| 常喝黑苦荞茶有什么好处| 腰肌劳损是什么原因引起的| 会阴是什么| 尿酸盐结晶是什么意思| 肠胃炎吃什么水果比较好| 部分是什么意思| 三年级用什么笔| 梦见考试是什么预兆| 人流是什么意思| 自变量是什么| 皮肤黄什么原因| 百度
打印
[单片机芯片]

中國首艘國産航母如何命名? 網友首推「台灣號」

[复制链接]
1096|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  CH32V30x和CH32V31x系列是基于青稞V4F微处理器设计的32位RISC-V内核MCU,工作频率144MHz,内置高速存储器,系统结构中多条总线同步工作,提供了丰富的外设功能和增强型 I/O 端口。内置 2 个 12 位 ADC 模块、2 个 12 位 DAC 模块、多组定时器、多通道触摸按键电容检测(TKey)等功能,还包含了标准和专用通讯接口:I2C、I2S、SPI、USART、SDIO、CAN 控制器、USB2.0 全速主机/设备控制器、USB2.0 高速主机/设备控制器(内置 480Mbps 收发器)、数字图像接口、千兆以太网控制器等。产品工作额定电压为 3.3V,工作温度范围为-40℃~85℃工业级。支持多种省电工作模式来满足产低功耗应用要求。系列产品中各型号在资源分配、外设数量、外设功能等方面有所差异,按需选择。

  CH32V303/305/307 产品资源分配:307有8个串口,是8个,没错!!如果用STM32,上H7才可以。

   


  用CH32V3**做串口服务器是理想选择,串口服务器是一种网络设备,想在将8个独立的TTL,RS-232、RS-485或RS-422串口设备连接到以太网,实现串口与网络之间的双向透明数据传输。其核心功能包括:
1,多串口支持:提供8个独立的串口接口,可同时连接多个串口设备。
2,协议转换:将串行数据封装为TCP/IP数据包进行传输,接收端还原为串行信号。
3,双向透明传输:确保数据在串口与网络之间无协议变化地传输,保持原始数据的完整性。
4,远程管理:支持通过Web界面、Telnet或专用配置工具进行远程参数设置和状态监控。
5,多协议支持:内部集成ARP、IP、TCP、UDP、HTTP、ICMP等协议,支持动态IP(DHCP)和静态IP配置。
  灵活的工作模式:TCP Server模式:作为服务器端,等待客户端连接。
  TCP Client模式:作为客户端,主动向服务器发起连接。
  UDP模式:支持快速、低延迟的数据广播和接收。
虚拟串口模式:在计算机上创建虚拟串口,远程设备被识别为本地串口。
6,Modbus网关功能:支持Modbus TCP转Modbus RTU,实现上位机使用Modbus TCP协议对RS-485的Modbus RTU设备的数据采集。
7,多主机功能:支持多个计算机主站同时访问同一个串口设备,适用于一问一答的查询方式。

CH32V307/317串口特点:
  • 多串口配置:CH32V307扩展了8组串口,包括3个通用同步异步收发器(USART1/2/3)和5个通用异步收发器(UART4/5/6/7/8),可同时连接多个串口设备,满足复杂系统需求。
  • 高速通信能力:支持最高9Mbps的波特率传输,满足高速数据传输需求,适用于实时性要求高的应用场景。
  • 灵活通信模式:
    • 全双工/半双工:支持同步或异步通信,适应不同协议要求。
    • 同步模式:USART模块可输出时钟信号,通过CK引脚同步数据传输,适用于需要严格时序控制的场景。
    • 异步模式:采用起始位、数据位、停止位和校验位的组合传输数据,无需同步时钟信号,实现简单灵活。
  • 协议兼容性:
    • 支持LIN(局部互连网)、IrDA(红外数据协会)编码器、智能卡协议。
    • 兼容调制解调器(CTS/RTS硬件流控)操作,满足多样化通信需求。
  • DMA支持:支持DMA操作连续通讯,减少CPU干预,提升数据传输效率,适用于大数据量场景。
  • 中断功能:提供多种中断源,包括接收缓冲区非空中断(RXNE)和空闲线中断(IDLE),便于实时处理数据。空闲中断触发流程中,每接收到一个字节,RXNE标志置1,可通过检测IDLE标志实现帧接收。
  • 低功耗设计:在保持高性能的同时,支持多种低功耗模式(睡眠、停止、待机),适用于电池供电或对功耗敏感的应用场景。
  • 硬件加速:配备硬件堆栈区和快速中断入口,在标准RISC-V基础上提高中断响应速度,确保串口通信的实时性和可靠性。









先编写一个串口打印测试:
main.c
#include "debug.h"


// 简单延时函数(单位:微秒)
void Delay_us(uint32_t us) {
    for (uint32_t i = 0; i < us; i++) {
        for (volatile uint32_t j = 0; j < 7; j++); // 调整循环次数以适配你的时钟频率
    }
}

// 简单延时函数(单位:毫秒)
void Delay_ms(uint32_t ms) {
    for (uint32_t i = 0; i < ms; i++) {
        for (volatile uint32_t j = 0; j < 7200; j++); // 调整循环次数以适配你的时钟频率
    }
}

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        SystemCoreClockUpdate();
        Delay_Init();
        USART_Printf_Init(115200);       
        printf("SystemClk:%d\r\n",SystemCoreClock);
        printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
        printf("This is printf example\r\n");

        while(1)
    {
                printf("SystemClk:%d\r\n",SystemCoreClock);
                printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
                printf("This is printf example\r\n");
                Delay_ms(1000);


        }
}

#include "debug.h"

static uint8_t  p_us = 0;
static uint16_t p_ms = 0;

#define DEBUG_DATA0_ADDRESS  ((volatile uint32_t*)0xE0000380)
#define DEBUG_DATA1_ADDRESS  ((volatile uint32_t*)0xE0000384)

/*********************************************************************
* @fn      Delay_Init
*
* [url=home.php?mod=space&uid=247401]@brief[/url]   Initializes Delay Funcation.
*
* [url=home.php?mod=space&uid=266161]@return[/url]  none
*/
void Delay_Init(void)
{
    p_us = SystemCoreClock / 8000000;
    p_ms = (uint16_t)p_us * 1000;
}

/*********************************************************************
* @fn      Delay_Us
*
* @brief   Microsecond Delay Time.
*
* @param   n - Microsecond number.
*
* @return  None
*/
void Delay_Us(uint32_t n)
{
    uint32_t i;

    SysTick->SR &= ~(1 << 0);
    i = (uint32_t)n * p_us;

    SysTick->CMP = i;
    SysTick->CTLR |= (1 << 4);
    SysTick->CTLR |= (1 << 5) | (1 << 0);

    while((SysTick->SR & (1 << 0)) != (1 << 0))
        ;
    SysTick->CTLR &= ~(1 << 0);
}

/*********************************************************************
* @fn      Delay_Ms
*
* @brief   Millisecond Delay Time.
*
* @param   n - Millisecond number.
*
* @return  None
*/
void Delay_Ms(uint32_t n)
{
    uint32_t i;

    SysTick->SR &= ~(1 << 0);
    i = (uint32_t)n * p_ms;

    SysTick->CMP = i;
    SysTick->CTLR |= (1 << 4);
    SysTick->CTLR |= (1 << 5) | (1 << 0);

    while((SysTick->SR & (1 << 0)) != (1 << 0))
        ;
    SysTick->CTLR &= ~(1 << 0);
}

/*********************************************************************
* @fn      USART_Printf_Init
*
* @brief   Initializes the USARTx peripheral.
*
* @param   baudrate - USART communication baud rate.
*
* @return  None
*/
void USART_Printf_Init(uint32_t baudrate)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

#if(DEBUG == DEBUG_UART1)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

#elif(DEBUG == DEBUG_UART2)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

#elif(DEBUG == DEBUG_UART3)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

#endif

    USART_InitStructure.USART_BaudRate = baudrate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx;

#if(DEBUG == DEBUG_UART1)
    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);

#elif(DEBUG == DEBUG_UART2)
    USART_Init(USART2, &USART_InitStructure);
    USART_Cmd(USART2, ENABLE);

#elif(DEBUG == DEBUG_UART3)
    USART_Init(USART3, &USART_InitStructure);
    USART_Cmd(USART3, ENABLE);

#endif
}

/*********************************************************************
* @fn      SDI_Printf_Enable
*
* @brief   Initializes the SDI printf Function.
*
* @param   None
*
* @return  None
*/
void SDI_Printf_Enable(void)
{
    *(DEBUG_DATA0_ADDRESS) = 0;
    Delay_Init();
    Delay_Ms(1);
}

/*********************************************************************
* @fn      _write
*
* @brief   Support Printf Function
*
* @param   *buf - UART send Data.
*          size - Data length
*
* @return  size: Data length
*/
__attribute__((used)) int _write(int fd, char *buf, int size)
{
    int i = 0;

#if (SDI_PRINT == SDI_PR_OPEN)
    int writeSize = size;

    do
    {

        /**
         * data0  data1 8 bytes
         * data0 The lowest byte storage length, the maximum is 7
         *
         */

        while( (*(DEBUG_DATA0_ADDRESS) != 0u))
        {

        }

        if(writeSize>7)
        {
            *(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);
            *(DEBUG_DATA0_ADDRESS) = (7u) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);

            i += 7;
            writeSize -= 7;
        }
        else
        {
            *(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);
            *(DEBUG_DATA0_ADDRESS) = (writeSize) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);

            writeSize = 0;
        }

    } while (writeSize);


#else
    for(i = 0; i < size; i++)
    {
#if(DEBUG == DEBUG_UART1)
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        USART_SendData(USART1, *buf++);
#elif(DEBUG == DEBUG_UART2)
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
        USART_SendData(USART2, *buf++);
#elif(DEBUG == DEBUG_UART3)
        while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
        USART_SendData(USART3, *buf++);
#endif
    }
#endif
    return size;
}

/*********************************************************************
* @fn      _sbrk
*
* @brief   Change the spatial position of data segment.
*
* @return  size: Data length
*/
__attribute__((used)) void *_sbrk(ptrdiff_t incr)
{
    extern char _end[];
    extern char _heap_end[];
    static char *curbrk = _end;

    if ((curbrk + incr < _end) || (curbrk + incr > _heap_end))
    return NULL - 1;

    curbrk += incr;
    return curbrk - incr;
}



测试结果:nice!!
SystemClk:96000000
ChipID:3173b568
This is printf example
SystemClk:96000000
ChipID:3173b568
This is printf example
SystemClk:96000000
ChipID:3173b568
This is printf example
SystemClk:96000000
ChipID:3173b568
This is printf example
SystemClk:96000000
ChipID:3173b568
This is printf example
SystemClk:96000000
ChipID:3173b568
This is printf example
SystemClk:96000000
ChipID:3173b568
This is printf example





沙发
彩虹捕手| | 2025-7-28 09:39 | 只看该作者
CH32V30x系列的MCU确实性能强大,144MHz的主频和丰富的外设接口,非常适合做串口服务器。
板凳
二月寒风| | 2025-7-29 11:33 | 只看该作者
8路RS485的TXEN 怎么做比较效率高?
评论
abner_ma 2025-7-29 18:08 回复TA
将8路RS485的TXEN引脚通过逻辑门(如与门、或门)或GPIO扩展芯片(如74HC595)连接至单一控制信号,实现同步切换。减少MCU引脚占用:仅需1个GPIO即可控制8路收发状态,节省资源。 时序一致性:避免多路信号独立控制导致的时延差异,确保数据同步性。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

95

主题

181

帖子

3

粉丝
盆腔炎吃什么 脸上长毛什么原因 肋骨突出是什么原因 口幼读什么 冰心的原名是什么
吃激素有什么副作用 下面干涩是什么原因导致的 高筋面粉可以做什么 肾气不足有什么症状 吕布的武器叫什么
梦见订婚是什么意思 不等闲是什么意思 似水年华是什么意思 用膳是什么意思 儿童尿路感染吃什么药
什么是卵泡期 粉丝是什么意思 不典型增生是什么意思 一个丝一个鸟读什么 怀孕之后身体有什么变化
ny什么牌子hcv8jop7ns4r.cn 廿读什么hcv9jop1ns2r.cn 吃什么补气虚最快最好hcv8jop8ns2r.cn 白细胞计数偏高是什么意思hcv8jop5ns4r.cn 腹部胀疼是什么原因hcv9jop1ns5r.cn
血压低有什么危险bjcbxg.com 清心寡欲什么意思hcv8jop5ns1r.cn 肛裂出血和痔疮出血有什么区别hcv9jop1ns2r.cn 办独生子女证需要什么材料sanhestory.com 财代表什么生肖hcv9jop2ns4r.cn
向日葵什么时候种adwl56.com 产妇吃什么好hcv8jop3ns5r.cn 红海为什么叫红海xinjiangjialails.com 低血压适合吃什么食物hcv8jop2ns2r.cn 肝内低回声区是什么意思hcv8jop0ns7r.cn
超敏c反应蛋白高说明什么hcv9jop5ns3r.cn 红细胞减少是什么原因hcv9jop5ns8r.cn 什么叫一个周期hcv9jop7ns0r.cn 血糖高喝什么牛奶好jasonfriends.com 什么叫野鸡大学hcv8jop7ns7r.cn
百度