,,
(1.新疆華隆油田科技股份有限公司,克拉瑪依 834000;2.新疆油田數(shù)據(jù)公司;3.南京航空航天大學(xué))
基于ARMCortex-M0的SoC單片機(jī)內(nèi)核程序設(shè)計(jì)
于玉珠1,殷春莉2,孫浩3
(1.新疆華隆油田科技股份有限公司,克拉瑪依 834000;2.新疆油田數(shù)據(jù)公司;3.南京航空航天大學(xué))
隨著信息技術(shù)和物聯(lián)網(wǎng)的迅速發(fā)展,作為物聯(lián)網(wǎng)前端硬件基礎(chǔ)的單片機(jī)得到廣泛應(yīng)用。本系統(tǒng)就是以基于ARM Cortex-M0的HL-LPGC-LPC11C14-8044為硬件平臺(tái),利用C++語(yǔ)言和Real View工具設(shè)計(jì)與開(kāi)發(fā)內(nèi)核軟件,實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)采一集和系統(tǒng)控制,同時(shí)與云計(jì)算服務(wù)中心實(shí)現(xiàn)數(shù)據(jù)交互、為大數(shù)據(jù)處理提供基礎(chǔ)。該系統(tǒng)無(wú)人值守和偏遠(yuǎn)區(qū)域覆蓋,節(jié)約了運(yùn)行成本,提升了工業(yè)生產(chǎn)的安全性、可靠性、高效性,綜合效益明顯提高。
物聯(lián)網(wǎng);SoC;GPRS;數(shù)據(jù)采集;Cortex-M0
單片機(jī)[1]是一種集成電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)數(shù)器等功能集成到一塊硅片上構(gòu)成的一個(gè)小而完善的微型計(jì)算機(jī)系統(tǒng)。經(jīng)歷了SCM、MCU、SoC三大階段,單片機(jī)滲透到我們生活的各個(gè)領(lǐng)域。廣泛應(yīng)用于儀器儀表、家用電器、醫(yī)用設(shè)備、航空航天、專用設(shè)備的智能化管理及過(guò)程控制等領(lǐng)域,特別是自動(dòng)控制領(lǐng)域的機(jī)器人、智能儀表、醫(yī)療器械以及各種智能機(jī)械。
SoC(System on Chip)稱為芯片級(jí)系統(tǒng),也稱片上系統(tǒng),包含完整系統(tǒng)并有嵌入軟件的全部?jī)?nèi)容,是集成電路設(shè)計(jì)發(fā)展的必然趨勢(shì)。單芯片實(shí)現(xiàn)完整的電子系統(tǒng),是IC 產(chǎn)業(yè)未來(lái)的發(fā)展方向。目前在性能和功耗敏感的終端芯片領(lǐng)域,特別是物聯(lián)網(wǎng)領(lǐng)域,SoC已占據(jù)主導(dǎo)地位,而且其應(yīng)用正在擴(kuò)展到更廣的領(lǐng)域。
本程序設(shè)計(jì)就是以基于ARM Cortex-M0[2]SoC單片機(jī)的HL-LPGC-LPC11C14-8044為硬件平臺(tái),利用C++語(yǔ)言和Real View工具設(shè)計(jì)與開(kāi)發(fā)該基于μC/OS-II多任務(wù)嵌入式實(shí)時(shí)操作系統(tǒng)的SoC內(nèi)核軟件,以實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)采集[3]和系統(tǒng)控制,同時(shí)與云計(jì)算服務(wù)中心實(shí)現(xiàn)數(shù)據(jù)交互,為物聯(lián)網(wǎng)[4]大數(shù)據(jù)處理提供基礎(chǔ)。
本內(nèi)核程序是使用RealView MDK 4.01開(kāi)發(fā)環(huán)境和C++語(yǔ)言開(kāi)發(fā)的,是基于μC/OS-II的任務(wù)輪訓(xùn)驅(qū)動(dòng)型多線程32位軟件,采用C/S方式通過(guò)指定服務(wù)端口或串口與遠(yuǎn)端云控制中心進(jìn)行數(shù)據(jù)通信。系統(tǒng)總結(jié)構(gòu)見(jiàn)圖1系統(tǒng)總流程,主要由操作系統(tǒng)的7個(gè)功能任務(wù)模塊構(gòu)成,每個(gè)任務(wù)模塊又有自己的無(wú)限循環(huán)功能子流程組成。通過(guò)主線程App_Task_MAIN管理GPRS連接,通過(guò)App_Task_OUTPUT、App_Task_INPUT、App_Task_ADC線程處理物聯(lián)網(wǎng)云控制器的輸入、輸出,通過(guò)App_Task_GPRS線程處理與云控制中心通信數(shù)據(jù)或指令。
圖1 總結(jié)構(gòu)圖
系統(tǒng)的總流程圖見(jiàn)圖2。主要由系統(tǒng)初始化、串行口初始化、通用I/O口初始化、存儲(chǔ)器初始化、模數(shù)轉(zhuǎn)換初始化、GPRS初始化、溫度采集初始化、看門(mén)狗初始化共8個(gè)初始化函數(shù),1個(gè)時(shí)鐘設(shè)置函數(shù),1個(gè)操作系統(tǒng)初始化函數(shù),以及MAIN操作系統(tǒng)任務(wù)、OUTPUT操作系統(tǒng)任務(wù)、INPUT操作系統(tǒng)任務(wù)、ADC操作系統(tǒng)任務(wù)、AT24C02操作系統(tǒng)任務(wù)、GPRS操作系統(tǒng)任務(wù)、DS18B20操作系統(tǒng)任務(wù)7個(gè)功能任務(wù)模塊和1個(gè)操作系統(tǒng)啟動(dòng)函數(shù)構(gòu)成。
圖2 系統(tǒng)總流程圖
程序按順序執(zhí)行各個(gè)函數(shù),直到操作系統(tǒng)啟動(dòng)函數(shù)執(zhí)行完成。操作系統(tǒng)啟動(dòng)后,整個(gè)系統(tǒng)的資源管理與調(diào)度交由操作系統(tǒng)管理與調(diào)度,主流程完成。
程序主要是控制執(zhí)行各種I/O[5]動(dòng)作,并與遠(yuǎn)端云控制中心進(jìn)行數(shù)據(jù)交互。具體具有以下功能:
① 通信方式自動(dòng)適應(yīng):支持RS232和GPRS上連通信。
② 支持IP或域名方式:可通過(guò)上位機(jī)軟件設(shè)置。
③ 心跳檢測(cè):定時(shí)進(jìn)行心跳特征碼掃描。
④ AD、DO、DI處理:處理模擬量采集、控制數(shù)字量輸出、接收數(shù)字量輸入。
⑤ 通信中斷自動(dòng)連接:GPRS中斷后系統(tǒng)自動(dòng)識(shí)別并重新建立。
⑥ 信息保存功能:設(shè)置數(shù)據(jù)自動(dòng)保存。
⑦ 斷電自動(dòng)恢復(fù):系統(tǒng)來(lái)電后自動(dòng)運(yùn)行。
⑧ I/O掉電保持:斷電后,來(lái)電DO輸出狀態(tài)保持為斷電前的狀態(tài)。
⑨ 數(shù)據(jù)格式靈活:支持變長(zhǎng)和固定長(zhǎng)數(shù)據(jù)格式。
⑩ 采用C/S模式,數(shù)據(jù)實(shí)時(shí)上傳,供云服務(wù)處理。
系統(tǒng)共有7個(gè)功能模塊,分別封裝在操作系統(tǒng)的7個(gè)任務(wù)模塊里。
2.1 MAIN任務(wù)模塊
主要功能是控制與管理GPRS連接,實(shí)現(xiàn)斷線自動(dòng)重連。實(shí)現(xiàn)的主要函數(shù)為while()、GPRS_Connect()等。MAIN任務(wù)模塊流程圖如圖3所示。
圖3 MAIN功任務(wù)模塊流程圖
主要代碼如下:
while (1){
if (g_GprsIsConnect==1)
//GPRS連接狀態(tài),1連接,0未連接
//SYS_LED快閃(1秒4次)
else
g_SysLedDelay = OS_TICKS_PER_SEC/2; //SYS_LED慢閃(1秒1次)
GPIO_Output(SYS_LED,HIGH);
OSTimeDly(g_SysLedDelay);
GPIO_Output(SYS_LED,LOW);
OSTimeDly(g_SysLedDelay);
以學(xué)校牽頭組建貴州省護(hù)理職業(yè)教育集團(tuán)為平臺(tái),各成員共同遵守協(xié)議為紐帶,多元主體,利益共通,任務(wù)分?jǐn)偅謩e核算,共建共享,風(fēng)險(xiǎn)共擔(dān),項(xiàng)目驅(qū)動(dòng),實(shí)行新的校院合作模式。我們從最基礎(chǔ)、最容易入手的合作項(xiàng)目開(kāi)始,由易到難,由淺入深,逐漸增加合作的內(nèi)容和深度。2014年6月,學(xué)校牽頭完成了護(hù)理專業(yè)人才培養(yǎng)模式的重構(gòu),項(xiàng)目中多方合作,各展所長(zhǎng),成果獲得中國(guó)職教學(xué)會(huì)優(yōu)秀成果二等獎(jiǎng)。2015年,學(xué)校成為貴州省康復(fù)學(xué)會(huì)康復(fù)護(hù)理專業(yè)主任委員單位,學(xué)校與行業(yè)的深度對(duì)接,使護(hù)理專業(yè)教育教學(xué)改革更具有前瞻性、可預(yù)見(jiàn)性和實(shí)用性。
GPRSTimecnt++;
if(GPRSTimecnt >=600){ //心跳時(shí)間間隔
GPRSTimecnt=0;
if(Heartbeatflag==1){
Heartbeatflag = 0;
}
else{
g_GprsIsConnect=0;
}
}
if(GPRSTimecnt == 30 && !g_GprsIsConnect && !GPIO_GetValue(UART_SEL)){
if(!GPRS_Connect(GPRSAN,"TCP",ServerIP,ServerPT)){ //GPRS連接
GPRSTimecnt = 0;
g_GprsIsConnect=0;
GPRS_PowerOn();
}
}
WDT_Feed();
}
2.2 OUTPUT任務(wù)模塊
OUTPUT任務(wù)模塊主要功能是控制與管理DO輸出,同時(shí)實(shí)現(xiàn)斷線斷電后來(lái)電保持功能。實(shí)現(xiàn)的主要函數(shù)為while()、GPIOGetValue()。OUTPUT任務(wù)模塊流程圖如圖4所示。
圖4 OUTPUT功能任務(wù)模塊流程圖
主要代碼:
while (1){
if(g_output1==1)GPIO_Output(OUTPUT0,HIGH);
if(g_output1==0)GPIO_Output(OUTPUT0,LOW);
if(g_output2==1)GPIO_Output(OUTPUT1,HIGH);
if(g_output2==0)GPIO_Output(OUTPUT1,LOW);
if(g_output3==1)GPIO_Output(OUTPUT2,HIGH);
if(g_output3==0)GPIO_Output(OUTPUT2,LOW);
if(g_output4==1)GPIO_Output(OUTPUT3,HIGH);
if(g_output4==0)GPIO_Output(OUTPUT3,LOW);
OSTimeDlyHMSM(0,0,1,0);
}
2.3 INPUT任務(wù)模塊
INPUT任務(wù)模塊主要功能是采集和處理DI、DO狀態(tài),并通過(guò)UART上傳。實(shí)現(xiàn)的主要函數(shù)為while()、GPIO_GetValue()、UARTSend()。
圖5 INPUT功能任務(wù)模塊流程圖
主要代碼如下:
while (1){
p = (char*)malloc(8);
p[0] = 'D';p[1] = 'I';p[2] = 'G';p[3] = '0';
if (GPIO_GetValue(INPUT0)==1) p[4] = '0'; else p[4] = '1';
if (GPIO_GetValue(INPUT1)==1) p[5] = '0'; else p[5] = '1';
if (GPIO_GetValue(INPUT2)==1) p[6] = '0'; else p[6] = '1';
if (GPIO_GetValue(INPUT3)==1) p[7] = '0'; else p[7] = '1';
if(DIG0T>=3600||p[4]!=DIG0B[0]||p[5]!=DIG0B[1]||p[6]!=DIG0B[2]||p[7]!=DIG0B[3]){
for(i=0; i<4; i++) DIG0B[i]=p[i+4];
UARTSend((uint8_t*)p, 8);
DIG0T=0;
OSTimeDlyHMSM(0,0,1,0);
}
p[0] = 'D';p[1] = 'O';p[2] = 'G';p[3] = '0';
if (GPIOGetValue(2,0)==1) p[4] = '1'; else p[4] = '0';
if (GPIOGetValue(2,1)==1) p[5] = '1'; else p[5] = '0';
if (GPIOGetValue(2,2)==1) p[6] = '1'; else p[6] = '0';
if (GPIOGetValue(2,3)==1) p[7] = '1'; else p[7] = '0';
if(DOG0T>=3600){
UARTSend((uint8_t*)p, 8);
DOG0T=0;
}
free(p);
OSTimeDlyHMSM(0,0,1,0);
}
2.4 ADC任務(wù)模塊
ADC任務(wù)模塊主要功能是采集和處理8路AI的值,并通過(guò)UART上傳。實(shí)現(xiàn)的主要函數(shù)為while()、ADC_Read()、UARTSend()。ADC任務(wù)模塊流程圖如圖6所示。
圖6 ADC功能任務(wù)模塊流程圖
主要代碼如下:
while (1){
p = (char*)malloc(8);
for(i=0; i<8; i++){
if((i==7) && (ComCHFlag=='1'))
j=(uint16_t)(((float)(ADC_Read(i))*300*4.589)/(0x3ff));
else
j=(uint16_t)(((float)(ADC_Read(i))*300*1.7070)/(0x3ff));
if(j<=5) j=0;
if(AIT[i]>=3600 || j
AIB[i]=j;
myitoa((int)j, temp, 16);
p[0]='A';p[1]='I';p[2]=i+0x30;p[3]='0';
if((i==7)&&(ComCHFlag=='1')){p[0]='S';p[1]='y';p[2]='s';p[3]='U';}
p[4]='0';p[5]='0';p[6]='0';p[7]='0';
for(j=0;j UARTSend((uint8_t*)p, 8); AIT[i]=0; OSTimeDlyHMSM(0,0,1,0); } } free(p); OSTimeDlyHMSM(0,0,1,0); } 2.5 GPRS任務(wù)模塊 GPRS任務(wù)模塊主要功能是接收和處理UART傳來(lái)的數(shù)據(jù)或指令,并將關(guān)鍵的數(shù)據(jù)存儲(chǔ)到Flash中。實(shí)現(xiàn)的主要函數(shù)為UARTGetReceiveLenght()、memcpy()、UARTSend()、ramtoflash()。 圖7 GPRS功能任務(wù)模塊流程圖 接收遠(yuǎn)程服務(wù)器發(fā)來(lái)的數(shù)據(jù): while(!UARTNewDataArrive); //等待遠(yuǎn)程服務(wù)器發(fā)數(shù)據(jù) UARTNewDataArrive = 0; lenght=UARTGetReceiveLenght(); p=(char*)malloc(lenght); memcpy(p, UARTBuffer, lenght);//接收數(shù)據(jù) for (i=0; i < lenght; i++) UARTBuffer[i]='0'; //清空UART接收區(qū) 處理收到的讀Unique ID指令: UIdRead(); strcpy(temp,"DeUID(0x)"); //拷貝字符串 myitoa(Paramout[4], temp0, 16); //把整型數(shù)字轉(zhuǎn)換為十進(jìn) //制字符串 myitoa(Paramout[3], temp1, 16); strcat(temp0," "); strcat(temp0,temp1); myitoa(Paramout[2], temp1, 16); strcat(temp0," "); strcat(temp0,temp1); myitoa(Paramout[1], temp1, 16); strcat(temp0," "); strcat(temp0,temp1); myitoa(strlen(temp0), datalen, 10); strcat(temp,datalen); strcat(temp,":"); strcat(temp,temp0); UARTSend((uint8_t*)temp, strlen(temp)); 處理收到的User ID參數(shù)數(shù)據(jù),并存入FlashBuffer: strcpy(datalen,"999");//置999,沒(méi)找到:時(shí)保持該值 for (j=1;j<=4;j++){//4代表3位十進(jìn)制數(shù)+1位':' if(p[i+5+j]==':'){ for(k=1;k datalen[k-1]='
师宗县|
房山区|
高陵县|
剑阁县|
海城市|
衡阳市|
鹤山市|
北京市|
宁化县|
吴江市|
丰都县|
普安县|
双柏县|
且末县|
威远县|
会泽县|
桂林市|
神池县|
淮南市|
固始县|
英德市|
内江市|
封丘县|
株洲县|
那曲县|
瓦房店市|
石楼县|
缙云县|
镇远县|
赫章县|
枞阳县|
章丘市|
堆龙德庆县|
察哈|
东乌|
宝应县|
桓仁|
葵青区|
石首市|
且末县|
陵水|