百为STM32开发板UCGUI移植步骤(3.5固件库+UCOSII2.92+UCGUI3.90)
一、UCOS移植
这个可以参考“百为STM32开发板UCOSII移植步骤”
参考源码——百为STM32_3.5固件库_uCOS2.92源码.rar
工程目录图:
二、UCGUI移植
1、下载UCGUI3.90源码
首先下载UCGUI3.90源码,注意网上流传的很多UCGUI代码有问题。具体可以参考这个帖子:
完整源码版uCOSII2.86+uCGUI3.90在stm32上的移植,含uCGUI3.9源码(不是.lib)
http://www.amobbs.com/thread-4787247-1-1.html
2、然后在工程里add groud创建组,把UCGUI代码加进工程
把创建的New Group组改名为uCGUI/Config
用同样的方法创建uCGUI/GUI_X,uCGUI/LCDDriver等组,
然后把UCGUI390a\Start目录下的对应目录C文件添加到对应的组上
建立组uCGUI,然后把UCGUI390a\Start\GUI目录下的所有目录C文件添加到该组上
这里创建组是为了阅读方便,不是必需的。建立好后的目录结构如下:
3、增加LCD驱动接口LCDDriver.c
实现UCGUI的LCD接口,主要是实现下面LCD_L0_XXXX这些函数,因为上层画点画线画图形最终调用的都是这些函数:
LCD_L0_Init,
(tLCDDEV_DrawBitmap*)LCD_L0_DrawBitmap,
LCD_L0_DrawHLine,
LCD_L0_DrawVLine,
LCD_L0_FillRect,
LCD_L0_GetPixelIndex,
LCD_L0_SetPixelIndex,
LCD_L0_XorPixel,
LCD_L0_SetLUTEntry,
但最简单的方法不是每个函数重新去编写,按照LCDWin.c来修改比较快,
在LCD_L0_Init初始化时增加调用9320 LCD初始化代码STM3210E_LCD_Init();
把LCDSIM_SetPixelIndex改名为ili9320_SetPixelIndex
把LCDSIM_GetPixelIndex改名为ili9320_GetPixelIndex
然后在底层ili9320_lcd.c里增加以下三个函数
void ili9320_SetPixelIndex(u16 Xpos, u16 Ypos, u16 c)
{
LCD_SetCursor(Xpos, Ypos);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
LCD_WriteRAM(c);
}
u16 ili9320_GetPixelIndex(u16 Xpos, u16 Ypos)
{
u16 c;
LCD_SetCursor(Xpos, Ypos);
c = LCD_ReadRAM(); //在这个函数里,注意9320 LCD的读GRAM需要读两次,第一次为无效数据,第二次才是有效数据,具体可以看9320数据手册
return(ili9320_BGR2RGB(c));
}
u16 ili9320_BGR2RGB(u16 c)
{
u16 r,g,b;
u16 rgb;
b = (c>>0) & 0x1f;
g = (c>>5) & 0x3f;
r = (c>>11) & 0x1f;
rgb = (b<<11) + (g<<5) + (r<<0);
return( rgb );
}
4、在GUI_X_Touch.c里增加触摸驱动接口
主要是实现读触摸坐标的两个函数:
int GUI_TOUCH_X_MeasureX(void) {
U32 i,j=0;
for(i=0;i<10;i++)
{
j+=SPI_TOUCH_Read_X();
}
return j/10;
}
int GUI_TOUCH_X_MeasureY(void) {
U32 i,j=0;
for(i=0;i<10;i++)
{
j+=SPI_TOUCH_Read_Y();
}
return j/10;
}
#define TOUCH_X_MeasureX GUI_TOUCH_X_MeasureX
#define TOUCH_X_MeasureY GUI_TOUCH_X_MeasureY
在GUI_TOUCH_Exec里面会默认调用上面两个函数采样坐标并转换,然后调用_StoreUnstable -> GUI_TOUCH_StoreUnstable ……
-> GUI_PID_StoreState存储触摸按下状态。
然后在WM_Exec -> WM_Exec1里会调用 WM_pfHandlePID -> WM_HandlePID - > GUI_PID_GetState获取出触摸按下状态并发送到相应窗口处理
在app.c里增加一个UCOS任务,在里面不断地调用GUI_TOUCH_Exec处理触摸消息
static void Task2_Func (void *p_arg) //Task2_Func这个是用户自己创建的任务名,可以改为任意名字
{
……
while (DEF_TRUE) {
……
GUI_TOUCH_Exec();
OSTimeDly(20);
}
}
5、在GUI_X_uCOS.c里增加UCOS和UCGUI之间的接口:
把
void GUI_X_ExecIdle (void)
{
OS_X_Delay(1);
}
改为
void GUI_X_ExecIdle (void)
{
GUI_X_Delay(1);
}
实现下面几个空函数,作为打印调试信息等用途
void GUI_X_Log(const char *s)
{
}
void GUI_X_Warn(const char *s)
{
}
void GUI_X_ErrorOut(const char *s)
{
}
6、增加UCOS任务,在里面调用UCGUI DEMO任务MainTask:
static void User_Task_Func (void *p_arg) //User_Task_Func这个是用户自己创建的任务名,可以改为任意名字
{
……
while(1)
{
MainTask();
}
}
MainTask任务如下,使用UCGUI前先调用 GUI_Init初始化UCGUI,然后运行UCGUI DEMO:
void MainTask(void) {
GUI_Init();
while(1) {
GUIDEMO_main(); //这个函数可以改为自己的应用程序,这样就是最简单的UCGUI应用程序了
}
}
但要注意的是UCOS的任务,都必须要有OSTimeDly等延时函数,这样其他任务才能被调度
所以这里的
while(1) {
GUIDEMO_main(); //这个函数可以改为自己的应用程序,这样就是最简单的UCGUI应用程序了
}
并不是简单的while死循环,在GUIDEMO_main函数里是有简接调用OSTimeDly的,比如GUI_Delay,GUI_X_Delay等
-------------------------------------------------- 完 --------------------------------------------------------- |