请选择 进入手机版 | 继续访问电脑版
查看: 1801|回复: 3

[分享] LPC54608 Crank Storyboard Engine与IAR集成

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3296

    主题

    6541

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31904
    最后登录
    2024-3-28
    发表于 2021-1-15 10:36:00 | 显示全部楼层 |阅读模式
    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项目
    创建一个新项目并从硬件配置参数。
    21.png
    2.2.2将资产添加到应用程序并创建屏幕
    要显示不同的内容,我们可以创建具有不同资产的不同屏幕,例如图像,控件等。


    在此应用程序中,有两个屏幕。
    •屏幕启动后显示screen_meter_start,如图2所示。
    22.png
    •从screen_meter_start运行后,显示screen_meter_stop,如图3所示。
    23.png
    2.2.3创建指针旋转动画
    在演示中,当用户单击“开始”按钮时,指针将从0指向180,并且“开始”按钮将变为暂停按钮。如果用户单击“暂停”按钮,则指针将指向180到0。因此,我们将创建两个动画来显示指针旋转。
    使用Storyboard Designer创建动画非常容易。
    1.单击动画->开始录制新动画以开始并将旋转角度从-150更改为150。
    2.单击动画->停止录制动画以停止并保存新动画。
    3.单击“动画时间轴”中的“预览动画”进行预览。
    4.按照相同的步骤创建第二个动画,唯一的区别是指针旋转角度发生了变化从150到-150。
    2.2.4向按钮添加动作

    添加动画以按下按钮动作。如果按下该按钮,它将调用上面创建的动画
    24.png
    2.2.5向动画事件添加动作
    在此应用程序中,单击“播放”按钮,指针开始旋转,并且“播放”按钮变为“暂停”按钮。然后,点击暂停按钮,指针旋转到0,而暂停按钮变为播放按钮。

    要实现此功能,请向动画完成事件添加动作。
    25.png
    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的新组。
    26.png
    •将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引擎的项目中。
    27.png
    •将定义的符号添加到对象->选项-> C / C ++编译器->定义的符号。
    1. FSL_RTOS_FREE_RTOS
    2. GRE_TARGET_CPU_cortexm4
    3. GRE_TARGET_TOOLCHAIN_iar
    4. GRE_TARGET_OS_freertos
    5. GRE_ENABLE_STATIC_PLUGINS
    6. GRE_FEATURE_VFS_RESOURCES
    复制代码

    •将由Storyboard Designer创建的sbengine_model.h复制到项目中的源文件夹。
    •配置freertos。
    —设置FreeRTOSConfig.h选项:
    1. #define configFRTOS_MEMORY_SCHEME 3
    2. #define configUSE_TIME_SLICING 1
    3. #define configENABLE_BACKWARD_COMPATIBILITY 1
    4. #define configTICK_RATE_HZ ((TickType_t)1000)
    复制代码
    —用heap_3.c替换heap_4.c。
    •在freertos_hello.c中添加sbengine_main_task()定义和任务创建。
    1.将定义放在hello_task_PRIORITY的定义之后
    1. void sbengine_main_task(void *argument);
    复制代码
    2.替换Hello_task代码:
    1. if (xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE + 10,
    2. NULL, hello_task_PRIORITY, NULL) != pdPASS)
    复制代码
    3.替换为sbengine_main_task创建代码。
    1. if (xTaskCreate(sbengine_main_task, "sbengine", 4096, NULL,
    2. configMAX_PRIORITIES / 2, NULL) != pdPASS)
    复制代码
    •将初始化函数调用添加到freertos_hello.c。
    1.确保以下标题包含在freertos_hello.c中
    1. #include "peripheral.h"
    复制代码
    2.添加cock和外设初始化功能,如下所示:
    1. int main(void)
    2. {
    3. /* Init board hardware. */
    4. /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    5. CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    6. /* Route Main clock to LCD. */
    7. CLOCK_AttachClk(kMAIN_CLK_to_LCD_CLK);
    8. CLOCK_SetClkDiv(kCLOCK_DivLcdClk, 1, true);
    9. /* attach 12 MHz clock to FLEXCOMM2 (I2C master for touch controller) */
    10. CLOCK_AttachClk(kFRO12M_to_FLEXCOMM2);
    11. CLOCK_EnableClock(kCLOCK_Gpio2);
    12. BOARD_InitPins();
    13. BOARD_BootClockPLL180M();
    14. BOARD_InitDebugConsole();
    15. BOARD_InitSDRAM();
    16. BOARD_InitPeripheral();
    17. if(xTaskCreate(sbengine_main_task, "sbengine", 4096, NULL, hello_task_PRIORITY, NULL) !=
    18. pdPASS)
    19. {
    20. PRINTF("Task creation failed!.\r\n");
    21. while (1)
    22. ;
    复制代码
    •更新sbengine_task.c。
    1.添加包括头文件
    1. #include "gre.h"
    2. #include "iodefs.h"
    3. #include "generic_display.h"
    4. #include "greal.h"
    5. #include "peripheral.h"
    6. #include "fsl_lcdc.h"
    复制代码
    2.添加全局变量定义。
    1. gr_generic_display_layer_info_t main_layer;
    2. gr_application_t *app;
    复制代码
    3.删除gr_application_t * app;定义位于run_storyboard_app()中。
    4.如下实现int gr_generic_display_init()函数:
    1. int
    2. gr_generic_display_init(gr_generic_display_info_t *info) {
    3. info->num_layers = 1;
    4. main_layer.num_buffers = 2;
    5. info->layer_info = &main_layer;

    6. main_layer.buffer[0] = (void *)(VRAM_ADDR);
    7. #if(LCD_BITS_PER_PIXEL == 16)
    8. main_layer.render_format = GR_RENDER_FMT_RGB565;
    9. #elif(LCD_BITS_PER_PIXEL == 32)
    10. main_layer.render_format = GR_RENDER_FMT_ARGB8888;
    11. #endif
    12. main_layer.width = 480;
    13. main_layer.height = 272;
    14. main_layer.stride = (uint16_t)(main_layer.width *
    15. GR_RENDER_FMT_BYTESPP(main_layer.render_format));
    16. main_layer.buffer[1] = (void *)(VRAM_ADDR + VRAM_SIZE);
    17. return 0;
    18. }
    复制代码
    5.实现int gr_generic_display_update()函数,如下所示:
    1. int
    2. gr_generic_display_update(const gr_generic_display_info_t *info) {
    3. s_frame_done = false;
    4. LCDC_SetPanelAddr(BOARD_LCD, kLCDC_UpperPanel, (uint32_t)info->layer_info[0].buffer[info-
    5. >layer_info[0].buffer_draw_index]);
    6. while(s_frame_done == false);
    7. return 0;
    8. }
    复制代码
    •更新sbengine_plugins.h
    1. // gre plugins
    2. extern int gre_plugin_animate(gr_plugin_state_t *);
    3. //extern int gre_plugin_captureplayback(gr_plugin_state_t *);
    4. extern int gre_plugin_logger(gr_plugin_state_t *);
    5. extern int gre_plugin_timer(gr_plugin_state_t *);
    6. extern int gre_plugin_greio(gr_plugin_state_t *);

    7. // Render extension plugins
    8. extern int gre_plugin_circle(gr_plugin_state_t *);
    9. extern int gre_plugin_poly(gr_plugin_state_t *);
    10. extern int gre_plugin_script_lua(gr_plugin_state_t *);
    11. extern int gre_plugin_c_callback(gr_plugin_state_t *);
    12. extern int gre_plugin_screen_path(gr_plugin_state_t *);

    13. const gr_plugin_create_func_t sb_plugins[] = {
    14. gre_plugin_animate,
    15. gre_plugin_greio,
    16. gre_plugin_c_callback,
    17. //gre_plugin_circle,
    18. //gre_plugin_screen_path,
    19. gre_plugin_logger,
    20. //gre_plugin_poly,
    21. //gre_plugin_script_lua,
    22. gre_plugin_timer,
    23. NULL,
    24. };
    复制代码
    •更新链接器文件中定义的__heap_size__。
    1.找到链接器文件,如图10所示。
    28.png
    2.单击按钮打开文件夹,然后编辑链接器配置文件LPC54628J512_flash.icf。

    3.将__heap_size__更改为13000
    1. if (isdefinedsymbol(__heap_size__)) {
    2. define symbol __size_heap__ = __heap_size__;
    3. } else {
    4. define symbol __size_heap__ = 1024*1024;
    5. }
    复制代码
    4.将HEAP放置到SDRAM。
    29.png

    •修改链接器文件,以将一些lib文件分配给SPIFI flash。
    30.png
    •编译项目并进行测试。
    —如果编译后没有错误,则用户可以将图像下载到LPC54608 EVK进行测试。 LCD可以显示仪表和按钮,如图13所示。
    31.png
    —没有触摸功能的支持,LCD上的按钮将无法使用。
    3.4.3触摸任务实施
    触摸芯片ft5406在位于external.c中的BOARD_InitPeripheral()中初始化。实施触摸任务以支持触摸功能。

    放置以下函数以轮询来自触摸屏的输入,并将结果事件推入Storyboard事件队列。
    1. void sbengine_input_task(void *arg)
    2. {
    3. const int sleep_msec = 20;
    4. greal_timespec_t sleep_time = {
    5. .tv_sec = 0,
    6. .tv_nsec = sleep_msec * 1000000
    7. };
    8. #if defined( APP_USE_STORYBOARD_IO )
    9. gr_key_event_t key_event = { 0, GR_KEY_ENTER, 0};
    10. /* initialise GPIO for USER LED and Button */
    11. BOARD_InitUserGPIO();
    12. #endif
    13. touch_poll_state_t previous_touch_state = {0};
    14. touch_poll_state_t touch_state;
    15. bool pressed = false;
    16. while (1) {
    17. if (kStatus_Success != BOARD_Touch_Poll(&touch_state)) {
    18. greal_nanosleep(&sleep_time, NULL);
    复制代码
    1. continue;
    2. }
    3. // De-bounce inputs
    4. if (previous_touch_state.x == touch_state.x &&
    5. previous_touch_state.y == touch_state.y &&
    6. previous_touch_state.pressed == touch_state.pressed) {
    7. greal_nanosleep(&sleep_time, NULL);
    8. continue;
    9. }
    10. if (touch_state.pressed) {
    11. gr_ptr_event_t event = {
    12. // No, this isn't a typo. The axes are literally inverted at the driver level.
    13. .x = touch_state.y,
    14. .y = touch_state.x,
    15. .z = 1,
    16. .timestamp = gr_snapshot_app_time(app),
    17. };
    18. if (pressed) {
    19. gr_application_send_event(app, NULL, GR_EVENT_MOTION, GR_EVENT_PTR_FMT, &event,
    20. sizeof(event));
    21. } else {
    22. pressed = true;
    23. gr_application_send_event(app, NULL, GR_EVENT_PRESS, GR_EVENT_PTR_FMT, &event,
    24. sizeof(event));
    25. }
    26. previous_touch_state = touch_state;
    27. } else if (pressed) {
    28. gr_ptr_event_t event = {
    29. // No, this isn't a typo. The axes are literally inverted at the driver level.
    30. .x = previous_touch_state.y,
    31. .y = previous_touch_state.x,
    32. .z = 1,
    33. .timestamp = gr_snapshot_app_time(app),
    34. };
    35. pressed = false;
    36. gr_application_send_event(app, NULL, GR_EVENT_RELEASE, GR_EVENT_PTR_FMT, &event,
    37. sizeof(event));
    38. previous_touch_state = touch_state;
    39. }
    40. greal_nanosleep(&sleep_time, NULL);
    41. }
    42. }
    复制代码
    在freertos_hello.c中添加触摸任务创建
    1. if(xTaskCreate(sbengine_input_task, "touch task", 2048, NULL, hello_task_PRIORITY-1, NULL) != pdPASS)
    2. {
    3. PRINTF("Task creation failed!.\r\n");
    4. while (1)
    5. ;
    6. }
    复制代码
    3.4.4编译下载
    将项目编译并下载到LPC54608 EVB并运行。液晶显示屏显示仪表屏幕。按播放按钮,然后按

    指针将旋转。





    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-8 09:39
  • 签到天数: 217 天

    [LV.7]常住居民III

    92

    主题

    1087

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7298

    热心会员

    最后登录
    2024-3-28
    发表于 2021-1-15 16:34:26 | 显示全部楼层
    这个6啊,之前还真没太关注NXP出的GUI,可惜手里暂时没有NXP带屏幕的板子,不知道这个能不能跑在spi接口的屏幕上。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3296

    主题

    6541

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31904
    最后登录
    2024-3-28
     楼主| 发表于 2021-1-15 16:38:25 | 显示全部楼层
    az158 发表于 2021-1-15 16:34
    这个6啊,之前还真没太关注NXP出的GUI,可惜手里暂时没有NXP带屏幕的板子,不知道这个能不能跑在spi接口的 ...

    可以尝试一下
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 1334 天

    [LV.10]以坛为家III

    88

    主题

    4290

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9020
    最后登录
    2024-3-28
    发表于 2021-1-16 17:38:56 | 显示全部楼层
    看了这么好的东西。这就是任务啊~~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 05:27 , Processed in 0.124137 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表