找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2695|回复: 4
打印 上一主题 下一主题
收起左侧

StC32G12K128单片机高速模式应用例程分享与解析-温度显示器例程

[复制链接]
跳转到指定楼层
楼主
    本例程是为验证stc32g12k128高速模式的应用,spi-dma彩屏驱动程序实际应用和动态曲线刷新方法。
    温度显示器与普通温度计的区别在于,它不仅能看到当前温度测量值,还能看到过去温度值,在这里算是前述实验目的的一个载体吧。
    关于spi-dma彩屏驱动程序,在前面的帖子里讲过了。当时是在编写阶段,这里是实际应用,通过这个例程可以看到。相关驱动能很好地在复杂的(存在四个中断函数)实际应用中工作。
    下面说stc32g12k128的高速模式:
    这里的高速模式是指mcu端口工作频率高于系统时钟(SYSCLK)的状态。
    一般来讲,如果mcu系统时钟是12M,则IO端口的工作频率不能高于12M(比如6M)。而stc32g12k128为我们提供了一种模式,可以让IO端口以高于系统时钟的速度运行。这就是它的高速模式。
    一方面,提高mcu的系统时钟,能提高IO端口的频率,比如把系统时钟提到36M,端口速度会提高很多,另一方面,端口本身能实现的速度是有限的。一般在20M左右(与电源电压有关并受电路实际情况的影响)。那么,mcu的高速模式有什么用呢?我认为主要在以下两个方面。
    一、在保证端口速度的前提下,降低mcu的系统时钟,实现节能。
    系统时钟高了耗电多,采用高速模式,能实现在较低系统时钟下的较高速度的端口工作状态。省电而不影响工作。
    二、满足外设对端口的不同要求
    本例程中我采用ds18b20进行温度数据采集,编写的程序模块时使用了11.0592主频(MCLK,在不分频的情况下,MCLK=SYSCLK)。显示上采用了320x240spi接口彩屏。如果还使用11.0592M的主频,刷屏速度就有点慢了。提高主频的话,就要重整ds18b20的驱动。而且提高主频除了多耗电,s18b20的采集速度不会提高。两种外设需要不同的频率时,就想到了stc32g12k128的高速模式。就是让mcu的主频仍工作在11.0592M,但开启spi的高速模式,大大提高了刷屏速度。达到预期效果。
    要进一步了解高速模式,最好看一下官方的资料。我们看一下图一:
    在左下角的位置1处看到,能采用高速模式的端口有两类,PWM和SPI。位置2处是端口时钟的分频器,它把时钟频率降低到你需要的值,位置3是时钟来源,图上看到,有两路,一路是MCLK,也叫主时钟,另一路是PLLCLK        ,叫高速时钟,CLKSEL.HSIOCK的默认值零,选择的是主时钟,这时端口的频率不会高于主时钟(但可以高于系统时钟,只要你把主时钟分频后供给系统时钟),只有CLKSEL,HSIOCK为1时,选择PLLCLK做为时钟源,才能出现端口时钟高于MCLK主时钟的情况。在位置4看到,主时钟经分频后产生系统时钟SYSCLK,供mcu工作,        SYSCLK的频率越低。系统用电越省。SYSCLK越高,mcu速度越快。在位置5看到。主时钟MCLK和高速时钟PLLCLK可以来自同样时钟源,主时钟也可以有单独的时钟通道(PLLCKI).你可以通过设置选择96M或144M,这个时钟是通过12M(位置7)时钟信号倍频得到的。在位置6处的寄存器位CLKSEL.CKMS决定你选择的是哪个频率做时钟源,默认值是96M。在使用STC-ISP工具软件设定MCU的频率时,设定的是系统时钟内部高速IRc(位置9),其值由9到8再通过PLLCKI到4成为主时钟,再通过分频就是这个系统时钟了。这个过程中位置9到4再到系统时钟的一条通路都采用默认值 时,STC-ISP的设定值就等于系统时钟的值。我们开启高速模式是开通的7、6、5、3、2、1这条通路。图上有通路上各个寄存器的名称。
    这里有两种情况,一是STC-ISP设定频率在12M附近,这时PCKI不需要分频,可以直接送到PLL倍频产生96/144高速时钟,供后面使用。再一种情况是STC-ISP设定的频率在24M附近,这时需要PCKI进行2分频,才能保证PLL倍频器产生需要的频率。我这里用了附近这个词,就是说倍频器PLL需要的是12M,允许有偏差,但不宜差太多。差多了影响精度。会不会影响起振,我没测试过。
    通过时钟关系图我们可以明白,要使IO端口的频率高于系统时钟,有两个办法,一是提高主频(MCLK),分频后给系统时钟STSCLK.再少分频给PWM/SPI端口。二是使用PLLCLK做PWM/SPI端口的时钟源,这样的好处是可以少影响系统时钟SYSCLK的设置和使用。如果使用方法一,直接提高主频,又忘了分频给系统时钟,开机时可能直接死机了。调试程序时会增加麻烦。
    这里带读者看了一遍时钟关系图,是因为很多朋友没有耐心看这个图,而我觉得这个图应该看懂它。官方数据手册上有不少图,如果能把这些图在脑子里连接成整体,对这个芯片的用法会有所帮助。下面是我在例程中有关频率设置的内容:
        // //选择外部 32K
X32KCR = 0xc0; //启动外部 32K 晶振
while (!(X32KCR & 0x01)); //等待时钟稳定
RTCCFG &= ~0x02; //选择外部 32K 作为 RTC 时钟源
INIYEAR = 23; //Y:2023
INIMONTH = 2; //M:12
INIDAY = 20; //D:31
INIHOUR = 19; //H:23
INIMIN = 59; //M:59
INISEC = 50; //S:50
INISSEC = 0; //S/128:0
RTCCR = 0x01; // RTC 使能
RTCCFG |= 0x01; //触发 RTC 寄存器初始化
while(RTCCFG & 0x01); //等待初始化完成,需要在 "RTC 使能" 之后判断.
RTCIF = 0; //清中断标志
//开硬件SPI,这是开dma的前提
P_SW1=0x04;//spi口选在P2
SPSTAT=0xc0;
HSSPI_CFG2 |= 0x20; //使能 SPI 高速模式
SPCTL=0xd3;//spi速度选择最高的
        //试着开一下高速SPI,注意stc-isp设置时钟要求12M。11.0592M稳定启动了
CLKSEL &= ~0x80; //默认选择 PLL 的 96M 作为 PLL 的输出时钟
//USBCLK |= 0x20; //PLL 输入时钟 2 分频 ,因为stc-isp设定频率为24M,
//屏蔽分频语句,取默认值不分频,对应stc-isp设定频度12M
USBCLK |= 0x80; //使能 PLL 倍频,在输入频率低时产生高频率的输出
delay(222);//等待PLL锁频
//CLKSEL &= ~0x40; //默认 HSPWM/HSSPI 选择主时钟为时钟源
CLKSEL |=0x40; // HSPWM/HSSPI 选择PLL输出为时钟源96m
HSCLKDIV = 4; //HSPWM/HSSPI 时钟源4分频
    使用高速模式时,有时需要改变相关寄存器的设置值,对SPI来讲,没什么问题,我通常在进入高速模式前就把相关设置做完了。但在PWM应用里,需要在程序运行中改变有关PWM设置,这时官方数据手册要求,不能直接读写XFR,而要通过异步模式,稍显麻烦,不过也就是把一个赋值语句改成一个赋值函数了。下面是我使用的PWM高速模式时的读寄存器函数和写寄存器函数(在本例程中没有使用,仅展示一下)。
char ReadPWMA(char addr)
{
char dat;
while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成
HSPWMA_ADR = addr | 0x80; //设置间接访问地址,只需要设置原 XFR 地址的低 7 位
//HSPWMA_ADR 寄存器的最高位写 1,表示读数据
        while (HSPWMA_ADR & 0x80); //等待当前异步读取完成
dat = HSPWMA_DAT; //读取异步数据
return dat;
}
void WritePWMA(char addr, char dat)
{
while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成
HSPWMA_DAT = dat; //准备需要写入的数据
HSPWMA_ADR = addr & 0x7f; //设置间接访问地址,只需要设置原 XFR 地址的低 7 位
//HSPWMA_ADR 寄存器的最高位写 0,表示写数据
}
       温度显示器程序由六部分组成,主程序main.c.测温模块ds_driver.c,mcu设置模块mcu_initial.c,彩屏驱动模块tft24_dvr_bydma.c(驱动模块是我自己使用的,其中有本例程用不到的函数,我用/**/屏蔽起来了),屏幕固定显示内容模块face.c,中断跳转模块isr.asm,
    编程的目的是展示stc32g12k128的高速模式的使用和基于dma的彩屏驱动的应用。另外程序中曲线的显示采用了边擦边画的模式进行刷新,是个人的一个想法。验证了一下可行性。做为一个初学者,我是想到什么都会去试试。
    例程在降龙棍核心板上运行通过,下面给出一个参考电路图。供不使用核心板的朋友参考。
    完整程序放在附件里了,希望对其它学习mcu的朋友有所帮助。也欢迎业界大佬来指点和吐槽。

时钟管理.png (212.92 KB, 下载次数: 102)

图一 时钟关系图

图一 时钟关系图

推荐电路图.png (54.99 KB, 下载次数: 101)

推荐电路图

推荐电路图

屏面.jpg (116.79 KB, 下载次数: 107)

实际电路

实际电路

实际电路.jpg (109.55 KB, 下载次数: 110)

屏面显示

屏面显示

thermometry_t.zip

184.8 KB, 下载次数: 34, 下载积分: 黑币 -5

温度显示器

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:433219 发表于 2023-2-24 16:26 | 只看该作者
  文字太多没仔细看,,,,有没有说到,对这个TFT整屏刷新,耗时多少ms???

如果像大幕拉开的速度,就毫无意义
回复

使用道具 举报

板凳
ID:1039438 发表于 2023-2-24 19:01 | 只看该作者
我采用了DMA_SPI刷屏,很快的,没有测,正常能接受
回复

使用道具 举报

地板
ID:1039438 发表于 2023-2-24 19:04 | 只看该作者
而且标题上说明了,采用了高速模式,就是说系统时钟是11.0592,但SPI口的频率是24M
回复

使用道具 举报

5#
ID:1039438 发表于 2023-2-24 19:06 | 只看该作者
我这个例程的重点不是应用本身,而是分享SPI彩屏的驱动用法,高速模式加硬件SPI加DMA
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表