|
本例程是為驗證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)
下載附件
2023-2-20 19:51 上傳
圖一 時鐘關系圖
-
推薦電路圖.png
(54.99 KB, 下載次數: 101)
下載附件
2023-2-20 19:59 上傳
推薦電路圖
-
屏面.jpg
(116.79 KB, 下載次數: 107)
下載附件
2023-2-20 20:02 上傳
實際電路
-
實際電路.jpg
(109.55 KB, 下載次數: 110)
下載附件
2023-2-20 20:02 上傳
屏面顯示
-
-
thermometry_t.zip
2023-2-20 20:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
184.8 KB, 下載次數: 34, 下載積分: 黑幣 -5
溫度顯示器
評分
-
查看全部評分
|