引言
随着车载影音娱乐系统的普及,要求车载影音系统方案具有更高的稳定性、操作简便性,也对成本控制提出了更大的挑战。新一代车载影音系统省去了碟片携带不方便且成本较高的光驱控制部分,用现代存储设备(如U盘、SD卡)为载体,借助高科技解码技术,可将网上下载的多种格式的影音文件进行播放的车载影音娱乐系统进行升级,同时还整合了收音机、蓝牙免提式接打电话、AUX输入音频等功能。整个系统使用FreeRTOS操作系统,实时响应各种中断服务,同时采用状态机控制机制,使整个流程控制更加清晰、稳定。
1硬件电路设计
硬件MCU采用集成了USB/SD接口的STM32F103系列、电源管理芯片、AUX输入检测电路、蓝牙模块、调谐收音芯片TEF6621、键盘及显示段码屏,系统框架如图1所示。为了满足低功耗设计,各个模块都有独立I/O去控制对应电源。
图1 系统框架图
1.1微处理器
系统采用32位CortexM3内核的STM32F103微处理器,工作电压为2.0~3.6 V,主频达72 MHz,有睡眠、停机和待机3种低功耗模式,包括12 位的ADC、DMA控制器,支持ADC、SPI、I2C、 32位CRC等外设[1],完全可以满足车载影音系统方案需求。
1.2USB检测与复位电路
针对U盘兼容性测试中,不同厂商生产的U盘出现一次读取不成功或者连续插拔读取不成功的情况,本文提出了在一次读取失败之后,强制给U盘供电电路进行复位控制,中间需要间隔1 s左右,正常情况下一个U盘读取时间为3 s,个别U盘有可能为5~6 s,在客户可接受范围内。检测与复位电路如图2所示。
图2 USB检测与复位电路
1.3电源供电B+电路和ACC检测电路
车载干扰因素非常多(例如发动机、点火系统等),其中最有威胁的干扰是共模干扰,少数还有差模干扰,因此系统需要在电源输入端加入干扰过滤电路,并加大铝电解电容容量,以消除汽车电源输入端的干扰。电源主供电电路如图3所示。
图3 电源主供电电路图4电源ACC检测电路
对于车载系统,需要实时检测点火信号ACC,当ACC关闭时需要进行数据备份、保存当前播放源、收音的当前频点和预存台号、USB/SD的当前播放曲目和文件夹等信息;当再打开ACC时,需要进行数据恢复处理。另外,还需要考虑电压浮动情况的高低压检测电路部分设计。图4为高低压检测电路。
1.4后级功率放大电路
收音机模块TEF6621对外通信接口为I2C总线,将它挂在系统I2C总线上,STM32F103可以对其相关寄存器进行设置。收音机芯片输出音频信号非常微弱,通过前级音频控制芯片PT2313进行音源选择和后级功率放大器TB2929[2]进行放大以驱动车载音响设备。其中后级功率放大电路略——编者注。
图4 后级音频放大电路
2软件设计
低成本车载影音系统的软件系统是以嵌入式操作系统FreeRTOS作为开发和运行平台,利用状态机机制实现流程跳转与功能实现,该软件主要由操作系统FreeRTOS层、状态机控制HMI层、媒体播放Media层等组成,如图5所示。
图5 程序框架设计图
2.1FreeRTOS操作系统层
FreeRTOS作为一款轻量级操作系统,提供了任务管理、时间管理、消息队列、内存管理等功能,并且源码公开,在基于CortexM3内核的STM32F103系列上移植非常灵活[3]。
2.1.1FreeRTOS移植
FreeRTOS的实现主要由list.c、queue.c、croutine.c和tasks.c四个文件组成。list.c是一个链表的实现,主要供给内核调度器使用;queue.c是一个队列的实现,支持中断环境和信号量控制;croutine.c和tasks.c是两种任务的组织实现。对于croutine.c,各个任务共享同一个堆栈,使RAM的需求进一步缩小,正因如此,它的使用受到相对严格的限制。而task.c则是传统的实现,各个任务使用各自的堆栈,支持完全的抢占式调度。FreeRTOS在STM32F103上的移植大致由3个文件实现:.h文件定义编译器相关的数据类型和中断处理的宏定义;.c文件实现任务的堆栈初始化、系统心跳的管理以及任务切换的请求;.s文件实现具体的任务切换,具体文件结构图如图6所示。
图6 FreeRTOS文件结构图
2.1.2任务配置
任务就是一段可以执行的代码,拥有自己的栈资源和生命周期,可以被创建、删除。任务创建后,系统会去执行入口函数里面的代码。系统OS采用FreeRTOS,任务调度[4]原则是:高优先级的Task优先执行,只有高优先级Task主动让出,低优先级Task才能被执行。任务划分如表1所列。
MainTask实现各种应用模式,主要处理设备插拔消息以及上下曲播放控制、蓝牙协议交换处理、显示信息处理。其控制流程如图7所示。
图7 MainTask控制流程
2.2状态机控制HMI层
状态机是一个很好的建模方法,能够处理复杂的控制。状态机提供了一个抽象化的系统设计方法,简化了设计,使得维护复杂的控制成为可能。VisualState[5]图形界面提供的工具链,使开发者能够非常方便地设计出这种状态图;而一旦状态机模型(或部分状态图)建立了,VisualState拥有强大的分析工具来处理它,从而确保最终产品与需求一致;在开发后期,状态图被用来生成目标代码和开发文档。VisualState是一组高级的嵌入式设计工具套件,专门用于开发高质量的嵌入式系统软件,适用于汽车电子、便携式电子产品、家电和人机界面等不同行业领域。
车载影音系统采用状态机控制机制,利用VisualState可视化图形操作界面的直观性对整个逻辑进行设计,根据消息事件的先进先出原则,对每个状态下对应事件进行响应或者忽略,从而实现不同的逻辑控制。比如对应车载影音系统处于收音HMI_REC_MAIN这一大的状态下,任何子状态(包括收音初始状态HMI_REC_INIT、搜索有效台状态HMI_REC_SEEK和预存6个信号台AS状态)都要对其进行响应处理,对于数字键1~6,都会优先进行响应处理,将其生成的代码导入到程序中,将其中的消息响应函数添加到对应的模块API函数中,实现其功能处理。收音状态下HMI_REC_MAIN的状态机控制流程图略——编者注。
2.3媒体播放Media层
为了有效管理写入或者读取USB/SD中的数据,需要将USB/SD卡中的数据以FAT32文件系统方式管理,本文采用比较成熟的FATFS Module[6]文件系统模块。需要做的工作如下:修改ff.h以匹配处理器类型;修改integer.h以匹配数据类型;对diskio.c的6个接口函数(即Disk_initialize、Disk_status、Disk_write、Disk_read、Disk_ioctl和Get_fattime)进行编程,实现移植。
本地播放由前台播放模式(MainTask)和后台解码(CodecTask)组成,前台负责播放控制,后台负责歌曲解码播放。播放流程控制主要是实现上下曲切换、快进快退、浏览播放、重复和随机模式选择等功能。MainTask入口函数是一个死循环,一直检测有无消息,如果有消息,则执行消息响应事件,一旦在指定时间内无消息,则执行任务调度。播放控制流程如图8所示。
图8 播放控制流程
3系统测试
车载影音系统已经成为新一代汽车的基本组成部分,车载嵌入式设备要求具有良好可靠性、健壮性、易用性,以及用户操作响应快等特性。
3.1硬件测试
硬件测试主要是检测电路的硬件电路设计是否合理,比如针对电源ACC的频繁开关测试、对U盘的模拟车辆运行过程中的抖动测试,以及针对蓝牙部分的有效连接距离测试。
3.2软件测试
软件测试首先要对各个模块进行功能测试。对于媒体部分,有对各个厂商和各个容量大小的U盘或者SD卡的读取时间测试,对USB支持播放歌曲格式(MP3、WMA、FLAC)的测试,以及对U盘文件中文件深度和最大支持播放歌曲数目测试,并且对错误曲目自动跳过、播放下一曲有效歌曲。对于蓝牙部分,需要测试兼容性,对市面上多种品牌的多种款式手机进行测试,并且进行记录,及时反馈给客户。最后是对整个系统的打断功能处理测试,如正在收听电台时,若连接上的手机接收到来电,需要转到接听电话界面。
结语
经过移植和定制的实时操作系统FreeRTOS采用基于优先级的调度算法,并且通过VisualState 状态机控制,整个系统代码结构紧凑、流程清晰,非常适合汽车电子实时嵌入式应用。基于FreeRTOS实时操作系统设计的车载影音娱乐系统具有实时性强、精度高、稳定性强和性价比高等特点,不仅省去了光驱部分,而且也省去了为防止车辆运行过程中给伺服系统带来抖动而引入的防震部分模块设计。