本帖最后由 imwangwang79 于 2022-7-3 23:22 编辑

CH32V307 一款超实用的MCU,专注于数据互联
你是否在项目中曾经为设计一个数据Router而苦恼,比如说有8个使用串口通讯的数据源,每个数据源使用高码率的串行时钟通讯(921600bps);数据会送到上位机统一处理,然而一般的MCU由于AHB的CLK都较低,只配备了USBFS的快速数据传输接口;USBFS (12Mbps)的理论带宽在实际使用中往往需要折半冗余来考虑设计(6Mbps),于是USBFS便没法以高可靠率来承载8个串口同时的并发数据传输, 921600 * 8~7.3Mbps。为了满足这类苛刻的要求,设计人员往往必须加上额外的USB2.0(480Mbps)芯片来满足要求,最常用的要数NXP的FX2,这类芯片往往以GPIO PORT的方式和MCU通讯,这又会给程序开发人员出了难题,到底是大量的使用CPU来读写GPIO PORT,还是设计非常复杂的TIM DMA来响应外置芯片的中断和数据读写。这都给后继的程序开发带来了不小的难度和复杂性。现在有了CH32V307,相信在此类应用中碰到的难题会迎刃而解,不光如此,这块芯片还给我们带来了更多有意思的模块。
chip_modules.png
简单的看芯片设计的框图,就能看到有4种典型的应用。
作为Router:
* 可以把UART数据透过USBHS送到上位机,此处强调速率带宽,内置USB 2.0 480Mbps PHY
* 可以把UART数据透过Ethernet送到上位机,此处强调距离,因为芯片只带了10Mbps的PHY
* 可以使用内部ADC(12bits)精度采样,或者透过SPI/I2C/I2S/CAN等接口连接外置高精度采样芯片或者Sensor等,把相关的数据透过USB
送到上位机,此处强调接口的丰富性。
作为离线的Logger:
可以使用SDIO接口操作SD/EMMC卡,48Mbps的速率,支持UHS需要外接VoltageLevel Shift芯片,作为离线数据采样存储;集成低电管理,能以低功耗在使用电池的局限情况下从其他接口处获取数据并长时间的存储数据。
南京沁恒公司设计这款芯片的初衷我相信也是为了”Connectivity”。其实南京沁恒在业界也是老熟悉了,每一个搞嵌入式开发的工程师都曾经用过他们的USB2UART芯片,大名鼎鼎的CH340曾经横扫江湖,打的老牌的FDTI毫无还手之力。这次他们集成了RISC自主内核,又集各类互联接口于一身,肯定又要在相关的领域掀起一番血雨腥风。
这次有幸申请到沁恒的板子,要细细研究和设计应用案例需要大量的时间,规定的交稿日期对于一个辛苦打工人来说其实不太够用,简单的点灯编译等除了能用来验证下板子好坏外,实在没有什么营养,做一遍味如嚼蜡。细想之后,先在规定时间内发表一篇水文埋个桩子,后面再慢慢送上更新吧。
项目的选型往往是一个细致活,并不是拿到一块板子后就赶紧上手劳作一番,这样反而事倍功半。一般研读Datasheet和各种参数也要一周左右的时间。我花了一点时间,浅尝辄止的看了一下CH32V307相关的DataSheet,做了一些分析点评供读者参考。
system_arch.png
从芯片的系统架构来看,除去RISCV的Core不谈,其他分为高速外设和低速外设;高速外设应该都是沁恒需要购买的外置IP核心。低速外设则按照APB1/2的CLK分频方式归为两类,和STM32极为类似。
clk_tree.png
从时钟框图可以清楚的看到,USBPHY的480Mhz是由USB 内部的锁相环提供,在APB总线下还挂有USB Full Device的模块,与USB2.0公用OTG模块。相信USBFS应该有单独引脚bypass OTG模块单独引出,这样在使用高速USB接口的同时,还可以使用USBFS的HOST功能。Ethernet也是可以外接时钟和PHY从而把速率升高到Gbps,这样就可以几乎覆盖嵌入式开发中现有的绝大部分带宽需求了。其他CLK的分配几乎和STM32一模一样,进一步减少了开发的难度。
还需要进一步研究的还有DMA和TIM模块,这两个模块一起配合使用,在很多应用中能大量offload CPU的工作,并且能够利用纯硬件功能高速访问外设从而达到稳定的传输速率;避免CPU往往会因为中断,线程切换等原因,从而使传输速率发生抖动,在某些边缘条件下会导致内存溢出等问题。
CH32V307 DMA和TIM的功能几乎完全照搬了STM32F4系列,这对于经常使用STM32的工程师非常友好,但我心中也有些为国产器件的CopyRight问题担心。
CH32V307还非常慷慨的加持了DAC和OPA模块;这为一些特殊应用增加了可能,比如说设计血氧检测设备,和信号发生设备等。

下面是点灯试板过程:
首先用官方提供的IDE打开rtthread样板工程;RTThread是国内相关公司开发的一套实时操作系统,以我的经验来看,它应该是脱胎于最早的C++实时OS Ecos,早年的MCU内存非常稀有,Ecos因为使用面向对象的设计,编译出来的bin一般会比较大,所以使用的人不多。但现在MCU一日千里,资源也越来越丰富,rtthread也从此风生水起。
Rtthread参考了很多Linux的思想,尽可能的用层级概念来封装硬件并抽象为软件实体;拿GPIO为例,底层有GPIO的寄存器相关配置,往上抽象为GPIO驱动,再往上抽象为PIN实体,在上层程序中就只要考虑抽象的PIN脚了。抽象的PIN脚和硬件的PIN脚并不是完全一样的,对应的关系写在了底层的mapping表中。点灯便是透过操作虚拟PIN脚来完成。
code_dependency.png
GPIO_mappingtable.png
值得一提的是RTTHread提供了一个内嵌的console;只要把依赖的UART相关的硬件打通,rtthread就可以透过串口提供一个类似Linux shell的通讯机制。开发人员可以非常方便的来扩展命令行的功能,并把自己扩展的功能模块化。下图LED就是一个很好的案例。后面如果想测试其他的硬件模块,也可以如此这般来设计模块,并创建自己的driver和抽象实体来封装底层细碎的接口。
module_example.png
下载等说明官方提供的文档里面都有说明,就不再赘述,shell跑起来后可以从串口中看到如下提示
board_console.png
板子便开始亮灯了。
board.jpg