请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 1911|回复: 6

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

[复制链接]
  • TA的每日心情
    无聊
    2023-11-26 13:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    14

    主题

    85

    回帖

    605

    积分

    高级会员

    积分
    605
    发表于 2023-2-21 08:38:53 | 显示全部楼层 |阅读模式
        本例程是为验证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
    实际电路.jpg
    屏面.jpg
    推荐电路图.png

    thermometry_t.zip

    184.8 KB, 下载次数: 50

    回复 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    回帖

    60

    积分

    注册会员

    积分
    60
    发表于 2023-4-7 00:08:30 | 显示全部楼层
    你这是怎么添加的stc32啊有资源分享一下吗

    点评

    楼主可以在最新的下载软件6.91N下载您需要的资料: [attachimg]7346[/attachimg]  详情 回复 发表于 2023-4-7 09:02
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-26 13:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    14

    主题

    85

    回帖

    605

    积分

    高级会员

    积分
    605
     楼主| 发表于 2023-4-7 08:48:43 | 显示全部楼层
    流浪he 发表于 2023-4-7 00:08
    你这是怎么添加的stc32啊有资源分享一下吗

    使用了89c52的DIP40封装,修改引脚名称和元件名称,就出了这个元件,可用于原理图和PCB设计,但不能仿真,因为没做仿真支持文件
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-5 13:56
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    12

    主题

    233

    回帖

    1452

    积分

    超级版主

    积分
    1452
    发表于 2023-4-7 09:02:33 | 显示全部楼层
    流浪he 发表于 2023-4-7 00:08
    你这是怎么添加的stc32啊有资源分享一下吗

    楼主可以在最新的下载软件6.91N下载您需要的资料:
    OXC8U]JS`GME9]PYM2OYS]0.png

    电话:0513-55012946 QQ:2195591714  微信:  19952583740
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    回帖

    60

    积分

    注册会员

    积分
    60
    发表于 2023-4-9 23:36:17 | 显示全部楼层
    STC32G12K128 发表于 2023-4-7 09:02
    楼主可以在最新的下载软件6.91N下载您需要的资料:

    那里没有啊,我想要仿真软件里添加32g
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-5 13:56
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    12

    主题

    233

    回帖

    1452

    积分

    超级版主

    积分
    1452
    发表于 2023-4-10 08:43:54 | 显示全部楼层

    最新的下载软件 6.91N,直接添加到KEIL:
    JTB2B592BLJ%`2]IEII}H.png


    电话:0513-55012946 QQ:2195591714  微信:  19952583740
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-26 13:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    14

    主题

    85

    回帖

    605

    积分

    高级会员

    积分
    605
     楼主| 发表于 2023-4-10 09:00:46 | 显示全部楼层
    我估计这位朋友是要在proteus里填加stc32g12k128元件
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-3-29 07:14 , Processed in 0.083448 second(s), 59 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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