STM32F407+STemwin學習筆記之STemwin移植

来源:https://www.cnblogs.com/NickQ/archive/2018/04/15/8748011.html
-Advertisement-
Play Games

原文鏈接:http://www.cnblogs.com/NickQ/p/8748011.html 環境:keil5.20 STM32F407ZGT6 LCD(320*240) STemwin:STemWin_Library_V1.1.2 準備: STemWIn在裸機上的移植,需要準備STemwin的 ...


原文鏈接:http://www.cnblogs.com/NickQ/p/8748011.html 

環境:keil5.20  STM32F407ZGT6  LCD(320*240)  STemwin:STemWin_Library_V1.1.2

準備:

STemWIn在裸機上的移植,需要準備STemwin的庫( STemwin:STemWin_Library_V1.1.2.rar 鏈接:https://pan.baidu.com/s/1rUxgjQwQPY0-m_AEOFXMrw 密碼:fzp8),LCD的空工程(帶有LCD畫點,讀點函數)。

開始移植

第一步:解壓STemWin_Library_V1.1.2.rar,目錄結構如下

打開目錄STemWin_Library_V1.1.2\Libraries\STemWinLibrary522,複製Config,inc,OS,LIB四個目錄到工程文件夾中

刪除Config中LCDConf_Lin_Template.c,LCDConf_Lin_Template.h文件。

根據需要保留LIB中文件,刪除其他文件。此處使用CM4內核的F407,Keil IDE,保留STemWin522_CM4_Keil.lib。

根據是否使用OS,保留OS文件夾中相應文件。此處不使用OS,保留GUI_X.c。

將留下的文件添加進工程,並包含頭文件路徑。

留下的文件如圖所示。

第二步,修改部分文件,

修改GUIConf.c   修改分配給GUI的記憶體大小,此處為16K

1 // Define the available number of bytes available for the GUI
2 #define GUI_NUMBYTES  0x4000  //16KB  2018/04/15-17:52:54  By Nick

修改GUIConf.h   配置GUI相關功能

 1 #ifndef GUICONF_H
 2 #define GUICONF_H
 3 
 4 //Multi layer/display support
 5 #define GUI_NUM_LAYERS            2    // Maximum number of available layers
 6 
 7 //Multi tasking support
 8 #ifdef OS_SUPPORT
 9  #define GUI_OS                    (1)  // Compile with multitasking support
10 #else
11  #define GUI_OS                    (0)
12 #endif
13 
14 //Configuration of touch suppor
15 #ifndef   GUI_SUPPORT_TOUCH
16   #define GUI_SUPPORT_TOUCH       (1)  // Support touchscreen
17 #endif
18 
19 //Default font
20 #define GUI_DEFAULT_FONT          &GUI_Font6x8
21 
22 //Configuration of available packages
23 #define GUI_SUPPORT_MOUSE             (1)    /* Support a mouse */
24 #define GUI_WINSUPPORT                (1)    /* Use window manager */
25 #define GUI_SUPPORT_MEMDEV            (1)    /* Memory device package available */
26 #define GUI_SUPPORT_DEVICES           (1)    /* Enable use of device pointers */
27 
28 #endif  /* Avoid multiple inclusion */

修改GUIDRV_Template.c   修改畫點和讀點函數,註意要引入自己的LCD頭文件

 1 /*********************************************************************
 2 *
 3 *       _SetPixelIndex
 4 *
 5 * Purpose:
 6 *   Sets the index of the given pixel. The upper layers
 7 *   calling this routine make sure that the coordinates are in range, so
 8 *   that no check on the parameters needs to be performed.
 9 */
10 static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
11     //
12     // Convert logical into physical coordinates (Dep. on LCDConf.h)
13     //
14     #if (LCD_MIRROR_X == 1) || (LCD_MIRROR_Y == 1) || (LCD_SWAP_XY == 1)
15       int xPhys, yPhys;
16 
17       xPhys = LOG2PHYS_X(x, y);
18       yPhys = LOG2PHYS_Y(x, y);
19     #else
20       #define xPhys x
21       #define yPhys y
22     #endif
23     GUI_USE_PARA(pDevice);
24     GUI_USE_PARA(x);
25     GUI_USE_PARA(y);
26     GUI_USE_PARA(PixelIndex);
27     {
28         lcd_drawpoint(xPhys,yPhys,PixelIndex);  //2018/04/15-18:47:44  By Nick
29     }
30     #if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
31       #undef xPhys
32       #undef yPhys
33     #endif
34 }
35 
36 /*********************************************************************
37 *
38 *       _GetPixelIndex
39 *
40 * Purpose:
41 *   Returns the index of the given pixel. The upper layers
42 *   calling this routine make sure that the coordinates are in range, so
43 *   that no check on the parameters needs to be performed.
44 */
45 static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
46   unsigned int PixelIndex;
47     //
48     // Convert logical into physical coordinates (Dep. on LCDConf.h)
49     //
50     #if (LCD_MIRROR_X == 1) || (LCD_MIRROR_Y == 1) || (LCD_SWAP_XY == 1)
51       int xPhys, yPhys;
52 
53       xPhys = LOG2PHYS_X(x, y);
54       yPhys = LOG2PHYS_Y(x, y);
55     #else
56       #define xPhys x
57       #define yPhys y
58     #endif
59     GUI_USE_PARA(pDevice);
60     GUI_USE_PARA(x);
61     GUI_USE_PARA(y);
62     {
63         PixelIndex = lcd_read_gram(xPhys,yPhys);  //2018/04/15-18:47:29  By Nick
64     }
65     #if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
66       #undef xPhys
67       #undef yPhys
68     #endif
69   return PixelIndex;
70 }

修改 GUIDRV_FlexColor.c文件  配置屏幕尺寸(此處為320*240),可以用巨集,Nick在此不用巨集的原因是方便LCD初始化函數自動識別屏幕後,傳遞給GUI

 1 #include "Nick_lcd.h" 
 2 #include "GUI.h"
 3 #include "GUIDRV_FlexColor.h"
 4 
 5 
 6 u16 XSIZE_PHYS,YSIZE_PHYS,VXSIZE_PHYS,VYSIZE_PHYS;  //2018/04/15-18:48:10  By Nick
 7 
 8 #ifndef   GUICC_565
 9   #error Color conversion not defined!
10 #endif
11 #ifndef   GUIDRV_FLEXCOLOR
12   #error No display driver defined!
13 #endif
14 
15 void LCD_X_Config(void) {              //2018/04/15-18:48:24  By Nick
16     // Physical display size
17     XSIZE_PHYS  = lcddev.width;// To be adapted to x-screen size   240
18     YSIZE_PHYS  = lcddev.height; // To be adapted to y-screen size 320
19     VXSIZE_PHYS = XSIZE_PHYS;
20     VYSIZE_PHYS = YSIZE_PHYS;
21     GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API,GUICC_M565,0,0);
22     LCD_SetSizeEx(0,XSIZE_PHYS,YSIZE_PHYS);
23     LCD_SetVSizeEx(0,VXSIZE_PHYS,VYSIZE_PHYS);
24 }
25 
26 
27 int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
28   int r;
29   (void) LayerIndex;
30   (void) pData;
31   
32   switch (Cmd) {
33   case LCD_X_INITCONTROLLER: {
34     return 0;
35   }
36   default:
37     r = -1;
38   }
39   return r;
40 }

在此,修改已完成。

第三步,編寫測試程式。

#include "stm32f4xx_conf.h"
#include "GUI.h"
#include "Nick_lcd.h"

int main(void)
{ 
    lcd_init(0);        //LCD初始化    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,ENABLE);//使能CRC時鐘,否則STemWin不能使用 
    GUI_Init();
    
    GUI_SetColor(GUI_RED);
    GUI_SetBkColor(GUI_BLUE);
    GUI_SetFont(&GUI_Font24_ASCII);
    GUI_Clear();
    GUI_DispStringAt("Hello World",10,10); 
}

到此可以看到現象。如圖

當然,到此STemwin移植就結束了。下一篇將添加觸摸屏點擊功能。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 什麼是RESTful? 這裡不多做贅述,詳情請百度! 哈哈,本來還想巴拉巴拉介紹一些webapi, RESTful的, 還是算了,咱們直接上乾貨!(原因是懶!哈哈) 使用 以前使用過mvc的人對webapi 應該都很熟悉,先看一段熟悉的代碼 大伙發現了什麼沒?跟以往mvc大多數相同,但有些地方 ...
  • 介紹 關於什麼是Claim? 可以看看其他大神的文章: http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html http://www.cnblogs.com/savorb ...
  • (CLR via C#閱讀筆記) 基元類型(primitive type): 基元類型也不做過多的解釋,舉個例子即可清晰的辨別 在java里曾使用過Sting s="java"; 定義字元串,然後就會覺得很詫異,為啥是大寫開頭,我寫C#,一直都是 string ,int ,double,float等 ...
  • 報錯信息如下: 註:為了部分隱私安全需要,已將有問題文件名替換為filename,系統win2008R2,Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.7.2623.0 第一開始嘗試過給C:\Windows\Microsoft.NET\Fra ...
  • 本文的概念內容來自深入淺出設計模式一書. 項目需求 有這樣一個可編程的新型遙控器, 它有7個可編程插槽, 每個插槽可連接不同的家用電器設備. 每個插槽對應兩個按鈕: 開, 關(ON, OFF). 此外還有一個全局的取消按鈕(UNDO). 現在客戶想使用這個遙控器來控制不同廠家的家用電器, 例如電燈, ...
  • 博客鏈接:https://wiki.feiffy.cc/Blog:如何在Ubuntu上安裝GNOME ...
  • 上面理論知識,最下麵有我做的測試的例子: 10.Shell運算符 expr是一款表達式計算工具,使用它能完成表達式的求值操作 例:val=`expr 2 + 2`;echo "${val}" 註意: 表達式和運算符之間要有空格,2+2是錯誤的,2 + 2是正確的 完整的表達式要被``包含 A.算術運 ...
  • test.xml文件很大,內容結構如下: list.txt文件較小,內容如下: 需求是,如果<url>...</url>中間包含了list.txt文件中的某一行,則刪除這個<url>...</url>。 在這裡需要說明下sed的局限性:(1).sed處理輸入流是一次性的,只要某行被sed讀取了,就一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...