杭州应用声学研究所 袁昌权 王 欣 翁奇财
本文提出了一种基于GD32F407的电源模块板级管理控制器(BMC.Baseboard Management Controller)的设计,实现电源板卡内信息采集及板卡状态机控制。该BMC满足IPMI2.0协议,机箱控制器ChMC通过IPMB总线对板卡进行远程控制和管理。BMC采用FreeRTOS实时操作系统,对电源的状态进行实时监测。基于该BMC的电源板卡经长期使用验证了其稳定性及可靠性。
在某国产化平台中,通过电源模块实现机箱(平台)的供电。对电源模块工作状态的掌握和控制,对于机箱而言是不可缺少的。电源的稳定与否会直接影响到其他模块的工作状态,也会影响机箱及其他板卡的使用寿命。因此,实现对电源的机箱级管理和监控是必要的,也有助于提高电源管理效率,使得电源更加可靠和实用。
电源模块采用国产单片机GD32F407作为控制器使用,该芯片是一款32位基于Cortex-M4架构的RISC微处理器,最高工作频率可达168MHz,具有高性能、低功耗、外设丰富的优点。GD32F407具有512KB片上存储区域,能够烧入和保存比较大的程序。同时,该芯片配备了SPI、I2C、USART、CAN等标准和高级通信接口,最多支持140各通用I/O引脚以及多达14个16位通用定时器,19个多路复用的ADC通道。因此,该芯片能够满足电源模块BMC的设计和性能需求。
电源模块BMC设计框架如图1所示,主要由引导程序、用户程序两个部分组成。引导程序主要用于BMC软件的迭代升级,正常启动时,引导程序直接跳转到用户程序;在升级软件时,引导程序进入更新模式,通过串口接收用户程序写入片内存储区域。
用户程序运行在FreeRTOS实时操作系统上,包括信息采集、远程控制管理、状态机控制、发起更新请求四个功能。FreeRTOS是一个微内核的操作系统,具备任务调度和管理、时间管理、消息队列、信号量等功能,同时因其可移植性强、可裁剪、多任务的特点,被广泛应用于嵌入式领域。
图1 BMC总体框架
本文通过在FreeRTOS中建立三个线程来实现用户程序的功能。信息采集有两种方式,第一种通过传感器采集后经单片机ADC转换得到,这种方式依赖于传感器的灵敏度及可靠性,同时受外部环境影响较大(特别是温度采集)。第二种方式是采用类似SynQor的MCOTS-C-270可编程全砖模块,通过协议去访问全砖内部模块信息。该方式稳定、可靠,且扩展性强,因此,本文采用第二种方式。ChMC通过两条IPMB(I2C)总线实现对BMC的远程控制管理,主要实现电源模块的上下电、信息上传、事件日志等功能。同时,两路I2C能够实现冗余切换,增强了交互的稳定性。状态机控制通过判断各模块的状态,在异常时执行相应的操作,保证系统的稳定性。另外,更新请求由串口中断响应。
引导程序仅在用户发起更新程序的请求产生响应,正常开机启动时直接跳转到用户程序。因此,引导程序力求轻量、稳定、安全,没有采用操作系统。用户通过串口发送更新请求码到用户程序,请求码正确则由用户程序跳转到引导程序。引导程序执行系统复位后,完成系统时钟、串口、内部FLASH配置,等待用户发送用户程序执行文件。用户通过串口将执行文件发送到单片机,单片机将文件校验后再写入到指定的FLASH区域,随后正常启动用户程序,程序更新完成。
用户程序运行于FreeRTOS操作系统之上,由三个线程、若干个中断响应函数构成。根据线程功能性的不同,其优先级高低如下:状态机控制>远程管理控制>信息采集。状态机控制必须保证在出现故障的情况下立即响应,采用定时轮询的方式进行。远程管理控制线程由二进制信号量挂起,信号量由I2C中断释放。只有ChMC向BMC发送命令触发I2C中断时,该线程才会运行,常规状态下不占用CPU资源。
用户程序中涉及的中断包含串口更新中断、两路I2C中断、定时器中断四个中断服务程序。在默认状态下,I2C使用第一路进行通信,第二路作为备份。因此,中断优先级设计如下:第一路I2C>第二路I2C>定时器中断>串口更新中断。定时器中断用于为系统提供时间戳信息,统计电源板使用寿命。由于用户程序更新不是频繁的操作,因此其优先级最低。
图2 电压-电流-温度
电源模块信息包括温度信息、+12V电压信息及电流信息。在本文中,电源采用的是SynQor的MCOTS-C-270全砖模块,该模块可以输出800W功率,工作于240V~425V范围的连续输入电压,且能承受240V~475V范围的瞬态输入电压。除此之外,该模块的DC-DC转换器效率也比同类型的转换效率更高,使得转换器所需要散发的热量大幅降低,更容易冷却、降温,对于机箱散热的控制是十分有利的。同时,该模块为全密封设计,在-55℃到100℃的外表温度之间仍然能够满载输出。其输入欠压锁定、输出过压保护、主动反偏压限制、过温关断、输出限流、短路保护以及可选均流等功能使其在实际应用中具备极高的可靠性。
表1 数据写入、读取命令及响应格式
单片机可由RS232串口总线与全砖进行通信,通过数据写入命令设置全砖ID、生产日期、软件版本等信息,也能通过数据读取命令获取输入/输出电流、输入/输出电压、温度等信息。全砖终端收到正确的命令后,会立即产生一个响应。无效的命令不会产生响应。数据写入、读取命令及响应格式如表1所示。网络地址字符在开机上电时即默认为“m”。为了避免命令冲突,全砖定义了各功能程序的唯一地址——即访问地址,该地址可由char、十进制或十六进制格式制定。说明符用于区分命令的种类,“=”表示写入命令,“?”表示读取命令。在发出写入命令时,只有访问地址被选中时才能被写入,否则无法操作访问地址的值。写入命令和读取命令的响应均以换行符为终止符。
表2 电源模块信息获取命令及响应
电源模块信息由全砖提供。在使用时,RS232串口波特率设置为9600、8位数据位、无校验、1位停止位。+12V电压、温度及输出电流获取命令及响应如表2所示。在FreeRTOS系统中利用一个单独的线程定时轮询电源模块信息,轮询周期在百毫秒级别。线程在接收到终端结果后,需要对数据进行异常值检测和滤波处理,以排除终端返回非法结果时造成的影响。对电源进行负载(大电阻)测试,在不加散热的条件下,其电压、温度、电流曲线如图2所示。从测试结果可以看出,全砖采集到的对外+12V电压十分稳定,输出电流也很平滑,温度上升也呈近似线性的关系。
BMC通过IPMB总线响应来自ChMC的命令。两路I2C总线在设计时,需要考虑多个板卡并联时I2C上拉电阻总阻值的变化,阻值过大会导致整个机箱内部I2C总线阻塞,过小则无法驱动I2C总线。因此,根据I2C总线的容性负载能力,选择合适的上拉电阻是至关重要的。两路I2C的乒乓冗余功能虽然能够增强容错能力,但因ChMC出错或BMC未及时响应导致的总线阻塞的现象是不可避免的。在软件的设计上,BMC的I2C处理采用非阻塞模式和错误处理机制。具体而言,就是在BMC向ChMC传输数据的过程中,检测I2C总线的起始信号、传输信号、停止信号等寄存器状态时,采用超时退出机制,并将I2C状态标注为异常状态。I2C异常后,状态机会进行错误处理,禁用两路I2C中断,延时一段时间后将I2C重新初始化。该机制对ChMC出错无效。
BMC命令符合IPMB2.0规范,其响应-应答协议如图3所示。命令包含两类,一类是IPMI标准命令,另一类为自定义OEM命令。IPMI标准命令包括设置/读取系统时间、以及上下电。自定义命令包括设置数据命令和读取数据命令,主要用于获取传感器信息、设置传感器报警值。
BMC在收到命令后,由命令解析器解析命令数据包,在提取出命令字中的功能码后,触发响应处理器执行功能处理,并将处理结果组装成响应消息包上传给ChMC。ChMC访问传感器信息时,BMC会对各个传感器状态进行轮询,同时,根据轮询结果和报警值进行比较。如果超过上限值或低于下限值,则产生报警报警事件,并由报警处理器将数据和状态信息以响应消息的形式上传给ChMC,同时更新状态信息,通知状态机对报警进行本地处理。
当然,为防止传感器数值异常造成错误报警,报警分为临时报警和持续报警。当第一次触发报警时,报警被设置为临时报警;当一定周期内连续触发报警,则调整为持续报警。同样地,若在一定周期内报警未被触发,则取消报警,报警处理器更新状态信息。
根据实际的需求,传感器的报警值设置为临界值和故障值以及上、下限各两条,即UC和UNC、LC和LNC,分别为故障上限、临界上限,故障下限、临界下限。在ChMC利用浏览器访问BMC的传感器信息如图4所示。
状态机控制主要用于保证电源模块的正常工作状态,在BMC层级对模块状态进行实时监控和管理。在系统启动完成必要的硬件初始化后,首先建立并启动状态机控制线程,定时轮询各硬件模块的状态信息。在启动一定时间内硬件正常的情况下,开始对外供电。在状态机中使能看门狗,当操作系统因为异常无法运行时,看门狗执行MCU复位操作重启电源模块。
状态机同时响应来自报警处理器的消息。当出现温度过高、电流过大的故障报警时,状态机会停止对外供电,等待用户的操作。
由于BMC和ChMC之间通过I2C总线进行通信,当总线出现阻塞时,ChMC就无法对BMC进行管理控制。因此,在状态机中引入I2C错误处理机制是必要的。当I2C异常时,状态机会向总线发送停止信号,在延时一定时间后,重新初始化I2C组件,并使能I2C中断。
结束语:本文提出了一种基于GD32F407的电源模块BMC设计,通过引入IPMI协议,可以实现对电源模块的远程控制,从而能够实现机箱的远程复位、监控等操作。同时,在BMC中加入了状态机控制机制,能够实现模块的自我监测,当电压、电流、温度等发生异常时,模块能够实现自我保护,提高了电源的工作稳定性和可靠性。