本工程的MCU选自国民技术的N32G430C8L7,利用内部延时函数和内部ADC实现时间和温度显示的功能
以下主要分两个方面(硬件和软件)讲一下电路和程序的设计
一、硬件部分
1、最小系统
最小系统部分的设计参考自Nation《电路设计指南》的最小系统参考设计原理图

图片有些模糊,资料我在下面都会分享

mcu中预留了tft屏幕的引脚和程序烧录的引脚
这里面我舍去了32.768khz的晶振部分
2、复位按键
当NRST引脚上出现低电平(外部复位) 将产生系统复位。外部NRST引脚复位电路如下。

注意:复位引脚NRST在设计时不能悬空
复位按键上面添加了电阻,也可以不添加这个电阻,添加该电阻可以加快复位相应时间
以下是不添加电阻的电路设计参考图

3、滤波电路
滤波是电路不可或缺的一部分,滤波电路作用是尽可能减小脉动的直流电压中的交流成分,保留其直流成分,使输出电压纹波系数降低,波形变得比较平滑,也可以减小静电对电路的影响,保护电路元器件。
本设计中也存在许多滤波电路,如复位按键的MCU、AMS1117、TYPE_C等电路部分都有滤波电容的存在

这些滤波电容在画pcb时因都尽可能的靠近需要滤波的管脚,如果离的太远那么滤波效果可能也就甚微
4、TYPE_C
USBType-C接口(简称Type-C)是一种通用串行总线(USB)的硬件接口形式,其规范由USB开发者论坛(USB-IF)发布。它的特点在于更加纤薄的设计、更快的传输速度(USB3.1最高10Gbps)以及更强悍的电力传输(最高100W),更重要的是Type-C插接口支持USB接口双面插入,正式解决了“USB永远插不准”的世界性难题。在USBType-C规范发布后,许多新款的Android移动设备、笔记本电脑、台式机甚至是游戏机等3C设备开始使用这种连接端口。
但是本电路中TYPE_C只是用来供电,所以在此选用了6pin的type_c母座

5、0.96寸tft屏幕
屏幕部分参考自开源工程
>https://oshwhub.com/FENG22784321/0-96-tft-cai-ping-qu-dong-ban_copy
这里面有详细的讲解我就不在赘述
以下是我焊接好的屏幕


屏幕显示还是不错的,就是拍的有点模糊了
5、程序烧录
这里主要用了两个GPIO和一组电源线完成

烧录的工具是ST_LINK烧录软件是KEIL,对于的资料我会发在附件
二、软件部分
1、屏幕显示
屏幕的通讯方式是spi
以下是屏幕使用到的管脚初始化函数

屏幕初始化函数
void LCD_Init(void){// RCC_Configuration(); LCD_GPIO_Init();//初始化GPIO LCD_RES_Clr();//复位 SysTick_Delay_Ms(100); LCD_RES_Set(); SysTick_Delay_Ms(100);
LCD_BLK_Set();//打开背光 SysTick_Delay_Ms(100);
//************* Start Initial Sequence **********// LCD_WR_REG(0x11); //Sleep out SysTick_Delay_Ms(120); //Delay 120ms //------------------------------------ST7735S Frame Rate-----------------------------------------// LCD_WR_REG(0xB1); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); LCD_WR_REG(0xB3); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x3C); LCD_WR_DATA8(0x3C); //------------------------------------End ST7735S Frame Rate---------------------------------// LCD_WR_REG(0xB4); //Dot inversion LCD_WR_DATA8(0x03); //------------------------------------ST7735S Power Sequence---------------------------------// LCD_WR_REG(0xC0); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x04); LCD_WR_REG(0xC1); LCD_WR_DATA8(0XC0); LCD_WR_REG(0xC2); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x00); LCD_WR_REG(0xC3); LCD_WR_DATA8(0x8D); LCD_WR_DATA8(0x2A); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x8D); LCD_WR_DATA8(0xEE); //---------------------------------End ST7735S Power Sequence-------------------------------------// LCD_WR_REG(0xC5); //VCOM LCD_WR_DATA8(0x1A); LCD_WR_REG(0x36); //MX, MY, RGB mode if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00); else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0); else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70); else LCD_WR_DATA8(0xA0); //------------------------------------ST7735S Gamma Sequence---------------------------------// LCD_WR_REG(0xE0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x22); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x2E); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x25); LCD_WR_DATA8(0x2A); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x26); LCD_WR_DATA8(0x2E); LCD_WR_DATA8(0x3A); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x13); LCD_WR_REG(0xE1); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x16); LCD_WR_DATA8(0x06); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x26); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x27); LCD_WR_DATA8(0x27); LCD_WR_DATA8(0x25); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x3B); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x13); //------------------------------------End ST7735S Gamma Sequence-----------------------------// LCD_WR_REG(0x3A); //65k mode LCD_WR_DATA8(0x05); LCD_WR_REG(0x29); //Display on}
还有一些调用的显示字符和数字的函数


2、内部ADC——温度采集
2.1N32G430的ADC简介
12 位 ADC 是使用逐次逼近的高速模数转换器。
它有多个通道,19 个通道,可测量 16 个外部和 3 个内部
信号源。 每个通道的 A/D 转换有四种执行模式:单次、连续、扫描或间断。 ADC 转换值存储(左对齐/
右对齐)在 16 位数据寄存器中。
可以通过模拟看门狗检测输入电压是否在用户定义的高/低阈值内,并且
ADC 的输入时钟的最大频率为 80MHz。
ADC 需要三个时钟,ADC_CLK,HCLK, ADC_1MCLK。
HCLK 用于寄存器的访问时钟。
ADC_CLK 为 ADC 的工作时钟,ADC_CLK 有两个源(HCLK 的分频或 PLL 的分频),HCLK 分频与
系统是同步时钟,PLL 的分频与系统是异步时钟,用同步时钟的好处是在触发 ADC 响应触发时,没有
不确定性,用 PLL 的分频时钟的好处是可以独立处理 ADC 的工作时钟,不会影响到挂在 HCLK 的其
他模块。
ADC_1MCLK 用于内部计时功能,在 RCC 中配置,频率大小必须配置成 1M。
2.2ADC对于通道
温度传感器连接到通道 ADC_IN17
2.3温度采集设置
设置 ADC_CTRL2.TEMPEN 位为 1,使能温度传感器和 VREFINT,设备工作时使用温度传感器检测环境温
度。温度传感器采样的输出电压通过 ADC_IN17 通道转换为数字值。温度传感器工作时,理想的采样时间
为 17.1us;当温度传感器不工作时,ADC_CTRL2.TEMPEN 位可通过软件清零以降低功耗。
温度传感器的输出电压随温度线性变化。不同的芯片由于生产工艺的不同,在温度曲线上会有不同的偏移
量。通过测试,发现最大偏移为 3°C。这一特性使得内部温度传感器更适合检测温度变化。不适合测量绝对
温度。当需要精确的温度测量时,应使用外部温度传感器
2.4测量温度值
1. 配置通道(ADC_IN17)和通道的采样时间为 17.1us
2. 将 ADC_CTRL2.TEMPEN 位设置为 1 以启用温度传感器和 VREFINT
3. 设置 ADC_CTRL2.ON 位为 1 以启动 ADC 转换(或通过外部触发)
4. 读取 ADC 数据寄存器中的温度数据,通过以下公式计算温度值:
温度 (°C) = {(V25 - VSENSE) / Avg_Slope} + 25
其中:
V25 = 25 摄氏度时的 VSENSE
Avg_Slope = 温度和 VSENSE 曲线的平均斜率(mV/°C 或 μV/°C)
参考数据手册的电气特性章节中 V25 和 Avg_Slope 的实际值。
注意:在传感器从断电模式唤醒到正确输出 VSENSE 之前,有一个建立时间; ADC 上电后还有一个建立
时间,所以为了缩短延迟,ADC_CTRL2.TEMPEN 和 ADC_CTRL2.ON 位应该同时置位。
3、mian函数
int main(void){ RCC_Configuration(); ADC_INIT(); DMA_INIT(); LCD_GPIO_Init(); SysTick_Delay_Ms(1000); LCD_Init(); LCD_Fill(0,0,LCD_W,LCD_H,WHITE); LCD_ShowString(14,25,"2022-9-25",BLACK,WHITE,16,0); LCD_ShowString(96,25,"Sunday",BLACK,WHITE,16,0); LCD_ShowString(14,85,"Clock TC",BLACK,WHITE,16,0); LCD_ShowString(96,85,"T: C",RED,WHITE,16,0); while(1) { TempValue = TempCal(ADCConvertedValue); LCD_ShowIntNum(112,85,TempValue,2,RED,WHITE,16); SysTick_Delay_Ms(900); LCD_ShowIntNum(14,47,time_shi,2,RED,WHITE,32); LCD_ShowString(44,47,":",RED,WHITE,32,0); LCD_ShowIntNum(55,47,time_fen,2,RED,WHITE,32); LCD_ShowString(85,47,":",RED,WHITE,32,0); LCD_ShowIntNum(96,47,time_miao,2,RED,WHITE,32); time_miao++; if(time_miao>=60){time_miao=0;time_fen++;}; if(time_fen>=60) {time_fen =0;time_shi++;}; if(time_shi>=24) {time_shi =0;time_fen++;}; }}
这里采用了软件延时更新时间,这样的时间误差比较大,如需要时间更精确因使用定时器或时钟模块
同时这里有一个优化点就是周期和日期的自动更新,可以参考万年历的程序
最后附上一些其他的图片

这个是焊接好的图片(有个按键还没有到货)

这是空板的图片