標(biāo)題: StC32G12K128單片機高速模式應(yīng)用例程分享與解析-溫度顯示器例程 [打印本頁]

作者: 麗江春水    時間: 2023-2-20 20:03
標(biāo)題: StC32G12K128單片機高速模式應(yīng)用例程分享與解析-溫度顯示器例程
    本例程是為驗證stc32g12k128高速模式的應(yīng)用,spi-dma彩屏驅(qū)動程序?qū)嶋H應(yīng)用和動態(tài)曲線刷新方法。
    溫度顯示器與普通溫度計的區(qū)別在于,它不僅能看到當(dāng)前溫度測量值,還能看到過去溫度值,在這里算是前述實驗?zāi)康牡囊粋載體吧。
    關(guān)于spi-dma彩屏驅(qū)動程序,在前面的帖子里講過了。當(dāng)時是在編寫階段,這里是實際應(yīng)用,通過這個例程可以看到。相關(guān)驅(qū)動能很好地在復(fù)雜的(存在四個中斷函數(shù))實際應(yīng)用中工作。
    下面說stc32g12k128的高速模式:
    這里的高速模式是指mcu端口工作頻率高于系統(tǒng)時鐘(SYSCLK)的狀態(tài)。
    一般來講,如果mcu系統(tǒng)時鐘是12M,則IO端口的工作頻率不能高于12M(比如6M)。而stc32g12k128為我們提供了一種模式,可以讓IO端口以高于系統(tǒng)時鐘的速度運行。這就是它的高速模式。
    一方面,提高mcu的系統(tǒng)時鐘,能提高IO端口的頻率,比如把系統(tǒng)時鐘提到36M,端口速度會提高很多,另一方面,端口本身能實現(xiàn)的速度是有限的。一般在20M左右(與電源電壓有關(guān)并受電路實際情況的影響)。那么,mcu的高速模式有什么用呢?我認為主要在以下兩個方面。
    一、在保證端口速度的前提下,降低mcu的系統(tǒng)時鐘,實現(xiàn)節(jié)能。
    系統(tǒng)時鐘高了耗電多,采用高速模式,能實現(xiàn)在較低系統(tǒng)時鐘下的較高速度的端口工作狀態(tài)。省電而不影響工作。
    二、滿足外設(shè)對端口的不同要求
    本例程中我采用ds18b20進行溫度數(shù)據(jù)采集,編寫的程序模塊時使用了11.0592主頻(MCLK,在不分頻的情況下,MCLK=SYSCLK)。顯示上采用了320x240spi接口彩屏。如果還使用11.0592M的主頻,刷屏速度就有點慢了。提高主頻的話,就要重整ds18b20的驅(qū)動。而且提高主頻除了多耗電,s18b20的采集速度不會提高。兩種外設(shè)需要不同的頻率時,就想到了stc32g12k128的高速模式。就是讓mcu的主頻仍工作在11.0592M,但開啟spi的高速模式,大大提高了刷屏速度。達到預(yù)期效果。
    要進一步了解高速模式,最好看一下官方的資料。我們看一下圖一:
    在左下角的位置1處看到,能采用高速模式的端口有兩類,PWM和SPI。位置2處是端口時鐘的分頻器,它把時鐘頻率降低到你需要的值,位置3是時鐘來源,圖上看到,有兩路,一路是MCLK,也叫主時鐘,另一路是PLLCLK        ,叫高速時鐘,CLKSEL.HSIOCK的默認值零,選擇的是主時鐘,這時端口的頻率不會高于主時鐘(但可以高于系統(tǒng)時鐘,只要你把主時鐘分頻后供給系統(tǒng)時鐘),只有CLKSEL,HSIOCK為1時,選擇PLLCLK做為時鐘源,才能出現(xiàn)端口時鐘高于MCLK主時鐘的情況。在位置4看到,主時鐘經(jīng)分頻后產(chǎn)生系統(tǒng)時鐘SYSCLK,供mcu工作,        SYSCLK的頻率越低。系統(tǒng)用電越省。SYSCLK越高,mcu速度越快。在位置5看到。主時鐘MCLK和高速時鐘PLLCLK可以來自同樣時鐘源,主時鐘也可以有單獨的時鐘通道(PLLCKI).你可以通過設(shè)置選擇96M或144M,這個時鐘是通過12M(位置7)時鐘信號倍頻得到的。在位置6處的寄存器位CLKSEL.CKMS決定你選擇的是哪個頻率做時鐘源,默認值是96M。在使用STC-ISP工具軟件設(shè)定MCU的頻率時,設(shè)定的是系統(tǒng)時鐘內(nèi)部高速IRc(位置9),其值由9到8再通過PLLCKI到4成為主時鐘,再通過分頻就是這個系統(tǒng)時鐘了。這個過程中位置9到4再到系統(tǒng)時鐘的一條通路都采用默認值 時,STC-ISP的設(shè)定值就等于系統(tǒng)時鐘的值。我們開啟高速模式是開通的7、6、5、3、2、1這條通路。圖上有通路上各個寄存器的名稱。
    這里有兩種情況,一是STC-ISP設(shè)定頻率在12M附近,這時PCKI不需要分頻,可以直接送到PLL倍頻產(chǎn)生96/144高速時鐘,供后面使用。再一種情況是STC-ISP設(shè)定的頻率在24M附近,這時需要PCKI進行2分頻,才能保證PLL倍頻器產(chǎn)生需要的頻率。我這里用了附近這個詞,就是說倍頻器PLL需要的是12M,允許有偏差,但不宜差太多。差多了影響精度。會不會影響起振,我沒測試過。
    通過時鐘關(guān)系圖我們可以明白,要使IO端口的頻率高于系統(tǒng)時鐘,有兩個辦法,一是提高主頻(MCLK),分頻后給系統(tǒng)時鐘STSCLK.再少分頻給PWM/SPI端口。二是使用PLLCLK做PWM/SPI端口的時鐘源,這樣的好處是可以少影響系統(tǒng)時鐘SYSCLK的設(shè)置和使用。如果使用方法一,直接提高主頻,又忘了分頻給系統(tǒng)時鐘,開機時可能直接死機了。調(diào)試程序時會增加麻煩。
    這里帶讀者看了一遍時鐘關(guān)系圖,是因為很多朋友沒有耐心看這個圖,而我覺得這個圖應(yīng)該看懂它。官方數(shù)據(jù)手冊上有不少圖,如果能把這些圖在腦子里連接成整體,對這個芯片的用法會有所幫助。下面是我在例程中有關(guān)頻率設(shè)置的內(nèi)容:
        // //選擇外部 32K
X32KCR = 0xc0; //啟動外部 32K 晶振
while (!(X32KCR & 0x01)); //等待時鐘穩(wěn)定
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; //觸發(fā) RTC 寄存器初始化
while(RTCCFG & 0x01); //等待初始化完成,需要在 "RTC 使能" 之后判斷.
RTCIF = 0; //清中斷標(biāo)志
//開硬件SPI,這是開dma的前提
P_SW1=0x04;//spi口選在P2
SPSTAT=0xc0;
HSSPI_CFG2 |= 0x20; //使能 SPI 高速模式
SPCTL=0xd3;//spi速度選擇最高的
        //試著開一下高速SPI,注意stc-isp設(shè)置時鐘要求12M。11.0592M穩(wěn)定啟動了
CLKSEL &= ~0x80; //默認選擇 PLL 的 96M 作為 PLL 的輸出時鐘
//USBCLK |= 0x20; //PLL 輸入時鐘 2 分頻 ,因為stc-isp設(shè)定頻率為24M,
//屏蔽分頻語句,取默認值不分頻,對應(yīng)stc-isp設(shè)定頻度12M
USBCLK |= 0x80; //使能 PLL 倍頻,在輸入頻率低時產(chǎn)生高頻率的輸出
delay(222);//等待PLL鎖頻
//CLKSEL &= ~0x40; //默認 HSPWM/HSSPI 選擇主時鐘為時鐘源
CLKSEL |=0x40; // HSPWM/HSSPI 選擇PLL輸出為時鐘源96m
HSCLKDIV = 4; //HSPWM/HSSPI 時鐘源4分頻
    使用高速模式時,有時需要改變相關(guān)寄存器的設(shè)置值,對SPI來講,沒什么問題,我通常在進入高速模式前就把相關(guān)設(shè)置做完了。但在PWM應(yīng)用里,需要在程序運行中改變有關(guān)PWM設(shè)置,這時官方數(shù)據(jù)手冊要求,不能直接讀寫XFR,而要通過異步模式,稍顯麻煩,不過也就是把一個賦值語句改成一個賦值函數(shù)了。下面是我使用的PWM高速模式時的讀寄存器函數(shù)和寫寄存器函數(shù)(在本例程中沒有使用,僅展示一下)。
char ReadPWMA(char addr)
{
char dat;
while (HSPWMA_ADR & 0x80); //等待前一個異步讀寫完成
HSPWMA_ADR = addr | 0x80; //設(shè)置間接訪問地址,只需要設(shè)置原 XFR 地址的低 7 位
//HSPWMA_ADR 寄存器的最高位寫 1,表示讀數(shù)據(jù)
        while (HSPWMA_ADR & 0x80); //等待當(dāng)前異步讀取完成
dat = HSPWMA_DAT; //讀取異步數(shù)據(jù)
return dat;
}
void WritePWMA(char addr, char dat)
{
while (HSPWMA_ADR & 0x80); //等待前一個異步讀寫完成
HSPWMA_DAT = dat; //準(zhǔn)備需要寫入的數(shù)據(jù)
HSPWMA_ADR = addr & 0x7f; //設(shè)置間接訪問地址,只需要設(shè)置原 XFR 地址的低 7 位
//HSPWMA_ADR 寄存器的最高位寫 0,表示寫數(shù)據(jù)
}
       溫度顯示器程序由六部分組成,主程序main.c.測溫模塊ds_driver.c,mcu設(shè)置模塊mcu_initial.c,彩屏驅(qū)動模塊tft24_dvr_bydma.c(驅(qū)動模塊是我自己使用的,其中有本例程用不到的函數(shù),我用/**/屏蔽起來了),屏幕固定顯示內(nèi)容模塊face.c,中斷跳轉(zhuǎn)模塊isr.asm,
    編程的目的是展示stc32g12k128的高速模式的使用和基于dma的彩屏驅(qū)動的應(yīng)用。另外程序中曲線的顯示采用了邊擦邊畫的模式進行刷新,是個人的一個想法。驗證了一下可行性。做為一個初學(xué)者,我是想到什么都會去試試。
    例程在降龍棍核心板上運行通過,下面給出一個參考電路圖。供不使用核心板的朋友參考。
    完整程序放在附件里了,希望對其它學(xué)習(xí)mcu的朋友有所幫助。也歡迎業(yè)界大佬來指點和吐槽。

時鐘管理.png (212.92 KB, 下載次數(shù): 102)

圖一 時鐘關(guān)系圖

圖一 時鐘關(guān)系圖

推薦電路圖.png (54.99 KB, 下載次數(shù): 101)

推薦電路圖

推薦電路圖

屏面.jpg (116.79 KB, 下載次數(shù): 107)

實際電路

實際電路

實際電路.jpg (109.55 KB, 下載次數(shù): 110)

屏面顯示

屏面顯示

thermometry_t.zip

184.8 KB, 下載次數(shù): 34, 下載積分: 黑幣 -5

溫度顯示器


作者: wkman    時間: 2023-2-24 16:26
  文字太多沒仔細看,,,,有沒有說到,對這個TFT整屏刷新,耗時多少ms???

如果像大幕拉開的速度,就毫無意義
作者: 麗江春水    時間: 2023-2-24 19:01
我采用了DMA_SPI刷屏,很快的,沒有測,正常能接受
作者: 麗江春水    時間: 2023-2-24 19:04
而且標(biāo)題上說明了,采用了高速模式,就是說系統(tǒng)時鐘是11.0592,但SPI口的頻率是24M
作者: 麗江春水    時間: 2023-2-24 19:06
我這個例程的重點不是應(yīng)用本身,而是分享SPI彩屏的驅(qū)動用法,高速模式加硬件SPI加DMA




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1