基于ARM Cortex-M0的SoC单片机内核程序设计

2017-11-09 01:11,,
单片机与嵌入式系统应用 2017年10期
关键词:流程图内核单片机

,,

(1.新疆华隆油田科技股份有限公司,克拉玛依 834000;2.新疆油田数据公司;3.南京航空航天大学)

基于ARMCortex-M0的SoC单片机内核程序设计

于玉珠1,殷春莉2,孙浩3

(1.新疆华隆油田科技股份有限公司,克拉玛依 834000;2.新疆油田数据公司;3.南京航空航天大学)

随着信息技术和物联网的迅速发展,作为物联网前端硬件基础的单片机得到广泛应用。本系统就是以基于ARM Cortex-M0的HL-LPGC-LPC11C14-8044为硬件平台,利用C++语言和Real View工具设计与开发内核软件,实现远程数据采一集和系统控制,同时与云计算服务中心实现数据交互、为大数据处理提供基础。该系统无人值守和偏远区域覆盖,节约了运行成本,提升了工业生产的安全性、可靠性、高效性,综合效益明显提高。

物联网;SoC;GPRS;数据采集;Cortex-M0

引 言

单片机[1]是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。经历了SCM、MCU、SoC三大阶段,单片机渗透到我们生活的各个领域。广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,特别是自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械。

SoC(System on Chip)称为芯片级系统,也称片上系统,包含完整系统并有嵌入软件的全部内容,是集成电路设计发展的必然趋势。单芯片实现完整的电子系统,是IC 产业未来的发展方向。目前在性能和功耗敏感的终端芯片领域,特别是物联网领域,SoC已占据主导地位,而且其应用正在扩展到更广的领域。

本程序设计就是以基于ARM Cortex-M0[2]SoC单片机的HL-LPGC-LPC11C14-8044为硬件平台,利用C++语言和Real View工具设计与开发该基于μC/OS-II多任务嵌入式实时操作系统的SoC内核软件,以实现远程数据采集[3]和系统控制,同时与云计算服务中心实现数据交互,为物联网[4]大数据处理提供基础。

1 系统总体设计

本内核程序是使用RealView MDK 4.01开发环境和C++语言开发的,是基于μC/OS-II的任务轮训驱动型多线程32位软件,采用C/S方式通过指定服务端口或串口与远端云控制中心进行数据通信。系统总结构见图1系统总流程,主要由操作系统的7个功能任务模块构成,每个任务模块又有自己的无限循环功能子流程组成。通过主线程App_Task_MAIN管理GPRS连接,通过App_Task_OUTPUT、App_Task_INPUT、App_Task_ADC线程处理物联网云控制器的输入、输出,通过App_Task_GPRS线程处理与云控制中心通信数据或指令。

图1 总结构图

系统的总流程图见图2。主要由系统初始化、串行口初始化、通用I/O口初始化、存储器初始化、模数转换初始化、GPRS初始化、温度采集初始化、看门狗初始化共8个初始化函数,1个时钟设置函数,1个操作系统初始化函数,以及MAIN操作系统任务、OUTPUT操作系统任务、INPUT操作系统任务、ADC操作系统任务、AT24C02操作系统任务、GPRS操作系统任务、DS18B20操作系统任务7个功能任务模块和1个操作系统启动函数构成。

图2 系统总流程图

程序按顺序执行各个函数,直到操作系统启动函数执行完成。操作系统启动后,整个系统的资源管理与调度交由操作系统管理与调度,主流程完成。

程序主要是控制执行各种I/O[5]动作,并与远端云控制中心进行数据交互。具体具有以下功能:

① 通信方式自动适应:支持RS232和GPRS上连通信。

② 支持IP或域名方式:可通过上位机软件设置。

③ 心跳检测:定时进行心跳特征码扫描。

④ AD、DO、DI处理:处理模拟量采集、控制数字量输出、接收数字量输入。

⑤ 通信中断自动连接:GPRS中断后系统自动识别并重新建立。

⑥ 信息保存功能:设置数据自动保存。

⑦ 断电自动恢复:系统来电后自动运行。

⑧ I/O掉电保持:断电后,来电DO输出状态保持为断电前的状态。

⑨ 数据格式灵活:支持变长和固定长数据格式。

⑩ 采用C/S模式,数据实时上传,供云服务处理。

2 关键功能实现

系统共有7个功能模块,分别封装在操作系统的7个任务模块里。

2.1 MAIN任务模块

主要功能是控制与管理GPRS连接,实现断线自动重连。实现的主要函数为while()、GPRS_Connect()等。MAIN任务模块流程图如图3所示。

图3 MAIN功任务模块流程图

主要代码如下:

while (1){

if (g_GprsIsConnect==1)

//GPRS连接状态,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);

以学校牵头组建贵州省护理职业教育集团为平台,各成员共同遵守协议为纽带,多元主体,利益共通,任务分摊,分别核算,共建共享,风险共担,项目驱动,实行新的校院合作模式。我们从最基础、最容易入手的合作项目开始,由易到难,由浅入深,逐渐增加合作的内容和深度。2014年6月,学校牵头完成了护理专业人才培养模式的重构,项目中多方合作,各展所长,成果获得中国职教学会优秀成果二等奖。2015年,学校成为贵州省康复学会康复护理专业主任委员单位,学校与行业的深度对接,使护理专业教育教学改革更具有前瞻性、可预见性和实用性。

GPRSTimecnt++;

if(GPRSTimecnt >=600){ //心跳时间间隔

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任务模块

OUTPUT任务模块主要功能是控制与管理DO输出,同时实现断线断电后来电保持功能。实现的主要函数为while()、GPIOGetValue()。OUTPUT任务模块流程图如图4所示。

图4 OUTPUT功能任务模块流程图

主要代码:

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任务模块

INPUT任务模块主要功能是采集和处理DI、DO状态,并通过UART上传。实现的主要函数为while()、GPIO_GetValue()、UARTSend()。

图5 INPUT功能任务模块流程图

主要代码如下:

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任务模块

ADC任务模块主要功能是采集和处理8路AI的值,并通过UART上传。实现的主要函数为while()、ADC_Read()、UARTSend()。ADC任务模块流程图如图6所示。

图6 ADC功能任务模块流程图

主要代码如下:

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 || jAIB[i]*1.01){

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任务模块

GPRS任务模块主要功能是接收和处理UART传来的数据或指令,并将关键的数据存储到Flash中。实现的主要函数为UARTGetReceiveLenght()、memcpy()、UARTSend()、ramtoflash()。

图7 GPRS功能任务模块流程图

接收远程服务器发来的数据:

while(!UARTNewDataArrive); //等待远程服务器发数据

UARTNewDataArrive = 0;

lenght=UARTGetReceiveLenght();

p=(char*)malloc(lenght);

memcpy(p, UARTBuffer, lenght);//接收数据

for (i=0; i < lenght; i++) UARTBuffer[i]='0';

//清空UART接收区

处理收到的读Unique ID指令:

UIdRead();

strcpy(temp,"DeUID(0x)"); //拷贝字符串

myitoa(Paramout[4], temp0, 16); //把整型数字转换为十进

//制字符串

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参数数据,并存入FlashBuffer:

strcpy(datalen,"999");//置999,没找到:时保持该值

for (j=1;j<=4;j++){//4代表3位十进制数+1位':'

if(p[i+5+j]==':'){

for(k=1;k

datalen[k-1]='';

break; //找到第1个':'后,跳出循环

}

}

if (atoi(datalen)>=0 && atoi(datalen)<14){

for(j=1;j<=atoi(datalen);j++)UserID[j-1]=p[i+5+strlen(datalen)+1+j];

UserID[j-1]='';

for(j=strlen(UserID)+1;j<14;j++) UserID[j]=0x0;

FlashBuffer[0x40]='I';

FlashBuffer[0x41]='D';

for (j=0;j<14;j++) FlashBuffer[0x42+j]=UserID[j];

FlashWRFlag='1';

strcpy(temp,"UserID");

myitoa(strlen(UserID), datalen, 10);

strcat(temp,datalen);

strcat(temp,":");

strcat(temp,UserID);

UARTSend((uint8_t*)temp, strlen(temp));//发回服务器

i=i+5+strlen(datalen)+atoi(datalen);

//数据有效,搜索后移

continue;

}

将FlashBuffer数据存入Flash:

IrqDisable(); //系统中断禁止

selectsector(7, 7); //选择Flash扇区7,擦除之前要选择

sectorErase (7, 7); //擦除Flash扇区7数据,写之前要擦除

selectsector(7, 7); //选择Flash扇区7,写之前要选择

ramtoflash(0x00007000, (uint32_t)FlashBuffer, 256);

//写数据到Flash扇区7

IrqEnable(); //系统中断使能

FlashWRFlag='0'; //写Flash标记置'0'

3 实时多任务操作系统实现

μC/OS-II操作系统是一种抢占式多任务、单内存空间、微小内核的嵌入式操作系统,具有高效、紧凑的特点。它执行效率高,占用空间小,可移植性强,实时性能良好且可扩展性强。采用μC/OS-II实时操作系统,可以有效地对任务进行调度,对各任务赋予不同的优先级可以保证任务及时响应。采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。

本程序通过实时多任务操作系统创建了7个操作系统任务,主要实现代码如下:

OSInit();

OSTaskCreateExt((void (*)(void *)) App_Task_MAIN,

(void*) 0,

(OS_STK*)&App_TaskMAINStk[APP_TASK_MAIN_STK_SIZE - 1],

(INT8U) APP_TASK_MAIN_PRIO,

(INT16U) APP_TASK_MAIN_PRIO,

(OS_STK*)&App_TaskMAINStk[0],

(INT32U) APP_TASK_MAIN_STK_SIZE,

(void*)0,

(INT16U)(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

OSTaskCreateExt((void (*)(void *)) App_Task_OUTPUT,

(void*) 0,

(OS_STK*)&App_TaskOutputStk[APP_TASK_OUTPUT_STK_SIZE - 1],

(INT8U) APP_TASK_OUTPUT_PRIO,

(INT16U) APP_TASK_OUTPUT_PRIO,

(OS_STK*)&App_TaskOutputStk[0],

(INT32U) APP_TASK_OUTPUT_STK_SIZE,

(void*)0,

(INT16U)(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

OSTaskCreateExt((void (*)(void *)) App_Task_INPUT,

(void*) 0,

(OS_STK*)&App_TaskInputStk[APP_TASK_INPUT_STK_SIZE-1],

(INT8U) APP_TASK_INPUT_PRIO,

(INT16U) APP_TASK_INPUT_PRIO,

(OS_STK*)&App_TaskInputStk[0],

(INT32U) APP_TASK_INPUT_STK_SIZE,

(void*) 0,

(INT16U)(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

OSTaskCreateExt((void (*)(void *)) App_Task_ADC,

(void*) 0,

(OS_STK* )&App_TaskADCStk[APP_TASK_ADC_STK_SIZE-1],

(INT8U ) APP_TASK_ADC_PRIO,

(INT16U) APP_TASK_ADC_PRIO,

(OS_STK* )&App_TaskADCStk[0],

(INT32U) APP_TASK_ADC_STK_SIZE,

(void*) 0,

(INT16U)(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

OSTaskCreateExt((void (*)(void *)) APP_TASK_AT24C02,

(void*) 0,

(OS_STK*)&App_TaskAT24C02Stk[APP_TASK_AT24C02_STK_SIZE - 1],

(INT8U ) APP_TASK_AT24C02_PRIO,

(INT16U) APP_TASK_AT24C02_PRIO,

(OS_STK*)&App_TaskAT24C02Stk[0],

(INT32U) APP_TASK_AT24C02_STK_SIZE,

(void*)0,

(INT16U)(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

OSTaskCreateExt((void (*)(void *)) App_Task_GPRS,

(void*) 0,

(OS_STK*)&App_TaskGPRSStk[APP_TASK_GPRS_STK_SIZE - 1],

(INT8U ) APP_TASK_GPRS_PRIO,

(INT16U) APP_TASK_GPRS_PRIO,

(OS_STK*)&App_TaskGPRSStk[0],

(INT32U) APP_TASK_GPRS_STK_SIZE,

(void*)0,

(INT16U)(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

OSTaskCreateExt((void (*)(void *)) APP_TASK_DS18B20,

(void*) 0,

(OS_STK*)&App_TaskDS18B20Stk[APP_TASK_DS18B20_STK_SIZE - 1],

(INT8U ) APP_TASK_DS18B20_PRIO,

(INT16U) APP_TASK_DS18B20_PRIO,

(OS_STK*)&App_TaskDS18B20Stk[0],

(INT32U) APP_TASK_DS18B20_STK_SIZE,

(void*)0,

(INT16U)(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));

OSStart();

结 语

[1] 蔡美琴,张为民,沈新群,等.MCS-51系列单片机系统及其应用[M].北京:高等教育出版社,1995.

[2] 张涵,王海堂,沈孝芹,等.ARM Cortex-M0嵌入式系统设计与应用[M].北京:电子工业出版社,2013.

[3] 周根来.水处理岛总线控制方案的探讨[J].石油化工自动化,2011,47(2):39-41.

[4] 王仲东,黄俊桥.物联网的开发与应用实践[M]. 北京:机械工业出版社,2014.

[5] 罗强,陈丽雪.基于单片机的嵌入式工程开发详解[M].北京:电子工业出版社,2009.

[6] 陈新发,曾颖,李清辉.数字油田建设与实践[M].北京:石油工业出版社,2008.

SoCMicrocontrollerKernelProgramDesignBasedonARMCortex-M0

YuYuzhu1,YinChunli2,SunHao3

(1.Xinjiang Hualong Oilfield Science and Technology Co.,Ltd.,Karamay 834000,China; 2.Data Company of Xinjiang Oilfield;3.Nanjing University of Aeronautics and Astronautics)

With the rapid development of information technology and IoT,the microcontroller is widely used for the front-end hardware of IoT.The HL-LPGC-LPC11C14-8044 based on ARM Cortex-M0 is used as the hardware platform.C++ language and the Real View tool are used to achieve the data acquisition and system control in remote areas.,and that exchanges the data with the cloud computing service center and provides basic data for the large data processing.After the system is applied,it is normally running by unattended,and it is used in remote site,that saves the operation cost and improves the safety,reliability and efficiency,so that the comprehensive benefits are increased.

IoT;SoC;GPRS;data acquisition;Cortex-M0

TP27

A

2017-05-08)

猜你喜欢
流程图内核单片机
强化『高新』内核 打造农业『硅谷』
基于单片机的SPWM控制逆变器的设计与实现
基于单片机的层次渐变暖灯的研究
基于单片机的便捷式LCF测量仪
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
专利申请审批流程图
微生物内核 生态型农资
专利申请审批流程图
Microchip推出两个全新PIC单片机系列