|
发现一个新的GUI,很小巧,心就痒痒了,想试试,目前官方版本是v0.3,官方网站也只提供了f429的demo,但是因本人见识较少,不知道那工程是什么后缀STM32F429.coproj,无奈,就就自己移植一下玩玩了,权当娱乐了。 下班回到家,把f429的discover板子找了出来,已经放了3年了,竟然还能亮起来,很兴奋啊。又从网上找了个discover的例程能点亮ltdc的。万事具备了。 先把GUI介绍一下, What is μGUI μGUI is a free and open source graphic library for embedded systems. It is platform-independent and can be easily ported to almost any microcontroller system. As long as the display is capable of showing graphics, μGUI is not restricted to a certain display technology. Therefore, display technologies such as LCD, TFT, E-Paper, LED or OLED are supported. The whole module consists of two files: ugui.c and ugui.h. μGUI Features
μGUI Requirements μGUI is platform-independent, so there is no need to use a certain embedded system. In order to use μGUI, only two requirements are necessary:
一大早睡不着了,就起来开始移植,花了近2小时,终于移植成功了,当然还没有完成触摸的移植。下面开始汇报一下。 找了个非常干净的例程,里面除了驱动,就是ADC例程,直接删除即可开始移植了。 先上个图看看。 把官方例程的 这几个文件拷贝过来,放到一个文件夹里。把官方例程里的system.h头文件换成例程的Com.h,当然头文件里要增加上图4个c文件的头文件即可。解决几个小的错误,把delay.c里的初始化直接删除,然后在main.c文件中清除些之前工程的函数及变量等,把官方例程main.c文件中的函数,及相关代码拷贝过来即可。需要拷贝的有 /* GUI structure */ UG_GUI gui; /* Touch structure */ //static TP_STATE* TP_State; /* Some defines */ #define MAX_OBJECTS 10 #define TOGGLE_GREEN_LED GPIO_ToggleBits(GPIOG,GPIO_Pin_13); #define TOGGLE_RED_LED GPIO_ToggleBits(GPIOG,GPIO_Pin_14); /* Window 1 */ UG_WINDOW window_1; UG_OBJECT obj_buff_wnd_1[MAX_OBJECTS]; UG_BUTTON button1_1; UG_BUTTON button1_2; UG_BUTTON button1_3; UG_BUTTON button1_4; UG_BUTTON button1_5; UG_BUTTON button1_6; /* Window 2 */ UG_WINDOW window_2; UG_OBJECT obj_buff_wnd_2[MAX_OBJECTS]; UG_BUTTON button2_1; UG_TEXTBOX textbox2_1; UG_TEXTBOX textbox2_2; UG_IMAGE image2_1; /* Window 3 */ UG_WINDOW window_3; UG_OBJECT obj_buff_wnd_3[MAX_OBJECTS]; UG_BUTTON button3_1; UG_TEXTBOX textbox3_1; /* FSM */ #define STATE_MAIN_MENU 0 #define STATE_BENCHMARK_RUN 1 #define STATE_BENCHMARK_RESULT 2 volatile UG_U32 state; volatile UG_U32 next_state; /* Benchmark */ volatile UG_U32 timer; volatile UG_U32 hw_acc = 1; char result_str[30]; UG_S16 xs,ys; UG_S16 xe,ye; UG_COLOR c; extern u32 ltdc_work_layer; /* Hardware accelerator for UG_DrawLine (Platform: STM32F4x9) */ UG_RESULT _HW_DrawLine( UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c ) { DMA2D_InitTypeDef DMA2D_InitStruct; RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2D, ENABLE); RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2D, DISABLE); DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M; DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565; /* Convert UG_COLOR to RGB565 */ DMA2D_InitStruct.DMA2D_OutputBlue = (c>>3) & 0x1F; DMA2D_InitStruct.DMA2D_OutputGreen = (c>>10) & 0x3F; DMA2D_InitStruct.DMA2D_OutputRed = (c>>19) & 0x1F; DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F; /* horizontal line */ if ( y1 == y2 ) { DMA2D_InitStruct.DMA2D_OutputOffset = 0; DMA2D_InitStruct.DMA2D_NumberOfLine = 1; DMA2D_InitStruct.DMA2D_PixelPerLine = x2-x1+1; } /* vertical line */ else if ( x1 == x2 ) { DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH - 1; DMA2D_InitStruct.DMA2D_NumberOfLine = y2-y1+1; DMA2D_InitStruct.DMA2D_PixelPerLine = 1; } else { return UG_RESULT_FAIL; } if ( ltdc_work_layer == LAYER_1 ) { DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_1_OFFSET + 2*(LCD_PIXEL_WIDTH * y1 + x1); } else { DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_2_OFFSET + 2*(LCD_PIXEL_WIDTH * y1 + x1); } DMA2D_Init(&DMA2D_InitStruct); DMA2D_StartTransfer(); while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET){}; return UG_RESULT_OK; } /* Hardware accelerator for UG_FillFrame (Platform: STM32F4x9) */ UG_RESULT _HW_FillFrame( UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c ) { DMA2D_InitTypeDef DMA2D_InitStruct; DMA2D_DeInit(); DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M; DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565; /* Convert UG_COLOR to RGB565 */ DMA2D_InitStruct.DMA2D_OutputBlue = (c>>3) & 0x1F; DMA2D_InitStruct.DMA2D_OutputGreen = (c>>10) & 0x3F; DMA2D_InitStruct.DMA2D_OutputRed = (c>>19) & 0x1F; DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F; DMA2D_InitStruct.DMA2D_OutputOffset = (LCD_PIXEL_WIDTH - (x2-x1+1)); DMA2D_InitStruct.DMA2D_NumberOfLine = y2-y1+1; DMA2D_InitStruct.DMA2D_PixelPerLine = x2-x1+1; if ( ltdc_work_layer == LAYER_1 ) { DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_1_OFFSET + 2*(LCD_PIXEL_WIDTH * y1 + x1); } else { DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_2_OFFSET + 2*(LCD_PIXEL_WIDTH * y1 + x1); } DMA2D_Init(&DMA2D_InitStruct); DMA2D_StartTransfer(); while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET){} return UG_RESULT_OK; } /* Systick interrupt */ void SysTick_Handler(void) { if ( timer ) timer--; if ( state == STATE_MAIN_MENU ) { // TP_State = IOE_TP_GetState(); // if( TP_State->TouchDetected ) // { // if ( (TP_State->X > 0) && (TP_State->X < 239 ) ) // { // if ( (TP_State->Y > 0) && (TP_State->Y < 319 ) ) // { // UG_TouchUpdate(TP_State->X,TP_State->Y,TOUCH_STATE_PRESSED); // } // } // } // else // { // UG_TouchUpdate(-1,-1,TOUCH_STATE_RELEASED); // } } UG_Update(); } void led_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_ToggleBits(GPIOG,GPIO_Pin_14); } void systick_init( void ) { /* Init SysTick (100Hz) */ SystemCoreClockUpdate(); if (SysTick_Config(SystemCoreClock / 100)) { /* Capture error */ while (1); } } /* Callback function for the main menu */ void window_1_callback( UG_MESSAGE* msg ) { if ( msg->type == MSG_TYPE_OBJECT ) { if ( msg->id == OBJ_TYPE_BUTTON ) { switch( msg->sub_id ) { case BTN_ID_0: /* Toggle green LED */ { TOGGLE_GREEN_LED; break; } case BTN_ID_1: /* Toggle red LED */ { TOGGLE_RED_LED; break; } case BTN_ID_2: /* Show ?UI info */ { UG_WindowShow( &window_2 ); break; } case BTN_ID_3: /* Toggle hardware acceleration */ { if ( !hw_acc ) { UG_ButtonSetForeColor( &window_1, BTN_ID_3, C_RED ); UG_ButtonSetText( &window_1, BTN_ID_3, "HW_ACC\nOFF" ); UG_DriverEnable( DRIVER_DRAW_LINE ); UG_DriverEnable( DRIVER_FILL_FRAME ); } else { UG_ButtonSetForeColor( &window_1, BTN_ID_3, C_BLUE ); UG_ButtonSetText( &window_1, BTN_ID_3, "HW_ACC\nON" ); UG_DriverDisable( DRIVER_DRAW_LINE ); UG_DriverDisable( DRIVER_FILL_FRAME ); } hw_acc = !hw_acc; break; } case BTN_ID_4: /* Start benchmark */ { next_state = STATE_BENCHMARK_RUN; break; } case BTN_ID_5: /* Resize window */ { static UG_U32 tog; if ( !tog ) { UG_WindowResize( &window_1, 0, 40, 239, 319-40 ); } else { UG_WindowResize( &window_1, 0, 0, 239, 319 ); } tog = ! tog; break; } } } } } /* Callback function for the info window */ void window_2_callback( UG_MESSAGE* msg ) { if ( msg->type == MSG_TYPE_OBJECT ) { if ( msg->id == OBJ_TYPE_BUTTON ) { switch( msg->sub_id ) { case BTN_ID_0: { UG_WindowHide( &window_2 ); break; } } } } } /* Callback function for the result window */ void window_3_callback( UG_MESSAGE* msg ) { if ( msg->type == MSG_TYPE_OBJECT ) { if ( msg->id == OBJ_TYPE_BUTTON ) { switch( msg->sub_id ) { /* OK button */ case BTN_ID_0: { UG_WindowShow( &window_1 ); break; } } } } } /* better rand() function */ UG_U32 randx( void ) { static UG_U32 z1 = 12345, z2 = 12345, z3 = 12345, z4 = 12345; UG_U32 b; b = ((z1 << 6) ^ z1) >> 13; z1 = ((z1 & 4294967294U) << 18) ^ b; b = ((z2 << 2) ^ z2) >> 27; z2 = ((z2 & 4294967288U) << 2) ^ b; b = ((z3 << 13) ^ z3) >> 21; z3 = ((z3 & 4294967280U) << 7) ^ b; b = ((z4 << 3) ^ z4) >> 12; z4 = ((z4 & 4294967168U) << 13) ^ b; return (z1 ^ z2 ^ z3 ^ z4); } |
| GOOD! |
客气了,,,,, |
微信公众号
手机版