查看: 7926|回复: 19

[作品提交] 基于LPC55S69平台的多媒体控制系统

[复制链接]
  • TA的每日心情
    开心
    2019-10-28 09:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    4

    主题

    35

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    357
    最后登录
    2022-9-29
    发表于 2020-1-1 19:26:44 | 显示全部楼层 |阅读模式
    本帖最后由 realjace 于 2020-1-1 19:45 编辑


    基于LPC55S69平台的
    多媒体控制系统


    1项目概述
           多媒体控制系统基于LPC55s69主控,使用3.2寸触摸彩屏做为人机交互,旨在让用户通过简单的触摸即可实现对设备的控制,如控制室内的灯光、音乐、空调等设备。

           该系统充分发挥了LPC55s69的性能,在FreeRTOS系统中,150M主频双核M33相互配合完成系统任务:主核Core0用于处理主逻辑,包括显示图形处理、触摸数据处理、功能逻辑控制等,在图形处理中同时引入POWERQUAD加速计算速度;协核Core1用于刷新彩屏,其通过MCU的高速SPI50M+DMA方式驱动3.2寸彩屏,240*320的彩屏刷新频率可高达60Hz以上。该主控优秀的性能,使得本系统操作非常流畅!

    本系统在发挥LPC55s69高性能的同时,也使用了它的POWER管理功能,以达到性能功耗的平衡。主核在没有事情处理时就会进入睡眠低功耗模式,此时通过中断(FreeRTOS的系统TICK)唤醒。协核在没有事情处理时也进入低功耗模式,其通过主核的通知中断来唤醒。

    1.png



    2 作品实物图
    2-1.png 3-1.png
    4-1.png 5-1.png




    3 演示视频
    多媒体控制系统:

    灯光效果:



    4 项目文档
    资料已经上传网盘(代码+产品图片+文档):
    链接:https://pan.baidu.com/s/1i78XibQosa4uM1nKDZ_Mtw
    提取码:zxvd

    代码已经开源到git



    5 硬件
    本系统硬件包括:
      
    硬件
      
    数量
    用途
    规格
    LPCXpresso55S69开发板
    1
    主控

    3.2寸,240*320电阻触摸屏
    1
    交互
    显示驱动ILI9341
      
    TP   xpt2046
    红外发射管
    1
    红外遥控
    38KHZ,插件红外LED


    5.1 硬件连线
    LCDTP

    6.png
    红外

    7.png


    6 系统设计说明
           这里将描述系统的实现过程,以便给看到此工程的开发人员一些参考。本系统基于NXP的开发IDE MCUXpresso IDEv11.0.1_2563 开发,使用的LPC55S69 SDK版本为SDK_2.6.3_LPCXpresso55S69_MCUX.zip

    IDESDK可到官网[url=http://www.nxp.com.cn/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc5500-cortex-m33/high-efficiency-arm-cortex-m33-based-microcontroller-familyPC55S6x?&tab=Documentation_Tab]下载[/url]


    6.1 工程目录结构
    windows资源管理器下的工程目录结构:

    8.png

    MCUXpresso 中的目录:

    9.png


    6.2 双核工程关联编译
           系统的Core0Core1代码是相互独立的,要建立两个工程来开发彼此的功能。MCUXpresso 提供了工程关联编译、链接的功能,需要作以下操作。

    1、右键Core0工程进入属性

    10.png

    2、在属性中的‘项目引用,勾选Core1的工程:

    11.png

    3、之后按下图设置:C/C++ Build-> Setting -> Mcu Linker ,在弹出的对话框中选中Core1工程的.o文件(core1工程需要单独编译后才有.o文件)

    12.png


    6.3 系统空间分配
           MCU自带640KBFLASH320KBRAMMCU上电后先启动的Core0Core0Core1的代码从FLASH中复制到RAM中,将Core1RAM启动。


    6.3.1 RAM空间分配
           RAM分为3个区域,Ram0 198KBCORE0使用,Ram1 68KBCORE1使用,rpmsg_sh_mem 6KB预留给双核共享内存。
    1. MEMORY
    2. {
    3.   /* Define each memory region */
    4.   PROGRAM_FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x98000 /* 608K bytes (alias Flash) */  
    5.   Ram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x31800 /* 198K bytes (alias RAM) */  
    6.   Ram1 (rwx) : ORIGIN = 0x20033000, LENGTH = 0x11000 /* 68K bytes (alias RAM2) */  
    7.   rpmsg_sh_mem (rwx) : ORIGIN = 0x20031800, LENGTH = 0x1800 /* 6K bytes (alias RAM3) */  
    8. }
    复制代码



    6.3.2 FLASH空间分配
           FLASH一共640KB,现在只使用了前608KBFlash最前面存放.isr_vector,随后是编译到Ram1中的Core1代码,再后面是Core0的代码。


    13.png


    6.4 软件逻辑结构
           本机为全触摸机器,所有功能操作都只能通过触摸实现。机器支持左右滑动切换界面,单点打开应用,右滑能出应用,而应用中的操作可以是各式各样的。
    系统中的APP,有控制类的(控制灯、空调、音乐等),有小游戏之类的。

    软件整体框架如图:

    14.png

    Core0基于FreeRTOS系统开发,Core1为裸机程序。Core0中引包括了本人发明的jace FS(文件系统)、jace GUI (图形库)两大内容,并且使用了独家创作的操作系统任务管理方式,各大软件相互高效配合,使得本系统操作非常流畅!
           Core0通过触摸输入、系统事件触发调用GUI实现界面图形的处理,处理完成发送信号给Core1Core1进入刷屏。


    6.5 代码实现
           系统代码比较多,这里列出几处理关键的地方。


    6.5.1 双核通信
           双核通过一个叫做和MailBox的东西相互通信,这个模块只有几个寄存器:
    15.png

    双核之间的通信(叫通知可能更贴切)每次只能传输4字节,如Core0通过把uint32_t类型的数据给IRQ1SET寄存器,Core1就会产生中断,在中断里面通过读取IRQ1寄存器就可以获取到Core0传过来的4字节数据。
    所以如果要更好的使用双核,MailBox要配合共享内存空间使用,才能实现更多功能。


    1、初始化
    Core0启动Core1
    1. MCMGR_Init();
    2. MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, (uint32_t)gui_get_front_fb(), kMCMGR_Start_Synchronous);
    复制代码


    本系统中,Core0启动Core1时,把屏幕FB地址通过启动参数传输给Core1Core1使用该BUF刷新屏幕。

    2、注册通知回调
    Core0为了能接收Core1的通知,需要注册中断回调函数:
    1. static void RPMsgRemoteReadyEventHandler(uint16_t eventData, void *context)
    2. {
    3.     if(eventData==RPMSG_FLUSH_SCREEN_DONE)
    4.     {
    5.        if(core1_req_task)
    6.        {
    7.            OS_TASK_NOTIFY_FROM_ISR(core1_req_task,REQ_COMPLETE,OS_NOTIFY_SET_BITS);
    8.        }
    9.     }
    10. }
    11. MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent, RPMsgRemoteReadyEventHandler,0);
    复制代码


    Core0中断回调函数中,把Core1通知发送给主任务,由主任务处理该事件。

    3、发送通知
    完成以上两步,接下来Core0就可以给Core1发数据了,以下展示Core0通知Core1刷屏的操作代码:

    1. //请求核1刷屏
    2. void notif_cor1_flush_screen()
    3. {
    4.     uint32_t notif;
    5.    core1_req_task=OS_GET_CURRENT_TASK();
    6.    OS_ENTER_CRITICAL_SECTION();
    7.    MCMGR_TriggerEventForce(kMCMGR_RemoteApplicationEvent, RPMSG_FLUSH_SCREEN_REQ);
    8.    OS_LEAVE_CRITICAL_SECTION();
    9.     //等待核1处理完成,超时100ms
    10.    OS_TASK_NOTIFY_WAIT(0x0, OS_TASK_NOTIFY_ALL_BITS, ¬if,OS_MS_2_TICKS(100));
    11.     if ((notif&REQ_COMPLETE) == 0)
    12.     {
    13.        OS_LOG("core1handle err!\r\n");
    14.     }
    15.     else
    16.     {
    17.        OS_LOG("core1done!\r\n");
    18.     }
    19. }
    复制代码

    以上代码中,Core0发送通知RPMSG_FLUSH_SCREEN_REQ给Core1后,就进入等待Core1的处理回应,超时100ms。此时Core1那边接收到Core0的RPMSG_FLUSH_SCREEN_REQ请求后,会处理刷屏并返回一个RPMSG_FLUSH_SCREEN_DONE事件。到此一个刷屏通信完成。

    Core1的处理方式这里就不描述了,和Core0类似,都是比较简单的处理,更多内容可以到工程中看代码。


    6.5.2 PowerQuad使用
           这个功能非常牛逼,能加速数学计算,常用的三角函数、开方、商等操作都能用该模块加速。本系统主要把powerquad功能用于GUI中的图形旋转、透明等操作,以减少时间,加速界面切换速度。

    1、初始化
    1. PQ_Init(POWERQUAD);
    复制代码


    2、使用
    gui_math.c中,把函数封装给GUI使用。
    1. float gui_sqrt(float __x)
    2. {
    3.    PQ_SqrtF32(&__x, &__x);
    4.     return __x;
    5. }
    6. float gui_cos(float __x)
    7. {
    8.    PQ_CosF32(&__x, &__x);
    9.     return __x;
    10. }
    11. float gui_sin(float __x)
    12. {
    13.    PQ_SinF32(&__x, &__x);
    14.     return __x;
    15. }
    16. float gui_div(float __x,float __y)
    17. {
    18.    PQ_DivF32(&__x, &__y, &__x);
    19.     return __x;
    20. }
    复制代码



    6.5.3 功耗控制
           功耗管理使用的是MCUPower Management功能,这个模块把系统电源分为几大块:

    16.png
    同时,系统支持的功耗模式:

    17.png
           系统上电后是ACTIVE模式,其他模式都是要软件去配置才能进入的。在ACTIVE模式中,MCU全速150MHZ双核在运行,此时本系统的功耗非常大(后面有数据),很有必要使用Power管理功能。
    遗憾的是SDK没有提供FreeRTOS的功耗管理用例(或者是我没有找到),所以本系统的功耗管理方法是本人根据开发FreeRTOS经验去配置的,但管理确实是有效果的。下面我将把我的方法描述下来,另外不得不说功耗管理是个很麻烦的东西,这里是仔细查看了芯片手册的Chapter 14和Chapter 15这两章设置的。
           值得注意的是,SDK提供的FreeRTOS系统是用的System Tick,而这个时钟不能配置为睡眠唤醒时钟的,所以要想要FreeRTOS中使用DeepSleep或者更低功耗的模式,必须要把FreeRTOS的时钟更换为能作为唤醒源的定时器,如CTIMERUTICKRTC等。这里由于时间关系暂时不以实现。


    1、配置FreeRTOS低功耗模式
    FreeRTOSConfig.h中,增加以下配置:
    1. extern void prvSystemSleep(uint32_t xExpectedIdleTime );
    2. #define portSUPPRESS_TICKS_AND_SLEEP(x )       prvSystemSleep( x )
    3. #define configUSE_TICKLESS_IDLE                 2
    复制代码


    然后实现prvSystemSleep函数。
    1. #if configUSE_TICKLESS_IDLE>0
    2. void prvSystemSleep( uint32_t xExpectedIdleTime )
    3. {
    4.    POWER_EnterSleep();
    5. }
    6. #endif
    复制代码



    2、电流测量
    将电流表接在开发板P12座子上:

    18.png

    电流数据(使用4位半电流表测量,可能有误差):
      
    模式
      
    功耗
    功耗相比ACTIVE下降
    ACTIVE
    平均11.58ma,峰值14.00 ma

    SLEEP
    平均7.44 ma,峰值13.3ma
    平均4.14ma,峰值0.7 ma
    DeepSleep
    平均0.3 ma
    平均11.28ma


    6.5.4 系统代码启动流程
    //有空再补充


    6.5.5 APP开发
           本系统的开发以APP为单位(类似于智能机),比如本系统中的“灯光设置”应用,需要这样去定义:
    1. static const app_inst_info_t _app_info=
    2. {
    3.    .app_id=SYS_APP_ID_LIGHT,
    4.    .file_id=APP_INST_PKG_FILE_ID,
    5.    .type=APP_TYPE_TOOL,
    6.    .reserved={0,0},
    7.    .elf_inrom_addr=INVALID_ELF_INROM_ADDR,
    8.    .elf_inrom_size=0,
    9.    .elf_inram_addr=INVALID_ELF_INRAM_ADDR,
    10.    .main=_main,
    11. };
    12. static os_app_node_t app_node=
    13. {
    14.    .list = LIST_INIT(app_node.list),
    15.    .info=&_app_info,
    16.    .priority = APP_PRIORITY_LOWEST,
    17. };
    18. void app_light_init(void)
    19. {
    20.    os_app_add(&app_node);
    21. }
    复制代码

    所有的APP都要添加到系统APP列表中,它们的启动、退出都由系统的APP管理模块管理着,非常的统一、方便、智能。






    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2020-2-27 10:02:54 | 显示全部楼层

    非常感谢你们对于产品的各种反馈,这些反馈有助于我们加快产品的完善!并且对于开发过程中所遇到的问题我们工程师都予以相应的解答如下:

    1. SDK没用FreeRTOS的低功耗demo
    解答:SDK中包含有关demo,请参考freertos_tickless
    2.EVK丝印TX与RX相反
    解答:已将问题反馈,后续会尽快更正

    签到签到
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    18
    最后登录
    2020-1-8
    发表于 2020-1-2 09:53:44 来自手机 | 显示全部楼层
    灯光效果展示很多种。漂亮,好看。很厉害啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    10
    最后登录
    2020-1-3
    发表于 2020-1-2 10:26:17 来自手机 | 显示全部楼层
    牛批
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    10
    最后登录
    2020-1-3
    发表于 2020-1-2 10:46:00 来自手机 | 显示全部楼层
    触摸很流畅,不错
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-31 22:07
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    20

    主题

    385

    帖子

    19

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1662
    最后登录
    2020-7-1
    发表于 2020-1-2 11:01:42 | 显示全部楼层
    相当漂亮
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 10:22
  • 签到天数: 1317 天

    [LV.10]以坛为家III

    124

    主题

    2831

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7570
    最后登录
    2024-4-10
    发表于 2020-1-2 14:18:35 | 显示全部楼层
    做的不错     
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-10-12 08:58
  • 签到天数: 188 天

    [LV.7]常住居民III

    1

    主题

    4032

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    18136
    最后登录
    2023-11-2
    发表于 2020-1-2 17:12:18 | 显示全部楼层
    well
    done
    ~~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    7
    最后登录
    2020-1-2
    发表于 2020-1-2 18:24:09 来自手机 | 显示全部楼层
    好看
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    7
    最后登录
    2020-1-2
    发表于 2020-1-2 18:24:39 来自手机 | 显示全部楼层
    大神啊,真厉害!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    18
    最后登录
    2020-1-8
    发表于 2020-1-2 18:40:26 来自手机 | 显示全部楼层
    装饰性很强,很漂亮。好
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-19 12:50 , Processed in 0.165468 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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