立创EDA训练营:基于STC32G12K128的多功能核心板设计与实战项目解析
立创EDA训练营基于STC32G12K128的多功能核心板设计与实战项目解析大家好我是立创EDA训练营的一名学员。最近我基于STC32G12K128这颗国产高性能单片机设计并制作了一款集成了多种外设的多功能核心板。从画原理图、设计PCB到焊接调试、编写程序最后还用它完成了一个水下压力检测的小项目整个过程收获满满。今天我就把这次从设计到实战的全过程掰开揉碎了分享给大家希望能给想自己动手做开发板或者学习STC32G单片机的朋友一些参考。这块板子麻雀虽小五脏俱全。它板载了BLE 5.0蓝牙、TF卡、绝压传感器、RGB灯、蜂鸣器、按键和LED还设计了外部电压基准和电池供电接口。更重要的是它不仅仅是一块学习板本身就可以直接作为一个完整的水下压力检测项目原型来使用。下面咱们就从设计思路开始一步步来看这块板子是怎么“炼”成的。1. 设计初衷一块“不平凡”的通用核心板一开始我就想设计一块既能学习又能直接做项目的板子。作为开发板它得满足几个基本要求方便入门、功能集成、易于拓展。但我不想它只是个“玩具”我希望它“普通但又不平凡”。这个“不平凡”就体现在它自身就能作为一个独立项目运行。我构思的项目是3-5米深度的水下压力检测。这个需求很明确需要三个核心功能数据采集需要一个压力传感器。数据保存需要本地存储TF卡或无线传输蓝牙。离线电源需要电池供电接口。基于这些我列出了一个“需求对策表”需求对策板载模块压力数据采集绝压传感器XGZP68系列数据保存BLE 5.0 或 TF卡离线存储离线电源电池供电接口你看这样一来板子上的每一个模块都不是摆设都是为了最终这个实战项目服务的。确定了目标咱们就来看看硬件是怎么设计的。2. 核心板硬件设计详解2.1 心脏部分让STC32G跑起来STC32G12K128是一款基于251内核的8位单片机性能强劲。要让芯片正常工作其实非常简单根据数据手册只需要满足三个最低要求供电电源脚PIN19接1.9V~5.5V电压地脚PIN21接GND。参考电压VREF脚PIN20不能悬空要么直接接VCC和PIN19共脚要么接一个更精准的参考电压源。我们板子上做了可选的精密电压基准。USB退耦UCAP脚PIN17接一个100nF的电容到GND。就是这么简单原理图部分就是围绕这三点加上我们需要的各种外设展开的。2.2 特色设计一键USB下载与供电管理为了让板子用起来更方便我设计了一个硬件一键USB下载电路。STC芯片支持通过USB直接下载程序关键是在上电时让P3.2口保持低电平。我的实现方法是用了两个按键P3.2_KEY专门用来拉低P3.2引脚。POWER_SW_KEY控制整个系统电源的开关。下载程序的操作步骤就三步按住P3.2_KEY不放。按下并松开POWER_SW_KEY给系统上电。此时芯片进入USB下载模式用STC-ISP软件就能下载程序了。这个设计的好处是一个Type-C口既负责供电又负责程序下载省去了额外的下载器非常方便。2.3 丰富的外设模块为了让板子好玩又好用我集成了这些模块交互部分两颗用户LEDP6.0, P6.1可复用为PWM、一个RGB全彩灯WS2812B、一个独立按键P5.4可复用为外部复位、一个无源蜂鸣器PWM驱动。通信与存储BLE 5.0蓝牙模块USART2透传、TF卡模块SPI协议、绝压传感器模块I2C协议。拓展接口将最常用的P0口全部引出并专门做了符合常用脚序的SPI和I2C插座方便接驳OLED屏幕等各种模块。电源与基准Type-C输入带ESD保护和TVS浪涌抑制。一个精密的2.495V/3.3V可选电压基准电路用于ADC参考。一个电池供电接口通过肖特基二极管防止与USB电源冲突。所有模块在板子上布局紧凑丝印清晰该有的标识都有焊接和使用起来都很直观。3. 从点灯开始核心板程序开发实战板子焊好硬件测试通过后就可以开始“点灯”了。这里我挑几个有代表性的例程带大家上手。3.1 工程建立与GPIO点灯万事开头难第一个工程咱们详细点。目标是让板子下方的两颗LEDLED2和LED3交替闪烁。第一步建立Keil工程打开Keil MDK5新建工程选择芯片型号为STC32G12K128。在“魔术棒” (Options for Target) 设置中将Memory Model设置为XSmall官方推荐。在Output选项卡中勾选Create HEX File并设置HEX格式为HEX-386。第二步编写主程序新建一个main.c文件首先需要包含STC32G的头文件。#include stc32g.h #include intrins.h void delay_ms(unsigned int ms) { unsigned int i, j; for(ims; i0; i--) for(j1120; j0; j--); // 粗略的毫秒延时根据主频调整 } void main() { // 1. 配置P6.0和P6.1为推挽输出模式 P6M0 0x03; // P6.0, P6.1 推挽输出 P6M1 0x00; while(1) { // 2. LED2 (P6.0) 亮LED3 (P6.1) 灭 P60 0; // 低电平点亮 P61 1; delay_ms(500); // 3. LED2 灭LED3 亮 P60 1; P61 0; delay_ms(500); } }代码说明P6M0和P6M1是端口模式配置寄存器用于设置GPIO的工作模式准双向、推挽、开漏等。我们的LED是低电平驱动所以给0点亮给1熄灭。第三步编译与下载点击编译按钮生成HEX文件。打开STC-ISP下载软件选择正确的芯片型号和串口号。载入刚才生成的HEX文件。按照前面说的一键下载步骤操作按住板子上的P3.2_KEY再按一下POWER_SW_KEY给板子上电然后点击STC-ISP软件的“下载/编程”按钮。看到“操作成功”提示后松开按键复位板子就能看到两颗LED愉快地交替闪烁了。3.2 外部中断与按键控制板子上有一个独立按键连接在P5.4这个引脚可以复用为外部中断0INT0。我们来用它控制蜂鸣器的开关。中断是什么你可以把它想象成门铃。CPU正在屋里干活执行主程序突然门铃响了中断触发CPU就会暂停手头的活先去开门执行中断服务函数处理完再回来继续干活。配置INT0中断的步骤配置中断触发方式我们选择下降沿触发按键按下时引脚电平从高变低。IT0 1; // 设置INT0为下降沿触发打开INT0中断使能EX0 1; // 使能INT0中断打开全局中断开关EA 1; // 使能总中断编写中断服务函数函数名是固定的void int0_isr(void) interrupt 0。void int0_isr(void) interrupt 0 { beep_flag !beep_flag; // 翻转蜂鸣器状态标志位 // 注意中断函数里不要做耗时操作 }在主循环里根据beep_flag这个标志位来决定是否开启蜂鸣器的PWM输出。这样每按一次键蜂鸣器就会在响和静音之间切换。3.3 驱动无源蜂鸣器板载的是无源蜂鸣器需要给一定频率的方波PWM才能发声。其发声原理是内部的压电陶瓷片在交变电场下振动。在4kHz左右时蜂鸣器的声压最大最响。我们的目标是产生一个4kHz、占空比50%的PWM波。STC32G有强大的PWM发生器配置起来很方便。PWM频率计算 公式是PWM频率 系统时钟 / (PWM_ARR 1)。 假设我们使用24MHz的系统时钟要产生4kHz的PWM那么PWM_ARR (24,000,000 / 4,000) - 1 5999。核心配置代码以PWM2通道为例驱动蜂鸣器// PWM时钟不分频 PWMB_PS 0; // 预分频器设置为1 // 设置自动重装载值决定频率 PWMB_ARRH (5999 8) 0xFF; // 高字节 PWMB_ARRL 5999 0xFF; // 低字节 // 设置通道2的占空比ARR的一半即50%占空比 PWMB_CCR2H (2999 8) 0xFF; PWMB_CCR2L 2999 0xFF; // 使能PWM2输出设置输出极性等 PWMB_ENO 0x04; // 使能PWM2输出 PWMB_PSCR 0x00; // 死区控制等这里为0 // 启动PWM计数器 PWMB_CR1 | 0x01;配置好后当beep_flag为1时将PWM输出引脚例如P2.0映射到PWM2蜂鸣器就会响为0时关闭映射蜂鸣器停止。3.4 驱动WS2812B RGB灯WS2812B是一个集成了控制电路和RGB芯片的智能LED只需要一根信号线就能控制无数个。它的通信协议比较特殊是一种归零码对时序要求非常严格需要精确的微秒级延时。通信协议要点每颗灯需要24bit数据8bit绿 8bit红 8bit蓝。数据码分为“0”码和“1”码区别在于一个周期内高电平的占比不同。传输速率高达800kHz每个位的时间只有1.25us左右。由于STC32G没有硬件DMA支持这种协议我们得用GPIO口“硬掰”时序。关键就是写出精确的0码和1码发送函数。// 假设系统主频为24MHz一个_nop_()耗时约0.0416us void send_0(void) { LED_PIN 1; // 高电平开始 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // 约0.29us高电平 LED_PIN 0; // 拉低 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // 约0.59us低电平 } void send_1(void) { LED_PIN 1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // 约0.59us高电平 LED_PIN 0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // 约0.29us低电平 }发送一个灯的数据就是循环24次根据颜色数据的每一位是0还是1调用对应的send_0()或send_1()函数。发送完所有灯的数据后需要保持低电平超过50us作为复位信号。有了这个基础函数你就可以玩出各种花样比如单色呼吸灯、彩虹渐变等。3.5 读取绝压传感器数据I2C通信绝压传感器XGZP68D通过I2C接口通信。STC32G有硬件I2C用起来比软件模拟方便很多。第一步硬件I2C引脚映射我们的传感器接在P3.2和P3.3需要将硬件I2C功能切换到这组引脚。// 将I2C功能切换到P3.2(SDA)和P3.3(SCL) P_SW2 | 0x80; // 开启对XFR的访问 I2CCFG 0x00; // I2C引脚选择位具体值查手册 P_SW2 ~0x80; // 关闭对XFR的访问 // 将P3.2和P3.3设置为开漏模式外部有上拉电阻 P3M0 0x0C; // P3.2, P3.3 开漏输出 P3M1 0x0C;第二步查询传感器地址与寄存器从数据手册查到XGZP68D的7位I2C地址是0x6D。我们需要读取压力值对应的数据寄存器是0x06(MSB),0x07(CSB),0x08(LSB)。第三步读取并转换数据使用STC的硬件I2C库函数发起读取序列。得到三个字节的数据后按照手册公式进行转换压力(Pa) ( (MSB16) | (CSB8) | LSB ) / 26214将Pa转换为更直观的米水柱深度粗略估算1米水柱约等于9806 Pa深度(米) ≈ (压力_Pa - 大气压_Pa) / 9806在实际编程中你需要先初始化I2C为主机模式然后发送设备地址写命令写入要读取的寄存器起始地址再重新发起起始条件发送设备地址读命令连续读取三个字节。这个过程稍微有点绕但参考官方例程很容易实现。3.6 蓝牙透传与数据打印板载的BLE 5.0模块RF-BM-4044B4默认支持串口透传。我们将其连接到MCU的USART2P1.0为RXP1.1为TX。模块使能 模块上有EN和BRTS引脚。EN拉低使能模块BRTS拉低时模块才准备发送数据。我们在初始化时将它们都置为低电平即可。串口配置 配置USART2为模式18位数据可变波特率波特率设为115200并开启接收中断。void UART2_Init(void) { S2CON 0x50; // 模式1允许接收 T2L 0xD0; // 设置波特率重装值对应11520024MHz T2H 0xFF; AUXR | 0x14; // 定时器2为1T模式并启动定时器2 IE2 | 0x01; // 使能串口2中断 EA 1; // 开总中断 }配置好后手机打开蓝牙调试助手搜索并连接名为RF-BM-4044B4的设备就能在手机端收到单片机定时发送的“ABCD”数据也能从手机发送数据给单片机了。USB HID调试 除了蓝牙我们还能利用芯片自带的USB功能实现更强大的调试。STC提供了stc_usb_hid_32g.LIB库让芯片模拟成一个USB HID设备电脑无需驱动就能识别通过STC-ISP软件就能像串口一样收发数据打印传感器读数、调试信息非常方便。4. 单板成项水下压力检测项目实战当所有模块都调试通过后将它们组合起来一个完整的水下压力检测项目就水到渠成了。项目逻辑流程系统初始化配置时钟、GPIO、定时器、I2C、USB HID等。低功耗管理可选如果使用电池供电可以配置MCU进入休眠模式定时唤醒。定时采集利用定时器中断每隔一段时间如5秒唤醒一次。数据读取唤醒后通过I2C读取绝压传感器的压力和温度原始数据。数据处理将原始数据转换为实际的压力值Pa和温度值℃并根据公式估算水深。数据存储/发送本地存储通过SPI接口将数据时间戳、深度、温度写入TF卡文件格式如CSV。无线传输通过BLE模块将数据实时发送到手机App进行显示和记录。状态指示使用RGB灯或LED用不同颜色或闪烁模式指示当前状态如采集、发送、错误等。回到休眠任务完成后再次进入休眠等待下一次定时唤醒。这样一块自己设计制作的核心板就真正变成了一个可用的、功能完整的产品原型。你可以把它放进防水壳连接电池沉入水中它就能默默地记录水深数据了。5. 总结与资源回顾整个流程从需求分析、原理图设计、PCB布局、焊接调试到驱动编写和项目集成这正是一个完整的嵌入式产品开发流程。STC32G12K128这款芯片资源丰富性能足够应对很多中小型项目。立创EDA则让硬件设计变得像搭积木一样直观。给初学者的建议不要怕从点灯开始。遇到问题第一找数据手册第二善用官方例程和库函数。焊接时细心调试时耐心。这个项目所有的源码、原理图、PCB文件我都已经开源你可以在立创开源硬件平台找到这个项目直接复刻一块或者基于我的设计进行修改做出属于你自己的作品。嵌入式开发的乐趣就在于这种从无到有、将想法变为现实的过程。希望这篇长文能为你打开一扇门祝你玩得开心
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419397.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!