4应用程序说明
①主程序
#defineAT91C_BASE_EBI((AT91PS_EBI)0xFFE00000)//EBI基地址定义
intmain()
{AT91F_EBI_OpenChipSelect(
AT91C_BASE_EBI,//地址指针
0x3,//片NCS3使能
0x30000000+0x3f39);//片选存储器初始化
Usart_init();//初始化串口
timer_init();//初始化定时器
while(1){}//循环等待
}
ARM处理器在完成各寄存器初始化后进入应用主程序,在主程序中首先调用EBI接口使能函数来设置参数:在程序中设置存储器基地址值(0xFFE00000),片选设置0x3(NCS3使能),NCS3的存储器初始化;调用USART控制器函数初始化串口:打开串口,串口收发通道初始化,设定串口通信速率;调用定时中断函数:打开定时中断,设置定时中断时间,设定触发方式为软件触发;最后进入等待循环。
②串口命令接收中断服务程序
#defineUSART0_INTERRUPT_LEVEL6//设置中断优先级为6
#defineAT91C_US_USMODE_NORMALAT91C_US_CHMODE_NORMAL//*设置通信模式(NORMAL定义为异步模式)*//
AT91PS_USARTCOM0=AT91C_BASE_US0;//设置COM0为收发口
charmessage[4];
//控制端串口中断通信程序//
//*----------------------------------------------------------------------------*//
voidUsart0_c_irq_handler(AT91PS_USARTUSART_pt)//串口中断处理函数
{volatileunsignedint*conp;unsignedintstatus;
inttime;
volatileunsignedinti;
status=USART_pt->US_CSR&USART_pt->US_IMR;//给状态寄存器赋初值
if(status&AT91C_US_RXRDY)//接收通道寄存器判断是否有数据
{
AT91F_US_DisableIt(USART_pt,AT91C_US_RXRDY);//关闭接收通道准备好中断
AT91F_US_EnableIt(USART_pt,AT91C_US_ENDRX);//打开接收结束中断
AT91F_US_ReceiveFrame(USART_pt,(char*)(message),4);//调用接收数据数接收数据
}
if(status&AT91C_US_ENDRX){
AT91F_US_DisableIt(USART_pt,AT91C_US_ENDRX);//关闭接收器传送结束中断
{if((message[0]^0xff)==message[1])//判断接收代码
{switch(message[0])
{case0x31:{conp=(volatileunsignedint*)(0x1+0x30000000);//OPE1使能
*conp=0x2;};break;//0x31代码送往OPE1端口
case0x30:{conp=(volatileunsignedint*)(0x2+0x30000000);//OPE2使能
*conp=0x1;};break;//0x30代码送往OPE2端口
case0x11:{conp=(volatileunsignedint*)(0x3+0x30000000);//OPE3使能
*conp=0x2;};break;//0x11代码则往OPE3端口
case0x10:{conp=(volatileunsignedint*)(0x4+0x30000000);//OPE4使能
*conp=0x1;};break;//0x10代码送往OPE4端口
default:break;}
}
}
以上程序为串口中断服务程序,各函数语句说明参见注释。中断级别设置为6(高于定时中断),这样使命令发送优先于故障查询(控制命令随机出现而故障查询总是循环进行);接收缓冲区message[4]数组类型必须设为动态分配,静态数据分配会使处理器开辟数据缓冲区到Flash芯片中,从而引发在一个中断处理程序中由于存取时间过长而导致串口收发超时的错误。因为篇幅有限,其他程序不再一一叙述。
在ARM应用程序的编写中,应该尽量少的在主函数内使用循环操作,主函数主要完成各接口控制器应用初始化,因为主函数不间断循环操作不但会增加功耗,而且长时间频繁切换于中断服务和主循环之间会造成程序运行的不稳定,所以能用定时中断完成的循环操作尽量用中断完成。
结语
ARM芯片控制功能结合FPGA灵活的多硬件接口模拟特性在工程上体现出的其独特的优势,已发展为一种流行的硬件架构模式,随着芯片功能的不断强大,这种优势将使其用途更广,对任务处理变得更加灵活高效。
4应用程序说明
①主程序
#defineAT91C_BASE_EBI((AT91PS_EBI)0xFFE00000)//EBI基地址定义
intmain()
{AT91F_EBI_OpenChipSelect(
AT91C_BASE_EBI,//地址指针
0x3,//片NCS3使能
0x30000000+0x3f39);//片选存储器初始化
Usart_init();//初始化串口
timer_init();//初始化定时器
while(1){}//循环等待
}
ARM处理器在完成各寄存器初始化后进入应用主程序,在主程序中首先调用EBI接口使能函数来设置参数:在程序中设置存储器基地址值(0xFFE00000),片选设置0x3(NCS3使能),NCS3的存储器初始化;调用USART控制器函数初始化串口:打开串口,串口收发通道初始化,设定串口通信速率;调用定时中断函数:打开定时中断,设置定时中断时间,设定触发方式为软件触发;最后进入等待循环。
②串口命令接收中断服务程序
#defineUSART0_INTERRUPT_LEVEL6//设置中断优先级为6
#defineAT91C_US_USMODE_NORMALAT91C_US_CHMODE_NORMAL//*设置通信模式(NORMAL定义为异步模式)*//
AT91PS_USARTCOM0=AT91C_BASE_US0;//设置COM0为收发口
charmessage[4];
//控制端串口中断通信程序//
//*----------------------------------------------------------------------------*//
voidUsart0_c_irq_handler(AT91PS_USARTUSART_pt)//串口中断处理函数
{volatileunsignedint*conp;unsignedintstatus;
inttime;
volatileunsignedinti;
status=USART_pt->US_CSR&USART_pt->US_IMR;//给状态寄存器赋初值
if(status&AT91C_US_RXRDY)//接收通道寄存器判断是否有数据
{
AT91F_US_DisableIt(USART_pt,AT91C_US_RXRDY);//关闭接收通道准备好中断
AT91F_US_EnableIt(USART_pt,AT91C_US_ENDRX);//打开接收结束中断
AT91F_US_ReceiveFrame(USART_pt,(char*)(message),4);//调用接收数据数接收数据
}
if(status&AT91C_US_ENDRX){
AT91F_US_DisableIt(USART_pt,AT91C_US_ENDRX);//关闭接收器传送结束中断
{if((message[0]^0xff)==message[1])//判断接收代码
{switch(message[0])
{case0x31:{conp=(volatileunsignedint*)(0x1+0x30000000);//OPE1使能
*conp=0x2;};break;//0x31代码送往OPE1端口
case0x30:{conp=(volatileunsignedint*)(0x2+0x30000000);//OPE2使能
*conp=0x1;};break;//0x30代码送往OPE2端口
case0x11:{conp=(volatileunsignedint*)(0x3+0x30000000);//OPE3使能
*conp=0x2;};break;//0x11代码则往OPE3端口
case0x10:{conp=(volatileunsignedint*)(0x4+0x30000000);//OPE4使能
*conp=0x1;};break;//0x10代码送往OPE4端口
default:break;}
}
}
以上程序为串口中断服务程序,各函数语句说明参见注释。中断级别设置为6(高于定时中断),这样使命令发送优先于故障查询(控制命令随机出现而故障查询总是循环进行);接收缓冲区message[4]数组类型必须设为动态分配,静态数据分配会使处理器开辟数据缓冲区到Flash芯片中,从而引发在一个中断处理程序中由于存取时间过长而导致串口收发超时的错误。因为篇幅有限,其他程序不再一一叙述。
在ARM应用程序的编写中,应该尽量少的在主函数内使用循环操作,主函数主要完成各接口控制器应用初始化,因为主函数不间断循环操作不但会增加功耗,而且长时间频繁切换于中断服务和主循环之间会造成程序运行的不稳定,所以能用定时中断完成的循环操作尽量用中断完成。
结语
ARM芯片控制功能结合FPGA灵活的多硬件接口模拟特性在工程上体现出的其独特的优势,已发展为一种流行的硬件架构模式,随着芯片功能的不断强大,这种优势将使其用途更广,对任务处理变得更加灵活高效。
举报