我下载了emWin5.24版本。按照网上说的办法移植(网址 http://blog.sina.com.cn/s/blog_af170a920101dpxe.html),但是移植过程中,发现一运行emWin库就会挂掉,我怀疑是画点函数没有和emWin的画点函数关联起来。。求晕哥指点,emWin画点函数怎么关联我自己的lcd屏的画点,画线,清屏等操作?
离线
如何和emWin中的画点函数关联 起来?emWin中画点函数是哪个函数?
离线
刚刚翻阅了一下公司的ucgui(emwin以前的版本)产品资料,
发现只要提供写像素和读像素两个函数就可以了:
void LCDSIM_SetPixelIndex(int x, int y, int Index, int LayerIndex)
{
LCD_Buffer[y*LCD_XSIZE+x] = Index;
}int LCDSIM_GetPixelIndex(int x, int y, int LayerIndex)
{
return LCD_Buffer[y*LCD_XSIZE+x];
}
查了一下 RT1052 sdk 的emwin,发现 接口已经变了。
在线
我下载了emWin5.24版本。按照网上说的办法移植(网址 http://blog.sina.com.cn/s/blog_af170a920101dpxe.html),但是移植过程中,发现一运行emWin库就会挂掉,我怀疑是画点函数没有和emWin的画点函数关联起来。。求晕哥指点,emWin画点函数怎么关联我自己的lcd屏的画点,画线,清屏等操作?
...
接下来是一个关键,如果你在裸机的情况下实现过LCD显示就很好办了,主要有以下两部分:
1)、初始化,在LCD_X_DisplayDriver函数的case LCD_X_INITCONTROLLER:里增加初始化代码:
__lcdInit();
__touchInit();
是一个函数,还是两个函数,还是其它函数名字,你自己喜欢。
2)、像素操作函数,在LCD_X_DisplayDriver函数的case LCD_X_SETORG:里增加像素操作函数:
__SetDisplayOrigin(p->xPos, p->yPos);
一样的道理,函数名字自己喜欢,但函数的两个参数是必需这样的。
...
这个demo和 RT1052不太一致,
估计RT1052有双缓冲,
所以不用实现 LCD_X_SETORG,
只要实现了 LCD_X_SHOWBUFFER 即可
在线
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void *p)
{
uint32_t addr;
#if (LCD_BITS_PER_PIXEL == 8)
uint16_t colorR, colorG, colorB;
uint32_t color;
#endif
int result = 0;
LCD_X_SHOWBUFFER_INFO *pData;
switch (Cmd)
{
case LCD_X_INITCONTROLLER:
{
APP_ELCDIF_Init();
break;
}
case LCD_X_SHOWBUFFER:
{
pData = (LCD_X_SHOWBUFFER_INFO *)p;
/* Calculate address of the given buffer */
addr = VRAM_ADDR + VRAM_SIZE * pData->Index;
/* Make the given buffer visible */
ELCDIF_SetNextBufferAddr(APP_ELCDIF, addr);
//
// Remember buffer index to be used by ISR
//
s_LCDpendingBuffer = pData->Index;
while (s_LCDpendingBuffer >= 0)
;
return 0;
}
#if (LCD_BITS_PER_PIXEL == 8)
case LCD_X_SETLUTENTRY:
{
//
// Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p
//
LCD_X_SETLUTENTRY_INFO *pData;
pData = (LCD_X_SETLUTENTRY_INFO *)p;
//
// Call hardware routine to write a LUT entry to the controller
//
color = pData->Color;
colorB = (color & 0xFF0000) >> 16;
colorG = (color & 0x00FF00) >> 8;
colorR = (color & 0x0000FF);
/* 16-bit bus */
lutData[pData->Pos] = ((colorR >> 3) << 11) | ((colorG >> 2) << 5) | ((colorB >> 3) << 0);
return 0;
}
#endif
default:
result = -1;
break;
}
return result;
}
上面是 RT1052 sdk自带的emwin demo实现LCD_X_DisplayDriver( ) 代码。
在线
int main(void)
{
...
WM_SetDesktopColor(GUI_WHITE);
WM_Exec();while (1)
{
/* Poll touch controller for update */
if (BOARD_Touch_Poll())
{
#ifdef GUI_BUFFERS
GUI_MULTIBUF_Begin();
#endif
GUI_Exec();
#ifdef GUI_BUFFERS
GUI_MULTIBUF_End();
#endif
}
}
...
}
void APP_LCDIF_IRQHandler(void)
{
uint32_t intStatus;intStatus = ELCDIF_GetInterruptStatus(APP_ELCDIF);
ELCDIF_ClearInterruptStatus(APP_ELCDIF, intStatus);
if (intStatus & kELCDIF_CurFrameDone)
{
if (s_LCDpendingBuffer >= 0)
{
/* Send a confirmation that the given buffer is visible */
GUI_MULTIBUF_Confirm(s_LCDpendingBuffer);
s_LCDpendingBuffer = -1;
}
}
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}
/*******************************************************************************
* Application implemented functions required by emWin library
******************************************************************************/
void LCD_X_Config(void)
{
GUI_MULTIBUF_Config(GUI_BUFFERS);
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
LCD_SetSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
LCD_SetVSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);
#if (LCD_BITS_PER_PIXEL == 8)
LCD_SetLUT(&_aPalette_256);
#endif
BOARD_Touch_Init();
}
RT1052 emwin 处理双缓冲代码.
在线
我下载了emWin5.24版本。按照网上说的办法移植(网址 http://blog.sina.com.cn/s/blog_af170a920101dpxe.html),但是移植过程中,发现一运行emWin库就会挂掉,我怀疑是画点函数没有和emWin的画点函数关联起来。。求晕哥指点,emWin画点函数怎么关联我自己的lcd屏的画点,画线,清屏等操作?
实现 Keil_v5\ARM\Segger\emWin\Sample\DisplayDriver\GUIDRV_Template.c 这个里面的画点函数.
zh.DM00089670.pdf
如果不支持所使用的显示控制器,用户只需要改编 Library\STemWinLibraryXYZ\Config 目录
下的 GUIDRV_Template.c 文件,即可轻松创建个性化的驱动程序。实际上,这个模板文件
包含有显示驱动程序所需要用到的全部功能。需要适配改编的主要程序为 _SetPixelIndex()
和 _GetPixelIndex()。如果无法读取显示内容,应利用显示数据缓存来代替对
_GetPixelIndex() 函数的调用。
在线
试了,好像还是没反应。。。我之前找的emWin的例子,都没看到过 LCD_X_SHOWBUFFER 的相关部分的实现。。。
离线
试了,好像还是没反应。。。我之前找的emWin的例子,都没看到过 LCD_X_SHOWBUFFER 的相关部分的实现。。。
这个帖子不错: http://forum.armfly.com/forum.php?mod=viewthread&tid=1678
1. 添加 三个文件 GUIDRV_Template.c,GUIDRV_TemplateI.c,GUIDRV_TemplateI_SetFuncXXX.c 到工程
2. 修改 _SetPixelIndex, _GetPixelIndex, _GetDevData 三个函数
3. 注册显卡驱动
void LCD_X_Config(void)
{
/* Set display driver and color conversion for 1st layer */
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
/* Display driver configuration */
LCD_SetSizeEx (0, 128, 64);
LCD_SetVSizeEx (0, 128, 64);
}
做完上面三步,基本完成 emwin LCD驱动。
在线
怎么注册驱动,为什么我注册了驱动总是报错。。。
离线
我注册成功了,但是显示依然无法 显示。。
离线
如何调试了?求指点
35584301 说:我注册成功了,但是显示依然无法 显示。。
用仿真器跟踪,有没有进入打点函数。
离线
怎么用仿真器跟踪?
如何调试了?求指点
晕哥 说:35584301 说:我注册成功了,但是显示依然无法 显示。。
用仿真器跟踪,有没有进入打点函数。
离线
现在调动emWin刷屏是可以 ,但是显示字体还有问题
离线
如何把我的延迟函数替换emWin中的延迟函数?
离线
显示 字体的函数有问题,有没有办法 void GUI_DispStringAt(const char * s, int x, int y) 调动了哪些底层函数?
离线
现在显示字体成功了,但是显示速度有点缓慢。。。其他 的都 正常了。。。有没有办法 使字体刷新的速度提高点吗?
离线
void GUI_Delay (int Period)这个延迟函数是不是没有调动 void GUI_X_Delay(int ms)函数?我重定义了GUI_X_Delay.能正常调动GUI_X_Delay,但是不能正常调动GUI_Delay,调动时时程序会卡住不动。
离线
从 ucgui 3.98代码看, GUI_Delay 调用了 GUI_X_Delay
/*********************************************************************
*
* GUI_Delay
*/
void GUI_Delay(int Period) {
int EndTime = GUI_GetTime()+Period;
int tRem; /* remaining Time */
GUI_ASSERT_NO_LOCK();
while (tRem = EndTime- GUI_GetTime(), tRem>0) {
GUI_Exec();
GUI_X_Delay((tRem >5) ? 5 : tRem);
}
}
在线
哦。原来调动了GUI_GetTime()来获利时间,加了systick中断进去。
int GUI_X_GetTime(void) {
return TimeMS;
} 。把TimeMS设置成随systick变化就可以正常工作了。
离线
还有一个问题了,我查到的问题是“GUIConf.c”里的“#define GUI_NUMBYTES 1024* 12 // ”定义问题。
我想把这个改大点。改成 “#define GUI_NUMBYTES 1024* 30// ”编译器就报错用户空间超出32K的空间。我的芯片是iROM是64K的。为什么只能用32K的空间。 我看lpc1788的例子的配置“GUIConf.c”里的“#define GUI_NUMBYTES (1024 * 1024) * 12 // x MByte”定义问题。
lpc1788不可能有12M的空间了。。这个是怎么分配空间的?
离线
输出字体正常了,显示也正常。就是显示有点慢。。GUI的延迟函数也修改好了,显示驱动我也改了,还是一样显示有点慢。这块芯片没有LCM控制器不能采用DMA方式 操作LCM,只能通过GPIO方式来模拟,来操作屏幕。。
离线
估计要显示快速,芯片得换成LPC1788.。里面有 LCM的控制器以及256M的SDRAM,IROM也比这个大。。
离线