
基于STC32G12K128的核心开发板
简介
基于STC32G12K128-35I-LQFP64的核心开发板,一款通用性很强的核心板,板载RGB/LED/BLE5.0、IIC传感器模块,标准SPI接口和IIC接口拓展,P0口完全引出。可玩性强!
简介:基于STC32G12K128-35I-LQFP64的核心开发板,一款通用性很强的核心板,板载RGB/LED/BLE5.0、IIC传感器模块,标准SPI接口和IIC接口拓展,P0口完全引出。可玩性强!开源协议
:GPL 3.0
描述
本次训练营,笔者基于STC32G12K128设计了一款通用性兼可玩性的核心板/开发板。板载LED/KEY/RGB/BLE 5.0 /SPI常用脚序插座(可满足大部分SPI模块,特别是OLED的拓展)/IIC常用脚序插座(可满足大部分IIC模块接入拓展)/TF卡模块/XGZP68系列绝压传感器模块/无源蜂鸣器等。另外设置了外部VREF可选开关(2.4999V和3.3V),以及离线使用电池供电和低功耗时快速放电的可选开关。
其中相关模块的设计,可见下图:
由于核心板设计紧凑,空间有限,仅把最常用的P0口尽数引出,P0口相关的外设和部分引脚功能也在上图中标注出来。
一、实物展示
二、外形设计
作为开发板,应具备有启蒙和快速应用的功能,这是核心的功能需求。
设计要点1:因此需要引出一组到多组的GPIO口。定位简单入门,小巧型,核心板,因此这里选1组~2组;
设计要点2:板载程序下载模块,一个核心板同时具备下载和编程两种功能,就可以更方便用户使用,而不需要过多的"文具"——这里必须要补充说明一下,这里是自嘲,不是针对在座的各位。因为我是差生,而且我文具贼多;
设计要点3:Type-C口,跟上潮流!
设计要点4:最大限度地聚合核心板要素,能够最大限度挖掘STC32G12K128的性能;
设计要点5:拥有LED和KEY这类交互要素;
设计要点6:能够开发一般类器件和模块拓展(如OLED模块,传感器模块等)(常用的外设SPI/IIC/USART/PWM等);
设计要点7:帅;
设计要点8:核心板应拥有layout指南的规范,按照通用规范做系统电路,增设ESD等电路措施,以便二次开发工程师进行直接cv;
但我希望它普通,但又不平凡。这可能很矛盾,但思量后发现并不冲突。因此多了下方一个设计要点>>>
设计要点9:该板本身可以直接做一个项目,而不需要连接任何模块或线缆。
笔者预期想做一个跟水有关的项目:
【3m~5m深度的水下压力检测】笔者不是专门给钓鱼佬的开发的哈,悉知。
这个项目需要几个东西:(1)数据采集(2)数据保存(3)离线电源
增加清单 | |
---|---|
需求 | 对策 |
压力数据采集 | 绝压传感器(XGZP68系列) |
数据保存 | BLE 5.0 或 TF卡离线存储 |
离线电源 | 电池供电接口 |
基于上述设计要点,笔者对器件等进行简易布局和估算后,可以得到如下的外形图
(也许各位客官看着感觉很马六,但是实际上初稿仅仅是只有30x75的边框和四个d=2mm的定位孔而已,都是调了一版又一版本调出来......再说下初稿其实不是这个,初稿寄了,最后彩蛋给大家放一下。)
三、原理图设计
(1)芯片核心与外围设计【使芯片正常工作必备的电路部分】
2024年6月18日,在1000块钱的诱惑下,读了2天STC数据手册,总结出来一个事儿:STC芯片正常工作,只需要(以STC32G12K128-35I-LQFP64为例)
STC芯片工作必备要素表(最低要求) | |
---|---|
序号 | 说明 |
① | 电源脚PIN19接1.9V~5.5V电压,电源脚PIN21接GND |
② | VREF+脚PIN20要么接VCC和PIN19共脚,要么接参考电源,有这个脚的芯片不可悬空该脚 |
③ | UCAP脚PIN17接一个100nF的退耦电容到GND |
就是这么极致的简单!!!
(2)实现USB硬件直接下载的电路【一个芯片同时可以下载和运行程序】
也是那1000块钱,笔者在研究了手册之后,发现STC芯片硬件USB直接下载程序,过程极其简便:
在P3.2口低电平的时候,给MCU供电,直接进入USB下载模式,等待程序烧录。
①设计一个拉低P3.2口的按键电路:
②选用一枚有EN引脚的LDO芯片,同样用按键控制MCU电源使能:
【下载程序步骤:按住P3.2_KEY,按下POWER_SW_KEY,松开POWER_SW_KEY,进入USB下载模式】
(3)TYPE-C输入电路设计和ESD相关设计:
①这里注意到需要用TYPE-C进行USB通信,因此需要至少16PIN以上的TYPE-C接口,USB线路的ESD选用通用的2路ESD(USBLC6-2SC6),为了适配TYPE-C取电,需要将CC1和CC2分别通过5.1k电阻接地;
为了适配可能不焊接ESD芯片节约成本,这里放置两个22R电阻位,R10和R11用来替代ESD芯片(2选1)
②对输入电源做tvs浪涌抑制和简单滤波
(4)做交互LED、KEY、BEEP
①电源指示灯,这里参考了STC8051U大学计划实验箱V1.0版本的原理图,使用NPN+P-MOS的方案来控制MCU电源使能,顺便点个电源灯,告诉用户,系统接入了+5V电:
②LEDs,这个不是随便选的,这里P6.0和P6.1除了具备GPIO功能外,还能映射PWM外设。后期可以用PWM进行点灯。点灯工程师福音。
③PWM点灯都来了,上一个RGB放在板中间,这是超人的光之信仰:
④由于板子的篇幅,同宽度只能再放一个KEY了,选择P5.4口,P5.4口可以映射到RST功能【这里的R16和C17选焊,一般不需要,因为STC已经将外部复位做到片内了,极致简约的外围!】:
⑤增加一个蜂鸣器,无源蜂鸣器,使用PWM驱动:
(5)VREF和BAT接口设计
这个VREF电路时借鉴大佬的,暂不知设计者是谁,但是大家可以来这个贴子欣赏一下大佬的分析:
一个很精妙的高精度电压基准电路 by micespring
为了省流,大家也可以直接看如下公式:
V_U2_PIN1 = 2.495/220K*(220K+120K) = 3.86V
I_431 = (VCC-2.495)/2M + (3.86-2.495)/680
(忽略2M时)I_431 = (3.86-2.495)/680 = 0.002A = 2mA = 431的手册数据最佳电流值
假设VCC每变化1V,431的工作电流变化1/R7 = 0.0000005A=0.5uA。连1微安都不到。431永远工作在2mA的恒定电流中,任VCC如何变化,都不会发生改变。保证其能一直输出稳定的参考电压。
电池电路接口就不过多介绍,简单说就是用0603的封装,到时候用来焊接电池的正、负极。
为了避免电池和LDO电源冲突,这里使用肖特基二极管,同时配合上面的肖特基二极管,用来选择MCU电源。
(6)外部晶振,简单做一个外部低速晶振,在恶略环境下使用外部时钟源提高RTC的精度
(7)绝压传感器模块,IIC通信
(8)BLE 5.0蓝牙,主用透传功能(RF-BM-4044B4,必要时直接开发芯片CC2460,保留二次开发接口)
(9)TF卡模块,使用SPI协议(注意保留各端口上拉电阻,实际上STC芯片内部可以单独设置上/下拉)
(10)最后,做一个排针拓展,常用SPI排序和IIC排序,为了对称,把PWM拉2各,在拉1组串口:
看一眼完整的图
四、PCB设计
接下来就是layout作业,此处省略100字。
(1)前期已经设计好基本的外形、对主要元器件进行了合适布局layout工作主要是.....此处省略100字;
(2)设计丝印——重要。对重要的功能进行丝印覆盖,特别是接口部分,拓展接口进行文字功能描述,方便用户进行对照使用和拓展其他模块接入!
五、焊接和组装
反正我焊完了,那么就可以大声说:有手就行!
备注:如果你没有焊完,那就按照先焊接贴片,然后焊接按键...这种传统手艺进行就行。不是很难就不过多进行说明。
六、部分电路模块电压节点测试
(1)焊接完电源部分,测试VCC和GND是否短路,再接入TYPE-C测试LDO输出是否≈3.3V;
(2)焊接完VREF部分,测试VCC和GND是否短路,再接入TYPE-C测试LDO输出是否≈2.495V;
(3)焊接完全部,测试VCC和GND是否短路,再接入TYPE-C测试其他例程!
七、核心板例程/程序设计
(1)GPIO_点灯
点灯大师上线,由于是第一个工程,笔者会特别特别特别详细,和大家汇报一下如何使用环境和编程,如果只需要例程或知道如何编译下载程序的,可以跳过本节。【本节是啰嗦模式】
①先看硬件,硬件中三颗LED的功能:PWR_LED插入TYPE-C就点亮,起到电源指示灯的作用;
LED2和LED3分布在核心板下方,使用低电平驱动(大白话就是低电平的时候,该LED点亮,同理,非低电平则熄灭)
【忘了图的滑滑滑滚轮去上边 第三章 第(4)节查阅】
②建立以STC32G12K128为核心的KEIL 5 MDK工程:
选择核心
魔术棒设置芯片Memory Model 为XSmall(官方推荐模式)
勾选生产HEX文件,并设置下HEX的具体格式(HEX-386)
建立.C文本作为main.c(程序会写在这里)(注意下引用头文件)
将P6.0和P6.1设置为推挽输出模式(学会看手册)
再写逻辑(LED2和LED3交替闪烁,闪烁间隔500ms)
进行编译
下载前准备工作
③观察实验现象
(2)INT0_KEY
中断,顾名思义就是如果给出一个中断信号,(若中断信号优先级高于当前工作)则必须暂停当前行为,去执行对应的中断服务。
在STC32G12K128中,以INT0为例:
INT0相关寄存器操作 | |
---|---|
寄存器 | 说明 |
IE0 | 外中断0标志位 |
EX0 | INT0使能位 |
IT0 | 触发沿(1:下降沿)(0:上升/下降沿) |
EA | 总中断使能位 |
按寄存器描述初始化相关参量
编写中断服务函数
编写事件触发
观察实验现象
(3)PWM_BEEP
了解无源蜂鸣器驱动方法:
从数据手册中,可以看到当蜂鸣器驱动频率达到共振频率@4kHz时,声压达到最大值,约为83dB(具体共振频率和最大声压分贝要在所选用的器件数据手册查询得)
常用的驱动方式见笔者原理图,或者下图:
那么该例程的核心工作就是编程一个4KHz的、占空比为50%的、PWM波形即可让蜂鸣器BB
打开数据手册,查询PWM频率计算方法:
设工作主频为24MHz,不分频,则理论算得:
PWMx_ARR = (24MHz / 4kHz) - 1 = 5999
设置占空比
初始化PWM相关
可以编写逻辑【预设使用按键INT0,切换蜂鸣器的状态:蜂鸣器响时,两个LED亮起;蜂鸣器静默时,两个LED熄灭】
备注:初始化LED和INT0的内容前期例程描述详细,这里略去讲解(实际已经写在例程中)避免过多冗余。
观察实验现象
(4)TIM0_
定时器中断定时触发事件,是单片机应用的基础课,常用于各种自动程序中,拥有广泛的应用场景。
以TIM0为例,建立工程,完成定时1秒触发事件任务:
这次先建立逻辑(定时1ms中断1次,则1000次中断触发事件任务:任务是翻转LED2和LED3的电平,实现交替亮灭)
补充定时器0初始化和定时器0中断服务函数(直接参考官方库函数即可)
在1ms中断函数中,将1ms的标志位置为高,返回到主函数中进行处理
观察实验现象
(5)USB_HID_DEBUG
笔者设计图纸中,TYPE-C直接联通了STC32G12K128内部的USB,因此可以利用STC提供的API进行USB-HID协议打印,用作程序类串口调试。
需要使用STC官方提供的一套"stc_usb_hid_32g.LIB"库文件,就可以简便的使用USB接口进行数据通信:
将该库添加到工程中:
按照STC-USB-HID规范,调用STC的API:
添加必要程序:
主循环里添加USB接收判断、应答指令并简单写一个P32按键触发:
在STCAI-ISP工具中,按下图进行操作设置:
按下P32/INT0按钮,触发打印:
(6)BIT_WS2812B
笔者大意失算了,这款MCU没有DMA直传到PWM,但问题不大,咱们用传统异能!
先了解WS2812B的解码协议:24bit(RGB 888)数据传输,菊花链式的每颗WS2812B都截获24bit,后将数据以不高于800KHz的速度传递给下一颗:
0,1码根据输入码型图,可知道在一个周期中,T0L占比高为0码,反之为1码:
码元周期最小值为0.89us,码型时间的典型值如下表所示:
那么对一个IO口来说,首先设置为准双向口或者推挽输出(建议),0码则需要先置为高+少量延时+置为低+大量延时,满足0码型时间;同理,1码需要先置为高+大量延时+置为低+少量延时,满足1码型时间。
那么us级别的延时,使用_nop_()指令:NOP指令执行时间 = 1/systemCLK * 1T
假设主频是24MHz,那么一个NOP指令的时间约为0.0416us,我们建立一个表格方便构写满足时许:
WS2812B码型表 us | ||
---|---|---|
高电平 | 低电平 / | |
1码 | 0.595us | 0.295us |
0码 | 0.295us | 0.595us |
WS2812B码型表 NOP MIN | ||
---|---|---|
高电平 | 低电平 | |
1码 | 0.55/0.0416 = 13.22 | 0.2/0.0416 = 4.80 |
0码 | 0.2/0.0416 = 4.80 | 0.55/0.0416 = 13.22 |
WS2812B码型表 NOP typical | ||
---|---|---|
高电平 | 低电平 | |
1码 | 0.595/0.0416 = 14.3 | 0.295/0.0416 = 7.09 |
0码 | 0.295/0.0416 = 7.09 | 0.595/0.0416 = 14.3 |
WS2812B码型表 NOP MAX | ||
---|---|---|
高电平 | 低电平 | |
1码 | 1.2/0.0416 = 28.84 | 0.35/0.0416 = 8.41 |
0码 | 0.35/0.0416 = 8.41 | 1.2/0.0416 = 28.84 |
写进函数备用:
写两个应用程序:
单色呼吸灯:
幻彩呼吸灯:
观察实验现象(只放幻彩)
(7)IIC_XGZP68
STC32G硬件IIC需要切换到对应的引脚,笔者使用P3.2和P3.3组:
还需要主机模式时,注意将对应IIC引脚设置为准双向口,特别时SCL,此时为输出模式。由于外部笔者焊接上拉电阻,因此设置为开漏输出:
IIC通信,需要知道模块IIC地址,从数据手册中进行查询:
注意地址需要左对齐,符合标准的8bit IIC通信协议:
所用的型号XGZP6828D,寄存器列表:
在这个列表中,可知读取0x06、0x07、0x08,获取大气压力测量数据;读取0x09和0x0A获取温度测量数据
数据按照MSB CSB LSB进行对齐并转换运算,运算公式参考数据手册:
同理温度数据也如此进行转换。
用上前面章节的USB_HID进行数据打印调试:在程序中,先读取数据,再点灯提示,再输出打印数据
观察实验现象
(8)BLE_USART
主要使用透传功能,在原理图中,笔者BLE模块连接到P1.0和P1.1口:
需要将S2_S设置为0,映射引脚
BLE需要将EN引脚置为0,使能模块,让其蓝牙模块可以被手机端连接
还需要将BRTS置为0,当且仅当有数据需要发送时
在程序中,对USART2进行设置:115200波特率,中断使能,接收使能:
写一个简单的透传验证程序,定时发送”ABCD”:
观察实验现象
(这个较大,参考附录文件)
(9)单板成项,项目构建思路:
https://www.bilibili.com/video/BV17B8qeqECN/
八、附录
【附录1】STC IDE MDK环境安装说明
注:需要安装KEIL MDK 5,安装C251编译环境。并使用STCAI-ISP V6.94H工具将STC系列芯片的头文件导入到KEIL MDK 5中,才可以进行相关的例程使用。
下载地址:
STCAI-ISP V6.94H 完整版
STCAI-ISP V6.94H 精简版
【附录2】相关数据手册
相关数据手册包含在例程中,pdf格式,
【附录3】例程/程序设计参考引用说明
注:本开源工程中大部分例程参考官方例程进行改写,下载地址:STC官方库函数(STC32G12K128)
【附录4】初稿彩蛋
初稿仿UNO-R4-WIFI版的查理灯阵和MEGA2560的布局也挺帅阿啊啊,但超了点长度,寄了。
初稿是STC32G12K128+STC8H2K08U做全功能引出。本文开源的PCB阉割了至少2组IO口。
------------------本文到此-------------------------------------------------------END--LINE-----
相关文件可以在附件中获取哦,路过给个赞呗~!
设计图

BOM


评论