电脑网络转换器接口 接口转换器( 二 )


3 软件的设计与实现市场上常用的嵌入式ARM平台开发环境有两种,分别是Keil MDK和IAR 。凯尔MDK v5是一个集成开发工具,具有最佳性能的ARM系列微控制器,尤其是ARM Cortex-M系列核心微控制器 。因此,本次系统设计选择Keil uVision5作为软件开发环境,系统整体软件设计分为初始化和控制两部分 。
3.1系统初始化软件设计
系统的初始化主要是初始化STM32和视频芯片,调用的关键初始化函数如表1所示 。
表1系统初始化的关键功能
STM32的初始化:在Keil MDK v5建立的项目中,可以直接使用ST公司编写的启动代码文件startup_ STM32f10x_md.s来初始化控制芯片 。该文件已经配置了芯片系统堆栈的初始化、中断向量表、系统时钟的配置等 。用户只需要配置自己的相关模块 。
此次使用的STM32资源包括GPIOA、GPIOB、中断控制、systick定时器、I2C2接口等 。首先调用NVIC_PriorityGroupConfig()函数,将系统中断优先级设置为组4,子优先级为0和16抢占优先级 。配置systick定时器的参数,调用SysTick_Init()函数,设置中断时间间隔为1ms,用于延时功能的计时 。
调用RCC_APB1PeriphClockCmd()和RCC_ APB2PeriphClockCmd()函数来使能外设I2C2的时钟以及安装在APB1和APB2总线上的GPIOA和GPIOB端口的时钟 。然后调用KEY_Init()和LCD_Init()函数初始化按键和LCD显示模块,最后调用Hi_I2C_ Init()函数初始化控制通信接口I2C2 。
专用视频芯片初始化:STM32通过I2C控制接口读写专用视频芯片的寄存器,完成芯片的初始化配置 。有系统时钟、锁相环、上电复位、接口物理参数配置等 。然后调用hdmirx_ init()、lvdstx_init()和i2stx_init()三个SDK库函数分别初始化芯片的输入输出端口,从而完成整个系统的初始化操作 。
3.2系统控制部分的软件设计
系统的控制代码包括四个模块:端口状态检测、音视频格式检测、键盘检测和输出控制 。
1)端口状态检测
(1)端口状态检测模块 。
系统初始化后,HDMI接口要求即插即用,系统配置要求自适应输出,因此系统设计要求实时检测输入端口状态,为后续数据处理和输出配置提供参数 。端口检测模块的流程图如图2所示 。
图2端口检测流程图
(2)端口状态检测方法 。
首先,当前端口输入状态now_port_status和先前端口输入状态pre_port_status都被设置为零,并且定义了端口定时变量port_status_tick 。该变量会随着时钟信号每1ms自动加1(由系统systick定时器中断触发),每200ms判断一次端口检测时间 。
然后调用库函数getrx_port_status(&port_status)获取当前端口输入状态,如果当前端口有信号接入,则设置now_port_ status=1,并将now_port_ status与之前的端口输入状态pre_port_status进行比较;如果不是,说明当前端口输入状态发生了变化,更新LCD上显示的系统输入状态,通知主控模块做相应处理 。
最后,将now_port_status的值赋给pre_port_status,并更新端口的port_status_tick变量,等待下一次端口状态检测 。所有四个输入端口执行相同的端口状态检测处理 。
【电脑网络转换器接口 接口转换器】2)音视频格式检测
(1)音视频检测模块 。
在实际应用中,用户会随机切换音视频格式,因此需要在端口状态检测后同步检测输入音视频格式的状态 。音视频格式状态检测涉及的库函数见表2 。
表2音视频状态检测相关库函数
(2)音视频格式检测方法类似于端口检测方法 。
首先,构建了系统视频和系统音频两种结构 。system_video用于存储输入视频的端口号、分辨率、采样格式、帧率、颜色空信息 。System_audio用于存储端口号、采样频率、量化位数、通道号等 。音频 。定义了一个变量av_status_tick,随系统时钟信号每1ms自动加1,每200ms检测一次音视频格式 。
然后调用库函数getrx_av_status (&rx_av_ status)函数获取当前输入的音视频状态rx_av_status,比较rx_av_ status 。video_format带最后输入的音视频状态变量pre _ rx _ avpre _ rx _ av _ status . video _ format 。如果它们不相等,则表明输入的音频和视频状态已经改变 。此时音视频状态标志变量rx_av_status_change置1,调用getRx _ video _ format((HDMI Rx _ video *)&(v form . htx))函数,获取当前输入的视频格式信息,更新LCD状态显示 。将rx_av_status.audio_format与之前的音频标志状态变量pre _ rx _ av pre _ rx _ av _ status . audio _ format进行比较 。
如果它们不相等,则意味着输入音频状态已经改变 。将音频状态标志变量rx_av_status_change设置为1,调用HDMI Rx _ get _ audio _ format((HDMI Rx _ video *)&(v form . htx))函数获取当前输入音频格式信息,更新LCD状态显示 。接下来,将rx_av_status分配给pre_rx_av_status,并等待下一次音频检测 。


推荐阅读