1條訊息 STemWin移植

2021-05-26 11:09:01 字數 2931 閱讀 1390

目前micrium官網ucgui版本是v5.26trial版本,無源**,只有lib檔案,現在網上流傳最多的原始碼是ucgui3.90或3.98版本的,這些原始碼沒有完整官方版本。emwin是segger公司的,segger與st等公司都有合作,使用st的晶片可以免費使用emwin,stemwin:目前版本是5.22。

移植環境:

在移植之前,我們應該要有lcd的基本驅動函式,包括初始化、點亮一個畫素等(這些驅動檔案不能和emwin中的檔案重名,即不能命名為lcd.h、lcd.c)。在資料夾stemwin_library_v1.1.2中,有以下幾個檔案:

其中libraries中就有emwin:

config是emwin配置檔案

documentation是segger公司的使用者手冊

inc是標頭檔案

lib是將原始碼封裝成的lib

os是帶os和不帶os的gui檔案

software裡有一些跟、字型相關的實用小工具

我們可以將整個stemwin_library_v1.1.2放入我們的keil工程中,然後加入以下4個檔案:

接著我們開始修改檔案

#define gui_numbytes 1024*50

這個巨集定義的含義在於向系統申請一個靜態空間 amemory ,接著呼叫 emwin的庫函式gui_alloc_assignmemory 把該空間分配給 emwin,“1024*50”是50kb的意思。

static void lcdwritereg(u16 data)

static void lcdwritedata(u16 data)

static void lcdwritedatamultiple(u16 * pdata, int numitems)

}static void lcdreaddatamultiple(u16 * pdata, int numitems)

}這裡需要填寫4個函式,分別是寫單個暫存器、寫單個資料、寫多個資料、讀多個資料。這裡利用了fsmc驅動ili9341。mylcd是一個型別定義。

typedef struct

lcd_typedef;

//0x6c000000 | 0x000007fe 就是相應的fsmc的地址

#define lcd_base ((u32)(0x6c000000 | 0x000007fe))

#define mylcd ((lcd_typedef *) lcd_base)

接下去來到函式lcd_x_config()

void lcd_x_config(void)

接下去來到

int lcd_x_displaydriver(unsigned layerindex, unsigned cmd, void * pdata)

default:

r = -1;

} return r;

}emwin在執行過程中會呼叫延時之類的函式,為了實現精確定時,我們還需要為emwin開一路定時器,這裡我們選用systick。在mian()函式中加入systick_config(),來初始化systick定時器,而在systick_handler中斷函式中,我們需要進行這樣的修改:

extern __io int32_t os_timems; //os_time 已在gui_x.c中宣告。

void systick_handler(void)

os_timems已經在gui_x.c中定義。

這些工作完成後我們再回到main()中,在main()中我們需要新增

rcc_ahbperiphclockcmd(rcc_ahbperiph_crc,enable);函式,注意如果不新增將無法使用emwin。然後進行gui初始化,記得先包含“gui.h”。如我的程式是這樣子的:

#include "stm32f10x.h"

#include "gui.h"

#include "core_cm3.h"

#define ticks_per_sec 1000

int os_cpu_systickclkfreq(void)

int main(void)

}接下來我們加入觸控的部分,這部分我們需要寫4個函式:

gui_touch_x_activatex(), gui_touch_x_activatey()

gui_touch_x_measurex(), gui_touch_x_measurey()

//這裡返回的y值是ad取樣的值

int gui_touch_x_measurex(void)

//這個寫個空函式就可以了

void gui_touch_x_activatex(void){}

然後我們需在lcdconf_flexcolor_template.c檔案中加入對觸控式螢幕的校準

//這4個巨集定義是螢幕的四個角的ad值

#define touch_ad_top 221

#define touch_ad_bottom 3900

#define touch_ad_left 160

#define touch_ad_right 3883

gui_touch_calibrate(gui_coord_x, 0, 240, touch_ad_top, touch_ad_bottom);

gui_touch_calibrate(gui_coord_y, 0, 320, touch_ad_left, touch_ad_right);

【reference】

1.