杭州應(yīng)用聲學(xué)研究所 袁昌權(quán) 王 欣 翁奇財(cái)
本文提出了一種基于GD32F407的電源模塊板級(jí)管理控制器(BMC.Baseboard Management Controller)的設(shè)計(jì),實(shí)現(xiàn)電源板卡內(nèi)信息采集及板卡狀態(tài)機(jī)控制。該BMC滿足IPMI2.0協(xié)議,機(jī)箱控制器ChMC通過(guò)IPMB總線對(duì)板卡進(jìn)行遠(yuǎn)程控制和管理。BMC采用FreeRTOS實(shí)時(shí)操作系統(tǒng),對(duì)電源的狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)測(cè)。基于該BMC的電源板卡經(jīng)長(zhǎng)期使用驗(yàn)證了其穩(wěn)定性及可靠性。
在某國(guó)產(chǎn)化平臺(tái)中,通過(guò)電源模塊實(shí)現(xiàn)機(jī)箱(平臺(tái))的供電。對(duì)電源模塊工作狀態(tài)的掌握和控制,對(duì)于機(jī)箱而言是不可缺少的。電源的穩(wěn)定與否會(huì)直接影響到其他模塊的工作狀態(tài),也會(huì)影響機(jī)箱及其他板卡的使用壽命。因此,實(shí)現(xiàn)對(duì)電源的機(jī)箱級(jí)管理和監(jiān)控是必要的,也有助于提高電源管理效率,使得電源更加可靠和實(shí)用。
電源模塊采用國(guó)產(chǎn)單片機(jī)GD32F407作為控制器使用,該芯片是一款32位基于Cortex-M4架構(gòu)的RISC微處理器,最高工作頻率可達(dá)168MHz,具有高性能、低功耗、外設(shè)豐富的優(yōu)點(diǎn)。GD32F407具有512KB片上存儲(chǔ)區(qū)域,能夠燒入和保存比較大的程序。同時(shí),該芯片配備了SPI、I2C、USART、CAN等標(biāo)準(zhǔn)和高級(jí)通信接口,最多支持140各通用I/O引腳以及多達(dá)14個(gè)16位通用定時(shí)器,19個(gè)多路復(fù)用的ADC通道。因此,該芯片能夠滿足電源模塊BMC的設(shè)計(jì)和性能需求。
電源模塊BMC設(shè)計(jì)框架如圖1所示,主要由引導(dǎo)程序、用戶程序兩個(gè)部分組成。引導(dǎo)程序主要用于BMC軟件的迭代升級(jí),正常啟動(dòng)時(shí),引導(dǎo)程序直接跳轉(zhuǎn)到用戶程序;在升級(jí)軟件時(shí),引導(dǎo)程序進(jìn)入更新模式,通過(guò)串口接收用戶程序?qū)懭肫瑑?nèi)存儲(chǔ)區(qū)域。
用戶程序運(yùn)行在FreeRTOS實(shí)時(shí)操作系統(tǒng)上,包括信息采集、遠(yuǎn)程控制管理、狀態(tài)機(jī)控制、發(fā)起更新請(qǐng)求四個(gè)功能。FreeRTOS是一個(gè)微內(nèi)核的操作系統(tǒng),具備任務(wù)調(diào)度和管理、時(shí)間管理、消息隊(duì)列、信號(hào)量等功能,同時(shí)因其可移植性強(qiáng)、可裁剪、多任務(wù)的特點(diǎn),被廣泛應(yīng)用于嵌入式領(lǐng)域。

圖1 BMC總體框架
本文通過(guò)在FreeRTOS中建立三個(gè)線程來(lái)實(shí)現(xiàn)用戶程序的功能。信息采集有兩種方式,第一種通過(guò)傳感器采集后經(jīng)單片機(jī)ADC轉(zhuǎn)換得到,這種方式依賴(lài)于傳感器的靈敏度及可靠性,同時(shí)受外部環(huán)境影響較大(特別是溫度采集)。第二種方式是采用類(lèi)似SynQor的MCOTS-C-270可編程全磚模塊,通過(guò)協(xié)議去訪問(wèn)全磚內(nèi)部模塊信息。該方式穩(wěn)定、可靠,且擴(kuò)展性強(qiáng),因此,本文采用第二種方式。ChMC通過(guò)兩條IPMB(I2C)總線實(shí)現(xiàn)對(duì)BMC的遠(yuǎn)程控制管理,主要實(shí)現(xiàn)電源模塊的上下電、信息上傳、事件日志等功能。同時(shí),兩路I2C能夠?qū)崿F(xiàn)冗余切換,增強(qiáng)了交互的穩(wěn)定性。狀態(tài)機(jī)控制通過(guò)判斷各模塊的狀態(tài),在異常時(shí)執(zhí)行相應(yīng)的操作,保證系統(tǒng)的穩(wěn)定性。另外,更新請(qǐng)求由串口中斷響應(yīng)。
引導(dǎo)程序僅在用戶發(fā)起更新程序的請(qǐng)求產(chǎn)生響應(yīng),正常開(kāi)機(jī)啟動(dòng)時(shí)直接跳轉(zhuǎn)到用戶程序。因此,引導(dǎo)程序力求輕量、穩(wěn)定、安全,沒(méi)有采用操作系統(tǒng)。用戶通過(guò)串口發(fā)送更新請(qǐng)求碼到用戶程序,請(qǐng)求碼正確則由用戶程序跳轉(zhuǎn)到引導(dǎo)程序。引導(dǎo)程序執(zhí)行系統(tǒng)復(fù)位后,完成系統(tǒng)時(shí)鐘、串口、內(nèi)部FLASH配置,等待用戶發(fā)送用戶程序執(zhí)行文件。用戶通過(guò)串口將執(zhí)行文件發(fā)送到單片機(jī),單片機(jī)將文件校驗(yàn)后再寫(xiě)入到指定的FLASH區(qū)域,隨后正常啟動(dòng)用戶程序,程序更新完成。
用戶程序運(yùn)行于FreeRTOS操作系統(tǒng)之上,由三個(gè)線程、若干個(gè)中斷響應(yīng)函數(shù)構(gòu)成。根據(jù)線程功能性的不同,其優(yōu)先級(jí)高低如下:狀態(tài)機(jī)控制>遠(yuǎn)程管理控制>信息采集。狀態(tài)機(jī)控制必須保證在出現(xiàn)故障的情況下立即響應(yīng),采用定時(shí)輪詢的方式進(jìn)行。遠(yuǎn)程管理控制線程由二進(jìn)制信號(hào)量掛起,信號(hào)量由I2C中斷釋放。只有ChMC向BMC發(fā)送命令觸發(fā)I2C中斷時(shí),該線程才會(huì)運(yùn)行,常規(guī)狀態(tài)下不占用CPU資源。
用戶程序中涉及的中斷包含串口更新中斷、兩路I2C中斷、定時(shí)器中斷四個(gè)中斷服務(wù)程序。在默認(rèn)狀態(tài)下,I2C使用第一路進(jìn)行通信,第二路作為備份。因此,中斷優(yōu)先級(jí)設(shè)計(jì)如下:第一路I2C>第二路I2C>定時(shí)器中斷>串口更新中斷。定時(shí)器中斷用于為系統(tǒng)提供時(shí)間戳信息,統(tǒng)計(jì)電源板使用壽命。由于用戶程序更新不是頻繁的操作,因此其優(yōu)先級(jí)最低。

圖2 電壓-電流-溫度
電源模塊信息包括溫度信息、+12V電壓信息及電流信息。在本文中,電源采用的是SynQor的MCOTS-C-270全磚模塊,該模塊可以輸出800W功率,工作于240V~425V范圍的連續(xù)輸入電壓,且能承受240V~475V范圍的瞬態(tài)輸入電壓。除此之外,該模塊的DC-DC轉(zhuǎn)換器效率也比同類(lèi)型的轉(zhuǎn)換效率更高,使得轉(zhuǎn)換器所需要散發(fā)的熱量大幅降低,更容易冷卻、降溫,對(duì)于機(jī)箱散熱的控制是十分有利的。同時(shí),該模塊為全密封設(shè)計(jì),在-55℃到100℃的外表溫度之間仍然能夠滿載輸出。其輸入欠壓鎖定、輸出過(guò)壓保護(hù)、主動(dòng)反偏壓限制、過(guò)溫關(guān)斷、輸出限流、短路保護(hù)以及可選均流等功能使其在實(shí)際應(yīng)用中具備極高的可靠性。

表1 數(shù)據(jù)寫(xiě)入、讀取命令及響應(yīng)格式
單片機(jī)可由RS232串口總線與全磚進(jìn)行通信,通過(guò)數(shù)據(jù)寫(xiě)入命令設(shè)置全磚ID、生產(chǎn)日期、軟件版本等信息,也能通過(guò)數(shù)據(jù)讀取命令獲取輸入/輸出電流、輸入/輸出電壓、溫度等信息。全磚終端收到正確的命令后,會(huì)立即產(chǎn)生一個(gè)響應(yīng)。無(wú)效的命令不會(huì)產(chǎn)生響應(yīng)。數(shù)據(jù)寫(xiě)入、讀取命令及響應(yīng)格式如表1所示。網(wǎng)絡(luò)地址字符在開(kāi)機(jī)上電時(shí)即默認(rèn)為“m”。為了避免命令沖突,全磚定義了各功能程序的唯一地址——即訪問(wèn)地址,該地址可由char、十進(jìn)制或十六進(jìn)制格式制定。說(shuō)明符用于區(qū)分命令的種類(lèi),“=”表示寫(xiě)入命令,“?”表示讀取命令。在發(fā)出寫(xiě)入命令時(shí),只有訪問(wèn)地址被選中時(shí)才能被寫(xiě)入,否則無(wú)法操作訪問(wèn)地址的值。寫(xiě)入命令和讀取命令的響應(yīng)均以換行符為終止符。

表2 電源模塊信息獲取命令及響應(yīng)
電源模塊信息由全磚提供。在使用時(shí),RS232串口波特率設(shè)置為9600、8位數(shù)據(jù)位、無(wú)校驗(yàn)、1位停止位。+12V電壓、溫度及輸出電流獲取命令及響應(yīng)如表2所示。在FreeRTOS系統(tǒng)中利用一個(gè)單獨(dú)的線程定時(shí)輪詢電源模塊信息,輪詢周期在百毫秒級(jí)別。線程在接收到終端結(jié)果后,需要對(duì)數(shù)據(jù)進(jìn)行異常值檢測(cè)和濾波處理,以排除終端返回非法結(jié)果時(shí)造成的影響。對(duì)電源進(jìn)行負(fù)載(大電阻)測(cè)試,在不加散熱的條件下,其電壓、溫度、電流曲線如圖2所示。從測(cè)試結(jié)果可以看出,全磚采集到的對(duì)外+12V電壓十分穩(wěn)定,輸出電流也很平滑,溫度上升也呈近似線性的關(guān)系。
BMC通過(guò)IPMB總線響應(yīng)來(lái)自ChMC的命令。兩路I2C總線在設(shè)計(jì)時(shí),需要考慮多個(gè)板卡并聯(lián)時(shí)I2C上拉電阻總阻值的變化,阻值過(guò)大會(huì)導(dǎo)致整個(gè)機(jī)箱內(nèi)部I2C總線阻塞,過(guò)小則無(wú)法驅(qū)動(dòng)I2C總線。因此,根據(jù)I2C總線的容性負(fù)載能力,選擇合適的上拉電阻是至關(guān)重要的。兩路I2C的乒乓冗余功能雖然能夠增強(qiáng)容錯(cuò)能力,但因ChMC出錯(cuò)或BMC未及時(shí)響應(yīng)導(dǎo)致的總線阻塞的現(xiàn)象是不可避免的。在軟件的設(shè)計(jì)上,BMC的I2C處理采用非阻塞模式和錯(cuò)誤處理機(jī)制。具體而言,就是在BMC向ChMC傳輸數(shù)據(jù)的過(guò)程中,檢測(cè)I2C總線的起始信號(hào)、傳輸信號(hào)、停止信號(hào)等寄存器狀態(tài)時(shí),采用超時(shí)退出機(jī)制,并將I2C狀態(tài)標(biāo)注為異常狀態(tài)。I2C異常后,狀態(tài)機(jī)會(huì)進(jìn)行錯(cuò)誤處理,禁用兩路I2C中斷,延時(shí)一段時(shí)間后將I2C重新初始化。該機(jī)制對(duì)ChMC出錯(cuò)無(wú)效。
BMC命令符合IPMB2.0規(guī)范,其響應(yīng)-應(yīng)答協(xié)議如圖3所示。命令包含兩類(lèi),一類(lèi)是IPMI標(biāo)準(zhǔn)命令,另一類(lèi)為自定義OEM命令。IPMI標(biāo)準(zhǔn)命令包括設(shè)置/讀取系統(tǒng)時(shí)間、以及上下電。自定義命令包括設(shè)置數(shù)據(jù)命令和讀取數(shù)據(jù)命令,主要用于獲取傳感器信息、設(shè)置傳感器報(bào)警值。
BMC在收到命令后,由命令解析器解析命令數(shù)據(jù)包,在提取出命令字中的功能碼后,觸發(fā)響應(yīng)處理器執(zhí)行功能處理,并將處理結(jié)果組裝成響應(yīng)消息包上傳給ChMC。ChMC訪問(wèn)傳感器信息時(shí),BMC會(huì)對(duì)各個(gè)傳感器狀態(tài)進(jìn)行輪詢,同時(shí),根據(jù)輪詢結(jié)果和報(bào)警值進(jìn)行比較。如果超過(guò)上限值或低于下限值,則產(chǎn)生報(bào)警報(bào)警事件,并由報(bào)警處理器將數(shù)據(jù)和狀態(tài)信息以響應(yīng)消息的形式上傳給ChMC,同時(shí)更新?tīng)顟B(tài)信息,通知狀態(tài)機(jī)對(duì)報(bào)警進(jìn)行本地處理。
當(dāng)然,為防止傳感器數(shù)值異常造成錯(cuò)誤報(bào)警,報(bào)警分為臨時(shí)報(bào)警和持續(xù)報(bào)警。當(dāng)?shù)谝淮斡|發(fā)報(bào)警時(shí),報(bào)警被設(shè)置為臨時(shí)報(bào)警;當(dāng)一定周期內(nèi)連續(xù)觸發(fā)報(bào)警,則調(diào)整為持續(xù)報(bào)警。同樣地,若在一定周期內(nèi)報(bào)警未被觸發(fā),則取消報(bào)警,報(bào)警處理器更新?tīng)顟B(tài)信息。
根據(jù)實(shí)際的需求,傳感器的報(bào)警值設(shè)置為臨界值和故障值以及上、下限各兩條,即UC和UNC、LC和LNC,分別為故障上限、臨界上限,故障下限、臨界下限。在ChMC利用瀏覽器訪問(wèn)BMC的傳感器信息如圖4所示。
狀態(tài)機(jī)控制主要用于保證電源模塊的正常工作狀態(tài),在BMC層級(jí)對(duì)模塊狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)控和管理。在系統(tǒng)啟動(dòng)完成必要的硬件初始化后,首先建立并啟動(dòng)狀態(tài)機(jī)控制線程,定時(shí)輪詢各硬件模塊的狀態(tài)信息。在啟動(dòng)一定時(shí)間內(nèi)硬件正常的情況下,開(kāi)始對(duì)外供電。在狀態(tài)機(jī)中使能看門(mén)狗,當(dāng)操作系統(tǒng)因?yàn)楫惓o(wú)法運(yùn)行時(shí),看門(mén)狗執(zhí)行MCU復(fù)位操作重啟電源模塊。
狀態(tài)機(jī)同時(shí)響應(yīng)來(lái)自報(bào)警處理器的消息。當(dāng)出現(xiàn)溫度過(guò)高、電流過(guò)大的故障報(bào)警時(shí),狀態(tài)機(jī)會(huì)停止對(duì)外供電,等待用戶的操作。
由于BMC和ChMC之間通過(guò)I2C總線進(jìn)行通信,當(dāng)總線出現(xiàn)阻塞時(shí),ChMC就無(wú)法對(duì)BMC進(jìn)行管理控制。因此,在狀態(tài)機(jī)中引入I2C錯(cuò)誤處理機(jī)制是必要的。當(dāng)I2C異常時(shí),狀態(tài)機(jī)會(huì)向總線發(fā)送停止信號(hào),在延時(shí)一定時(shí)間后,重新初始化I2C組件,并使能I2C中斷。
結(jié)束語(yǔ):本文提出了一種基于GD32F407的電源模塊BMC設(shè)計(jì),通過(guò)引入IPMI協(xié)議,可以實(shí)現(xiàn)對(duì)電源模塊的遠(yuǎn)程控制,從而能夠?qū)崿F(xiàn)機(jī)箱的遠(yuǎn)程復(fù)位、監(jiān)控等操作。同時(shí),在BMC中加入了狀態(tài)機(jī)控制機(jī)制,能夠?qū)崿F(xiàn)模塊的自我監(jiān)測(cè),當(dāng)電壓、電流、溫度等發(fā)生異常時(shí),模塊能夠?qū)崿F(xiàn)自我保護(hù),提高了電源的工作穩(wěn)定性和可靠性。