国产单片机GD32系列开坑,带你零死角玩转GD32 第六章

【开坑国产单片机GD32系列,带你零死角玩转GD32】


第六章 GD32F103C8T6串口开发板设计指南(二)

目录

  • 【开坑国产单片机GD32系列,带你零死角玩转GD32】
  • 第六章 GD32F103C8T6串口开发板设计指南(二)
  • (1)前言
  • (2)硬件设计部分难点
  • (2.1)USB转串口电路设计难点
  • (2.2)MCU晶振电路,BOOT,SWD的设计难点
  • (3)硬件原理图解决方案的设计
  • (3.1)USB转串口电路原理图设计
  • (3.2)MCU晶振电路,BOOT,SWD的原理图设计
  • (4)中场总结
  • (1)前言

    历添新岁月,春满旧山河;

          开头别的先不说,先祝各位彦祖新年快乐!
          新的一年,准备给粉丝们安排一波福利,随机选择五名幸运彦祖,然后你们众筹一块野火Linux开发板送给我吧!
          好的!言归正传!第五章主要讨论了电源接口和电源电路的芯片选型和原理图设计,这一章,要讨论的就是剩下的硬件设计部分,主要包含以下两个内容:

    (I)USB转串口的电路原理图设计。

    (II)MCU晶振电路,BOOT,SWD的原理图设计。

          在开始讨论之前,我先对这两个内容所存在的一些难点进行一个大致的描述,彦祖们如果觉得这些难点自己都没啥问题的话,这篇帖子其实就可以不用看了, 因为篇幅还是挺长的。

    (2)硬件设计部分难点

    (2.1)USB转串口电路设计难点

          这应该是最常用的一个功能了,CH340与PC机通过USB接口和协议通讯,将USB的数据包的有效数据段提取出来,然后将数据通过串口发给其他诸如MCU的下位机,这里主要有以下几个难点:
    (I)CH340的基本原理图如何设计?

    (2.2)MCU晶振电路,BOOT,SWD的设计难点

          MCU的晶振电路,BOOT,SWD以及复位电路,构成了MCU的最小系统,市面上也有很多有关MCU最小系统的资料和商品,可是当我们自己绘制原理图,PCB进行实物制作时,有时候就会出现外部高速/低速晶振不起振,上电后BOOT状态异常,程序执行错误,或者说复位功能失效,压根就没法复位,最让人不能接受的就是下载功能无效,一顿操作猛如虎,一到下载就芜湖,这当中其实涉及到的就是MCU最小系统的原理图设计,主要有以下几个难点:
    (I)MCU的BOOT引脚是干啥的?BOOT引脚如何正确使用?
    (II)SWD下载电路如何设计?

    (3)硬件原理图解决方案的设计

    (3.1)USB转串口电路原理图设计

          在第二点中,我们描述了USB转串口电路原理图设计的三个难点,现在我们依次解决。
    (I)CH340的基本原理图如何设计?
          首先我们需要知道的是,CH340其实本身就是一款MCU,它的作用,就是依据USB协议,将USB数据包中的数据段提取出来,再通过串口发送出去,这里要注意的是,USB转TTL可不是简单的通讯电平转换,USB通信协议的复杂度,已经有一点TCP/IP的影子了,而且USB通讯使用的是差分信号,妥妥的模拟信号,和串口的数字信号解调的原理和思路都是大相径庭的,所以当MCU需要使用串口和上位机进行交互,而PC端的串口不方便使用时,采用一颗USB转TTL的芯片,就成了一种必要了,而CH340的基本原理图,其实就是一个MCU的最小系统原理图了,我们以CH340G为例,它沁恒微电子的产品中,最典型和最具性价比的一款了。
          上面这张图截取自CH340的数据手册,描述了CH340系列USB芯片最基本的时钟,复位,电源等电路的设计,需要手册的彦祖可以点击下面的链接,相关驱动也可以在链接页面下载。

    CH340x数据手册: https://www.wch.cn/download/CH340DS1_PDF.html

          从图中画红线部分内容可以知晓,第一点,CH340G如果想要正常工作的话,必须要外接一个12MHZ的高速晶振,而且还得在晶振两端对地接负载电容,那问题来了,晶振以及配套的负载电容如何选择?这不得去立创商城看看?
          在立创筛选栏中按照如图信息筛选,就会出现一大串可以筛选的晶振,这里选择第一个,作为例子:
          我们一般只需要关注红框内的数据,由于我们筛选的是12MHZ的晶振,而这个晶振的数据手册是为整个系列所设计的,所以我们只需要保证我们使用的晶振频率是厂家所规定的范围内即可,而第二个红框内的数据,就是负载电容的取值范围,规定为10pF和20pF(那个特殊值就不要寻思了),所以在使用这款晶振时,需要对地接两个10/20pF的贴片电容,如果你接的是100pF,甚至10uF这样的电容,极大概率晶振是无法工作的,也不要去接钽电容,电解电容这样的类型,那可真是太秀了。

          第二点,也就是CH340G的电源问题,CH340G的引脚如下图所示,其中关乎电源的,是第16脚VCC,第1脚GND,以及第4脚V3。
          在采用5V供电时,如红线部分所示,V3脚要通过一个0.1uF贴片陶瓷电容接地,而采用3.3V供电时,V3脚就要直接连接3.3V电源了,如下图所示:
          第三点,也就是连接的问题了,CH340G和USB的USB_DP和USB_DN/USB_DM连接,其实这里的DP中的P就是Positive,积极的,而N/M,就是Negative/Minimum,消极的/最小的,对应的就是USB差分信号的两根同幅度,同频率,但是相位不同的信号线,所以要做的,就是将诸如Micero-USB,Type-C这类USB接口的USB数据线和CH340G的USB外设引脚相连,USB_DP连接UD+,US_DN连接UD-,而CH340G的串口则和MCU的串口连接,就像两个MCU的串口连接方式一样,具体连线如下图所示:
          需要注意的是,图中采用的USB接口是Type-C口,Type-C除了供电和USB通讯外,还有充电协议之类的功能,由于我们这里未使用,所以有些引脚就不予连接了。而且Type-C的输出电压在4.75V~5.25V之间,而CH340G在的供电要求如下图所示:
          如果采用的是5V供电的话,其实CH340G是可以适应USB输出电源的波动的,也能勉强适用于一般场景,但是还要考虑诸如MCU,屏幕,传感器之类的器件能否承受这个波动,所以一般情况下,建议采用一个DC-DC的电源芯片将电压稳定到+5V,可能有彦祖已经注意到了,Type-C有两排引脚,而且信号线的顺序相反电源却相同,这正是为正反插功能而设计的,就不用担心插反的问题了。

    (3.2)MCU晶振电路,BOOT,SWD的原理图设计

          这一部分的内容,其实就是一个MCU最小系统的实现,市面上售卖的大部分最小系统开发板也是只包含这一部分功能,最多再加几个LED和按键。
          关于MCU晶振的选型,其实,在第三章已经提及了,关键是要根据数据手册中关于外部高速/低速晶振范围来选型,比如GD32F103C8T6的外部高速晶振HSE,其范围如下图所示:
          所以GD32F103C8T6的HSE晶振选型中,晶振频率不能超过这个范围,另外系统时钟配置及选择功能,在第三章也有提及,需要的彦祖可以去瞅瞅。

          第一点,MCU的BOOT引脚是干啥的?BOOT引脚如何正确使用?BOOT并不是仅仅存在于MCU中,在电脑中也广泛存在,BOOT的来源于Bootstrap,意为“鞋带”,它来自于一句谚语:

    Pull oneself up by one’s bootstraps.

          这句话的字面意思是:“拽着鞋带把自己拉起来”,或者说是:“左右脚互相踩,然后走上天”,这种会让牛顿诈尸的事当然是不可能发生的。但实际上,早期计算机启动就是这么一个矛盾的过程:必须先运行开机程序,然后计算机才能顺利启动,但是计算机不启动的话,就无法运行开机程序,那这个局面如何破解呢?
          时间来到1974年,这一年,第一个微机操作系统,由加里·基尔设计的CP/M(就是下面这个大佬),诞生了,随之而来的,就是第一个BIOS的出现,BIOS的功能之一,就是充当引导程序,将程序加载至运行内存,值得注意的是这款操作系统是基于Intel4004微控制器的,而Intel后期转头去做当时风头正盛的个人计算机和商用计算机CPU了,就把Intel4004的IP版权授权给了诸多厂商,而Atmel购买版权后,于80年代初,推出了MCS-51系列单片机,也就是我们熟悉的AT89C52之类的MCU了,国内的STC89xx系列,也是基于该IP版权开发的。
          言归正题,当时为了解决计算机的Boot问题,厂商将Bootloader代码固化在了系统存储区,正常开机之后,将会首先运行系统存储区的Bootloader,然后Bootloader会将位于Flash的应用代码,加载至SRAM/RAM执行,这里可能会有彦祖要问了,系统存储区在哪?MCU不是只有RAM和Flash么?
          这个是GD32F103xx的存储架构,中间的GD32F103xx从0x0000 0000~0xFFFF FFFF的完整存储架构,可以看到从0x2000 0000到0x2001 8000,标黄的是SRMA的区域,从0x4000 0000到0x4002 4400标红的是一系列外设的寄存器,而标紫的存储区域中,包含的的就是Flash和System memory(系统存储区),可以看到,0x8000 0000到0x0830 0000,标绿的就是Flash区域,而0x1FFF F000到0x1FFF F800标蓝的区域就是系统存储区了,我们进行串口ISP下载的时候,就是系统存储区固化的Bootloader在进行引导,所以系统存储,Flash和SRAM是在32位地址上各自独立的存储空间。
          铺垫了这么久,其实MCU的BOOT功能并不复杂,在GD32F10xx的数据手册中对BOOT功能有以下描述:
          MCU的两个BOOT引脚按照如上图所示的配置方式,可以切换程序启动的位置(这里的1,就是高电平3.3V),但是需要注意的是,BOOT的引脚状态采样,是在上电后的第四个时钟上升沿后便锁定,所以在运行过程中,修改BOOT引脚是莫得用的,只要复位或者重新上电,才会使得更改后的BOOT配置生效,想要更多细节的彦祖可以直接查看GD32F10xx的数据手册,但是需要注意的是,GD32F103C8T6不同于STM32F103C8T6,STM32的BOOT0引脚是可以悬空的,但是GD32的BOOT0引脚必须有一个确定的状态,要么通过10K电阻下拉,要么直接连GND,并且GD32系列的BOOT1在被采样后,可以用作普通GPIO。

    GD32F10xx数据手册: https://www.gd32mcu.com/data/documents/userManual/GD32F10x_User_Manual_Rev2.6_CN.pdf


          第二点,就是SWD电路的设计,在之前的项目设计中,出现过一些SWD连接不上,PC无法识别到MCU的问题,或者说是下载速度一旦设置过高,就会出现下载失败的情况,实际上,这与GD32的SWD驱动能力相较STM32更弱,有很大关系,所以针对这种情况,可以通过以下措施来提高SWD通信质量:

  • SWDIO接10k上拉电阻,SWCLK接10k下拉电阻。
  • 采用电池供电,工作电压如果跌落到2.0V~2.6V区间,ST还能工作,但是部分GD32就有可能无法启动或工作异常。
  • 缩短SWD两个信号线长度,最好15cm以内。
  • 将SWD两根线和GND线编个麻花,缠在一起。
  • 在SWD两根信号线对地各并几十pF小电容。
  • SWD两根信号线任意IO串入100Ω~1KΩ电阻。
  •       更多细节彦祖们可以点击下面链接,前往GD32官网查看相关文档。

    GD32F4xx系列硬件设计指南: https://www.gd32mcu.com/data/documents/userManual/AN056_GD32F4xx_Hardware_Development_Guide_Rev1.0_CN.pdf

    (4)中场总结

          到目前为止,GD32F103C8T6通用的电路原理图设计相关内容就已经讲完了,后续就会集中在GD32F103C8T6的Letter Shell移植的软件部分,预计用两章的篇幅讲完剩下的内容,如果彦祖有啥好的创意项目可以在后台私信我,我争取给他整出来,如果没有的话,下一个开源项目就是某位不愿意透露姓名的彦祖提出的基于GD32的录音笔软硬件设计,最近也打算更新操作系统和数据结构相关的内容,因为要去刷大厂面试题,所以后续也会和大家一起分享这些内容!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 国产单片机GD32系列开坑,带你零死角玩转GD32 第六章

    发表评论