16位320*240的位圖大小為150K位元組,而對于EM-STM3210E開發闆來說,RAM僅有128K,遠不夠顯示一幅完整位圖,紅牛的開發闆即使有256K的RAM,但是刨去堆、棧及TinyCLR本身所用,剩下的也不多了,是以要顯示全屏位圖,必須分塊顯示。
但是這樣帶來兩個問題,一幅圖要分塊制作,相當繁瑣,不過這個可以更新TBConvert程式,讓其支援自動分塊功能,這個問題算完美解決了。下個問題,從Flash讀取需要一定時間,顯示也需要一定時間,這樣顯示全屏位圖的過程,就是從上到下,一個一個畫塊依次顯示,效果不太好。幸好LCD驅動,第7個寄存器可以控制顯示過程,可以在更新顯存資料時,不更新畫面,不過這個過程不要太長,否則LCD屏上會有不好看的條文出現。
更新後的TBConvert程式如下,可以設定要分割的塊數,注意高度必須要整除塊數:

針對第二個問題,更新TinyGUI庫,增加如下兩個函數:
public static void SuspendLayout(); //挂起更新
public static void ResumeLayout(); //恢複更新
好了,我們用繪圖工具,制作三幅240*320的位圖,制作好之後用TBConvert 分為4段然後儲存。然後用YFAccessFlash工具,把這三幅位圖下載下傳到Custom去,下載下傳前記得要先清空Flash(按 Erase按鈕),三幅圖一同下載下傳。
編寫如下代碼,我們把這三幅圖如幻燈片式的一一展現出來,代碼如下:
public static void Main()
{
uint offset_Addr = 0x002A0000; //Custom區在Flash中的偏移位址
uint bmp_Size = 38412; //TinyBMP圖檔的1/4
byte[] bytData = new byte[bmp_Size];
uint DataAddr = offset_Addr;
while (true)
{
for (int index = 0; index < 3; index++)
{
if (index == 0) DataAddr = offset_Addr;
Graphics.SuspendLayout(); //可以比較一下,有這兩句代碼和沒有這兩句代碼,圖形顯示效果的差別
for (int i = 0; i < 4; i++)
{
AccessFlash.Read(DataAddr, bmp_Size, bytData);
Graphics.DrawImage(0, i * 80, bytData);
DataAddr += bmp_Size;
}
Graphics.ResumeLayout();
//等待時間必須要長一些,否則顯示會有問題(>300ms)
Thread.Sleep(1000);
}
}
}
運作後的效果圖如下:
注意:紅牛開發闆和EM-STM3210E需要下載下傳最新的固件,才能運作該示例。
下載下傳位址和原先的相同,版本分别為V0.9.3和V0.9.1.
-----------------------------------------------------------------------------------------