在线时间4061 小时
UID3441752
注册时间2017-11-21
NXP金币759551
TA的每日心情 | 开心 3 天前 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 31904
- 最后登录
- 2024-3-28
|
LPC54608 Crank Storyboard Engine与IAR集成 点击查看完整版>>>
1引言
LPC54608是基于Arm®Cortex®-M4的微控制器系列,用于在嵌入式应用程序中。随着越来越多的嵌入式应用程序的需求图形用户界面(GUI),向开发人员介绍了更多GUI工具。
Crank Storyboard是一个功能强大的GUI开发套件。故事板引擎是提供在Storyboard中开发的内容的运行时组件设计器到嵌入式设备。
本应用笔记演示了如何将Storyboard引擎集成基于freeRTOS的LPC54608。
2通过Storyboard创建应用程序设计
2.1情节提要设计师说明
使用Storyboard Designer,UI设计人员可以轻松地对产品的外观和原型进行原型设计,然后将原型部署到嵌入式目标。设计人员保持对UI的完全控制,而无需执行工程师即可实施。
2.2创建一个应用程序
2.2.1创建一个新的Storyboard Designer项目
创建一个新项目并从硬件配置参数。
2.2.2将资产添加到应用程序并创建屏幕
要显示不同的内容,我们可以创建具有不同资产的不同屏幕,例如图像,控件等。
在此应用程序中,有两个屏幕。
•屏幕启动后显示screen_meter_start,如图2所示。
•从screen_meter_start运行后,显示screen_meter_stop,如图3所示。
2.2.3创建指针旋转动画
在演示中,当用户单击“开始”按钮时,指针将从0指向180,并且“开始”按钮将变为暂停按钮。如果用户单击“暂停”按钮,则指针将指向180到0。因此,我们将创建两个动画来显示指针旋转。
使用Storyboard Designer创建动画非常容易。
1.单击动画->开始录制新动画以开始并将旋转角度从-150更改为150。
2.单击动画->停止录制动画以停止并保存新动画。
3.单击“动画时间轴”中的“预览动画”进行预览。
4.按照相同的步骤创建第二个动画,唯一的区别是指针旋转角度发生了变化从150到-150。
2.2.4向按钮添加动作
添加动画以按下按钮动作。如果按下该按钮,它将调用上面创建的动画
2.2.5向动画事件添加动作
在此应用程序中,单击“播放”按钮,指针开始旋转,并且“播放”按钮变为“暂停”按钮。然后,点击暂停按钮,指针旋转到0,而暂停按钮变为播放按钮。
要实现此功能,请向动画完成事件添加动作。
2.2.6应用程序导出
到目前为止,演示Storyboard应用程序已完成。单击运行->情节提要应用程序导出,然后选择打包程序->
故事板嵌入式资源标头(c / c ++)生成名为sbengine_model.h的标头文件,该标头文件将用于
LPC54608项目。
3将Storyboard Engine移植到LPC54608
3.1硬件说明
LPC54608-EVK开发板旨在实现对LPC54608 MCU的评估和原型设计
利用高性能Arm Cotex-M4内核和LPC54608中具有的高级安全功能的设备
MCU系列。
•128 Mb MX25L12835FM2I-10G Quad-SPI闪存
•华邦128 Mb W9812G6JB-6I SDRAM
•480×272电容触摸TFT LCD屏幕
3.2 Crank软件库
想要重现此应用程序的用户可以访问CRANK以获得Cortex-M4的库。
3.3从NXP安装用于LPC54608的SDK
下载NXP SDK之前,请创建一个NXP在线帐户。您可以通过仪表板工具创建帐户,可为特定的IDE定制。
1.从仪表板工具配置并下载最新的SDK(LPC54628的最新版本2.8.2)。选择LPC54628
从板子列表中,然后为该板子构建SDK。
2.为SDK请求IAR IDE。
3.确保为SDK包括Amazon Freertos和emWIN。
4.下载SDK。
3.4将Crank Storyboard引擎集成到freertos_hello项目
3.4.1移植LCD和触摸驱动器
要显示GUI内容,请初始化LCD及其触摸功能。
•将fsl_lcdc.c和fsl_lcdc.h添加到驱动程序组以初始化LCD控制器。
•将fsl_i2c.c和fsl_i2c.h添加到驱动程序组以访问LCD的触摸芯片。
•将fsl_sctimer.c和fsl_sctimer.h添加到驱动程序组以创建LCD的PWM。
•添加一个名为fsl_ft5406的新组,其中包括fsl_ft5406.c和fsl_ft5406.h。
•将fsl_ft5406目录添加到项目->选项-> C / C ++编译器->预处理程序->其他包含目录。
•创建peripheral.c和peripheral.h,以实现LCD和触摸的初始化功能。并将这两个文件添加到项目。
3.4.2 Crank Storyboard引擎集成
•将Crank发布的freertos-iar-cortexm4-swrender-obj复制到项目根目录。
•为Crank Storyboard引擎创建名为sbengine的新组。
•将freertos-iar-cortexm4-swrender-obj \ src \ lib \ greal \ freertos中的所有文件添加到greal_src组。
•将位于freertos-iar-cortexm4-swrender-obj \ lib中的libgreal.a以外的所有文件添加到lib组。
•将freertos-iar-cortexm4-swrender-obj \ plugins中的所有文件添加到插件组。
•从以下位置拖放Storyboard引擎模板文件:
freertos-iar-cortexm4-swrender-obj \ src \ sbengine_freertos \ sbengine_task.c
freertos-iar-cortexm4-swrender-obj \ src \ sbengine_freertos \ sbengine_plugins.h
到项目中的源文件夹:
板\ lpcxpresso54628 \ rtos_examples \ freertos_hello \ sbengine_task.c
板\ lpcxpresso54628 \ rtos_examples \ freertos_hello \ sbengine_plugins.h
•将所有包含路径/目录添加到Storyboard引擎的项目中。
•将定义的符号添加到对象->选项-> C / C ++编译器->定义的符号。
- FSL_RTOS_FREE_RTOS
- GRE_TARGET_CPU_cortexm4
- GRE_TARGET_TOOLCHAIN_iar
- GRE_TARGET_OS_freertos
- GRE_ENABLE_STATIC_PLUGINS
- GRE_FEATURE_VFS_RESOURCES
复制代码
•将由Storyboard Designer创建的sbengine_model.h复制到项目中的源文件夹。
•配置freertos。
—设置FreeRTOSConfig.h选项:
- #define configFRTOS_MEMORY_SCHEME 3
- #define configUSE_TIME_SLICING 1
- #define configENABLE_BACKWARD_COMPATIBILITY 1
- #define configTICK_RATE_HZ ((TickType_t)1000)
复制代码 —用heap_3.c替换heap_4.c。
•在freertos_hello.c中添加sbengine_main_task()定义和任务创建。
1.将定义放在hello_task_PRIORITY的定义之后
- void sbengine_main_task(void *argument);
复制代码 2.替换Hello_task代码:
- if (xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE + 10,
- NULL, hello_task_PRIORITY, NULL) != pdPASS)
复制代码 3.替换为sbengine_main_task创建代码。
- if (xTaskCreate(sbengine_main_task, "sbengine", 4096, NULL,
- configMAX_PRIORITIES / 2, NULL) != pdPASS)
复制代码 •将初始化函数调用添加到freertos_hello.c。
1.确保以下标题包含在freertos_hello.c中
2.添加cock和外设初始化功能,如下所示:
- int main(void)
- {
- /* Init board hardware. */
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- /* Route Main clock to LCD. */
- CLOCK_AttachClk(kMAIN_CLK_to_LCD_CLK);
- CLOCK_SetClkDiv(kCLOCK_DivLcdClk, 1, true);
- /* attach 12 MHz clock to FLEXCOMM2 (I2C master for touch controller) */
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM2);
- CLOCK_EnableClock(kCLOCK_Gpio2);
- BOARD_InitPins();
- BOARD_BootClockPLL180M();
- BOARD_InitDebugConsole();
- BOARD_InitSDRAM();
- BOARD_InitPeripheral();
- if(xTaskCreate(sbengine_main_task, "sbengine", 4096, NULL, hello_task_PRIORITY, NULL) !=
- pdPASS)
- {
- PRINTF("Task creation failed!.\r\n");
- while (1)
- ;
复制代码 •更新sbengine_task.c。
1.添加包括头文件
- #include "gre.h"
- #include "iodefs.h"
- #include "generic_display.h"
- #include "greal.h"
- #include "peripheral.h"
- #include "fsl_lcdc.h"
复制代码 2.添加全局变量定义。
- gr_generic_display_layer_info_t main_layer;
- gr_application_t *app;
复制代码 3.删除gr_application_t * app;定义位于run_storyboard_app()中。
4.如下实现int gr_generic_display_init()函数:
- int
- gr_generic_display_init(gr_generic_display_info_t *info) {
- info->num_layers = 1;
- main_layer.num_buffers = 2;
- info->layer_info = &main_layer;
- main_layer.buffer[0] = (void *)(VRAM_ADDR);
- #if(LCD_BITS_PER_PIXEL == 16)
- main_layer.render_format = GR_RENDER_FMT_RGB565;
- #elif(LCD_BITS_PER_PIXEL == 32)
- main_layer.render_format = GR_RENDER_FMT_ARGB8888;
- #endif
- main_layer.width = 480;
- main_layer.height = 272;
- main_layer.stride = (uint16_t)(main_layer.width *
- GR_RENDER_FMT_BYTESPP(main_layer.render_format));
- main_layer.buffer[1] = (void *)(VRAM_ADDR + VRAM_SIZE);
- return 0;
- }
复制代码 5.实现int gr_generic_display_update()函数,如下所示:
- int
- gr_generic_display_update(const gr_generic_display_info_t *info) {
- s_frame_done = false;
- LCDC_SetPanelAddr(BOARD_LCD, kLCDC_UpperPanel, (uint32_t)info->layer_info[0].buffer[info-
- >layer_info[0].buffer_draw_index]);
- while(s_frame_done == false);
- return 0;
- }
复制代码 •更新sbengine_plugins.h
- // gre plugins
- extern int gre_plugin_animate(gr_plugin_state_t *);
- //extern int gre_plugin_captureplayback(gr_plugin_state_t *);
- extern int gre_plugin_logger(gr_plugin_state_t *);
- extern int gre_plugin_timer(gr_plugin_state_t *);
- extern int gre_plugin_greio(gr_plugin_state_t *);
- // Render extension plugins
- extern int gre_plugin_circle(gr_plugin_state_t *);
- extern int gre_plugin_poly(gr_plugin_state_t *);
- extern int gre_plugin_script_lua(gr_plugin_state_t *);
- extern int gre_plugin_c_callback(gr_plugin_state_t *);
- extern int gre_plugin_screen_path(gr_plugin_state_t *);
- const gr_plugin_create_func_t sb_plugins[] = {
- gre_plugin_animate,
- gre_plugin_greio,
- gre_plugin_c_callback,
- //gre_plugin_circle,
- //gre_plugin_screen_path,
- gre_plugin_logger,
- //gre_plugin_poly,
- //gre_plugin_script_lua,
- gre_plugin_timer,
- NULL,
- };
复制代码 •更新链接器文件中定义的__heap_size__。
1.找到链接器文件,如图10所示。
2.单击按钮打开文件夹,然后编辑链接器配置文件LPC54628J512_flash.icf。
3.将__heap_size__更改为13000
- if (isdefinedsymbol(__heap_size__)) {
- define symbol __size_heap__ = __heap_size__;
- } else {
- define symbol __size_heap__ = 1024*1024;
- }
复制代码 4.将HEAP放置到SDRAM。
•修改链接器文件,以将一些lib文件分配给SPIFI flash。
•编译项目并进行测试。
—如果编译后没有错误,则用户可以将图像下载到LPC54608 EVK进行测试。 LCD可以显示仪表和按钮,如图13所示。
—没有触摸功能的支持,LCD上的按钮将无法使用。
3.4.3触摸任务实施
触摸芯片ft5406在位于external.c中的BOARD_InitPeripheral()中初始化。实施触摸任务以支持触摸功能。
放置以下函数以轮询来自触摸屏的输入,并将结果事件推入Storyboard事件队列。
- void sbengine_input_task(void *arg)
- {
- const int sleep_msec = 20;
- greal_timespec_t sleep_time = {
- .tv_sec = 0,
- .tv_nsec = sleep_msec * 1000000
- };
- #if defined( APP_USE_STORYBOARD_IO )
- gr_key_event_t key_event = { 0, GR_KEY_ENTER, 0};
- /* initialise GPIO for USER LED and Button */
- BOARD_InitUserGPIO();
- #endif
- touch_poll_state_t previous_touch_state = {0};
- touch_poll_state_t touch_state;
- bool pressed = false;
- while (1) {
- if (kStatus_Success != BOARD_Touch_Poll(&touch_state)) {
- greal_nanosleep(&sleep_time, NULL);
复制代码- continue;
- }
- // De-bounce inputs
- if (previous_touch_state.x == touch_state.x &&
- previous_touch_state.y == touch_state.y &&
- previous_touch_state.pressed == touch_state.pressed) {
- greal_nanosleep(&sleep_time, NULL);
- continue;
- }
- if (touch_state.pressed) {
- gr_ptr_event_t event = {
- // No, this isn't a typo. The axes are literally inverted at the driver level.
- .x = touch_state.y,
- .y = touch_state.x,
- .z = 1,
- .timestamp = gr_snapshot_app_time(app),
- };
- if (pressed) {
- gr_application_send_event(app, NULL, GR_EVENT_MOTION, GR_EVENT_PTR_FMT, &event,
- sizeof(event));
- } else {
- pressed = true;
- gr_application_send_event(app, NULL, GR_EVENT_PRESS, GR_EVENT_PTR_FMT, &event,
- sizeof(event));
- }
- previous_touch_state = touch_state;
- } else if (pressed) {
- gr_ptr_event_t event = {
- // No, this isn't a typo. The axes are literally inverted at the driver level.
- .x = previous_touch_state.y,
- .y = previous_touch_state.x,
- .z = 1,
- .timestamp = gr_snapshot_app_time(app),
- };
- pressed = false;
- gr_application_send_event(app, NULL, GR_EVENT_RELEASE, GR_EVENT_PTR_FMT, &event,
- sizeof(event));
- previous_touch_state = touch_state;
- }
- greal_nanosleep(&sleep_time, NULL);
- }
- }
复制代码 在freertos_hello.c中添加触摸任务创建
- if(xTaskCreate(sbengine_input_task, "touch task", 2048, NULL, hello_task_PRIORITY-1, NULL) != pdPASS)
- {
- PRINTF("Task creation failed!.\r\n");
- while (1)
- ;
- }
复制代码 3.4.4编译下载
将项目编译并下载到LPC54608 EVB并运行。液晶显示屏显示仪表屏幕。按播放按钮,然后按
指针将旋转。
|
|