在已经做好LCD_ ILI9841的基础上,进行移植,不考虑触摸屏。
一、无操作系统移植
第一步: 找到STemWin5.44库文件。
第二步:将相关文件放在Project文件夹内,设置项目相关参数。
添加:GUI_X.c GUI_config.c LCDConf_FlexColor_Template.c 和 STemWin_CM3_wc16_ARGB.a(无OS) 到工程内。
第三步:移植STemWin5.44
3.1 修改GUI_config.h,不适用的项目括号内填 0。
3.2 修改GUI_config.c
#define GUI_NUMBYTES (1024*20)
3.3 修改LCDConf_FlexColor_Template.c,从上到下是:
#include "./lcd/bsp_ili9341_lcd.h" // 添加
#define XSIZE_PHYS 240 // 修改 To be adapted to x-screen size
#define YSIZE_PHYS 320 // 修改 To be adapted to y-screen size
static void LcdWriteReg(U16 usCmd) {
// ... TBD by user
* ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_CMD ) = usCmd; // 添加
}
static void LcdWriteData(U16 usData) {
// ... TBD by user
* ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_DATA ) = usData;// 添加
}
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
* ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_DATA ) = *pData;// 添加
pData++;// 添加
}
}
static void LcdReadDataMultiple(U16 * pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
*pData =* ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_DATA );// 添加
pData++;// 添加
}
}
void LCD_X_Config(void) {
Config.FirstCOM = 0; //modify by fire
Config.FirstSEG = 0; //modify by fire
Config.Orientation = GUI_MIRROR_Y|GUI_MIRROR_X; //修改 竖屏
Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y; //修改 横屏
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);//修改
// 查 User & Reference Guide, 通过CTRL+F 找到ILI9341 适合 GUIDRV_FLEXCOLOR_F66709 GUIDRV_FLEXCOLOR_M16C0B16参数。
}
3.4 修改GUI_X.c
void GUI_X_Delay(int ms) {
// int tEnd = OS_TimeMS + ms;
// while ((tEnd - OS_TimeMS) > 0);
HAL_Delay(ms); // 修改
}
4.测试, 在main.c中依次加入如下代码。
#include "./lcd/bsp_ili9341_lcd.h"
#include "GUI.h" //EmWin头文件
ILI9341_Init (); //LCD 初始化
//绘制触摸画板界面
RCC->AHBENR|=1<<6; //开启CRC时钟
GUI_Init(); //STemwin初始化
GUI_SetBkColor(GUI_RED); //设置背景颜色
GUI_Clear(); //清屏
//其中0、3、5、6 模式适合从左至右显示文字,
//不推荐使用其它模式显示文字 其它模式显示文字会有镜像效果
//其中 6 模式为大部分液晶例程的默认显示方向
ILI9341_GramScan( 6 );
GUI_SetFont(GUI_FONT_24B_1);
GUI_DispString("Hello World!\r\nUse FreeRTOS\r\nSTemWin GUI");
二、FreeRTOS操作系统移植
步骤类似,不同之处有:
第二步:将相关文件放在Project文件夹内,设置项目相关参数。
添加:GUI_X_OS.c GUI_config.c LCDConf_FlexColor_Template.c 和 STemWin_CM3_OS_wc16_ARGB.a(OS) 到工程内。
第三步:移植STemWin5.44
3.4 修改GUI_X_OS.c
/* FreeRTOS头文件 */
#include "FreeRTOS.h" //修改
#include "task.h" //修改
#include "semphr.h" //修改
int GUI_X_GetTime(void)
{
//return ((int) osKernelSysTick());
return ((int) xTaskGetTickCount()); //修改
}
void GUI_X_Delay(int ms)
{
//osDelay( ms );
vTaskDelay( ms ); //修改
}
/* Init OS */
void GUI_X_InitOS(void)
{
/* Create Mutex lock */
// osMutexDef(MUTEX);
/* Create the Mutex used by the two threads */
//osMutex = osMutexCreate(osMutex(MUTEX));
/* Create Semaphore lock */
// osSemaphoreDef(SEM);
/* Create the Semaphore used by the two threads */
//osSemaphore= osSemaphoreCreate(osSemaphore(SEM), 1);
/* 创建互斥信号量 用于资源共享 */
xQueueMutex = xSemaphoreCreateMutex();//修改
configASSERT (xQueueMutex != NULL);//修改
/* 创建二值信号量 用于事件触发 */
vSemaphoreCreateBinary( xSemaTxDone );//修改
configASSERT ( xSemaTxDone != NULL );//修改
}
void GUI_X_Unlock(void)
{
//osMutexRelease(osMutex);
/* 给出互斥量 */
xSemaphoreGive(xQueueMutex);//修改
}
void GUI_X_Lock(void)
{
//osMutexWait(osMutex , osWaitForever) ;
if(xQueueMutex == NULL)//修改
{
GUI_X_InitOS();//修改
}
/* 获取互斥量 */
xSemaphoreTake(xQueueMutex, /* 互斥量句柄 *///修改
portMAX_DELAY);/* 阻塞等待 */
}
/* Get Task handle */
U32 GUI_X_GetTaskId(void)
{
//return ((U32) osThreadGetId());
return ((U32) xTaskGetCurrentTaskHandle());
}
void GUI_X_WaitEvent (void)
{
//osSemaphoreWait(osSemaphore , osWaitForever) ;
/* 获取信号量 */
while(xSemaphoreTake(xSemaTxDone, /* 信号量句柄 */ //修改
portMAX_DELAY) != pdTRUE);/* 阻塞等待 */ //修改
}
void GUI_X_SignalEvent (void)
{
//osMutexRelease(osSemaphore);
/* 给出信号量 */
xSemaphoreGive(xSemaTxDone);//修改
}