离开投行后教人做饭:她即将拿下上市公司
06-17
ARM7 与 FPGA 结合在工业控制和故障检测中的应用 在工业控制中,经常需要多路故障检测和多路命令控制(这种多任务设置很常见),单个CPU芯片由于其外部控制接口数量有限,很难直接完成多通道的检测和控制任务,所以采用ARM芯片结合FPGA来扩展检测和控制通道是一个非常好的选择。
这里介绍一种使用Atmel的ARM7处理器(AT91FR2)结合ALTERA的低成本FPGA芯片(CycloneII)完成多通道检测和控制任务的实现方法。
各部分功能介绍 图1为本系统的结构连接框图。
如图所示,ARM芯片和FPGA芯片通过数据总线、地址总线和读写控制线连接,并通过串口与终端PC进行通信; FPGA和目标设备通过命令控制总线和故障检测总线连接。
图1 系统结构框图 1 故障检测与命令控制部分 故障检测:检测通道的故障(正常)信号以高(低)电平表示,一旦维持一次故障发生 高电平保持不变,直至故障排除。
针对这一特点,在ARM控制器侧采用定时中断循环查询的方式来判断故障通道的状态。
定时中断程序对FPGA中的ARM地址总线进行译码,依次锁定检测通道的电平值,然后通过数据总线传回ARM进行判断,最后将判断结果发送到远程终端。
采用主机查询方式而不是故障中断方式有两个原因:一方面,控制芯片的外部中断源通常有限(大多是4个外部中断源),检测多目标显然是困难的中断信号;另一方面,由于检测通道或设备的短时干扰,电平随机反转,导致故障中断被触发。
中断触发后,当通道电平恢复正常时,故障信号无法取消,从而形成误报。
命令控制:ARM芯片首先判断主机发送的控制命令,然后将命令状态通过地址总线和数据总线发送到FPGA地址译码锁定的控制通道。
2 ARM芯片与远程检测控制终端通信 由于只有命令和故障状态信号的发送和接收,因此采用ARM串口实现与远程PC的通信,通信标准被选为RS标准。
但在ARM芯片上,必须先通过MAX芯片将TTL电平转换为RS电平标准。
对于距离超过15m的全双工通信,必须在发送端和接收端都增加一对RS到RS电平转换。
模块以增加通讯距离。
3 FPGA内部功能模块说明 FPGA内部检测和控制电路的结构关系如图2所示。
图2 FPGA内部逻辑结构 ARM芯片的ADDR2~0位地址线和片选使能信号进入译码器decode1进行地址译码,产生8个输出(FPGA可以设置Decoding模块的最大输出,所以实际应用中可扩展更多通道),下4个通道用于命令发送通道,上4个通道用于故障检测通道,读写使能信号控制数据总线。
当ARM芯片收到发送信号编码命令后,立即在串口接收中断服务子程序中向FPGA发送相应的地址(通道号)和数据(命令状态)。
译码器的有效输出作为相应通道D触发器的锁存时钟,数据状态被触发器锁存并作为所选通道的输出,完成相应的控制。
定时中断产生后,ARM芯片进入服务程序,依次查询所有检测通道。
当检测到通道故障时,故障信号与所选通道信号结合,通过NAND运算发送到数据端口进行读取。
FPGA编程注意事项 1延时配置 通过地址总线和数据总线进行命令传输和故障检测时,FPGA作为ARM芯片的公共外设。
ARM芯片对外设的访问速度比片内存储器慢很多,因此必须在ARM中设置正确的访问等待时间。
ARM 提供的延迟周期为0 到7。
通过调试可以找到外设合适的等待周期。
根据实际测试,本系统的等待时间设置为5。
具体配置方法请参见ARM程序说明。
2 读写使能信号的连接 从图2可以看出,写使能信号NWE和读使能信号NRD应连接为数据线(DATA0~ 5)、即使ARM芯片没有其他外设时也不能默认。
由于同一系统上ARM的上电程序加载时间比FPGA的程序配置时间长,并且FPGA的检测和控制通道都连接到ARM芯片的数据总线上,所以FPGA加载完成后,数据总线将存储相应通道的逻辑电平值。
(不是三态),这样会导致ARM芯片在对片上Flash芯片编程或者上电加载程序时与FPGA发生冲突(数据被逻辑锁定),导致操作对象无法位置正确,读写就会失败。
ARM 配置和应用说明 1 处理器资源分配 ● 内存 AT91FR2 嵌入了KB SRAM 和K 个16 位字的Flash 存储器。
SRAM通过内部32位数据总线连接到ARM内核并在单周期内访问,而Flash存储器则通过外部总线访问。
● 系统周边 EBI:外部总线控制接口。
EBI 可以寻址 64MB 的空间。
它通过8条片选线(NCS0~NCS3独立)和24位地址线访问外设。
地址线的高4位连接片选线(NCS4~7)。
复用后,数据总线可配置为8/16位模式以与外设接口。
PIO:并口控制器,PIO控制32条I/O线,其中大部分为复用引脚,可以通过编程选择通用或专用。
AIC:高级中断控制器,实现对片内外设中断和四个外部中断源中断的管理。
其外部中断引脚与通用 I/O 复用。
● 用户外设 USART0~??1:串口收发控制器,支持8 个数据位的传输,可以进行异步/同步传输选择,其片外引脚与通用I/O 复用。
TC:定时器/计数器,可以产生定时中断和计数功能。
其片外引脚与通用 I/O 复用。
2 内存地址重映射后的空间分配 CPU上电后,第一条指令代码将从地址0开始执行,上电复位后,地址0必须映射到NCS0片选在器件上,NCS0 必须连接到片上Flash 以加载初始化程序和应用程序。
由于中断和异常的入口地址固定为0到20H,因此它们的生成会跳转到0到20H之间对应的地址执行程序。
为了加快中断响应速度,必须将地址0到20H映射到芯片上。
RAM 区域,因此执行初始化重映射命令后(EB1_RCR 的 RCB 位为 1),内部 RAM 被映射到地址 0,所有中断入口响应和堆栈操作都映射到 RAM 区域。
由于重映射主要用于Flash与片内RAM之间的地址空间交换,因此片上外设接口(EBI、USART、TC)对应的存储器编程地址范围在映射前后不会改变,同时访问重映射后分配的外设地址。
重映射后的地址分配如表1所示。
3 应用接口存储器配置 EBI存储器:设置8个EBI片选存储器(EBI_CSR0~EBI_CSR7)的外设访问参数。
其中,32位存储器包括数据总线宽度8(16)个设置、等待状态数量1~7个周期设置、等待使能(不使能)设置、片选使能(禁止)设置。
这里以FPGA作为外设,使能NCS3(也可以根据实际情况选择其他空闲的片选线),总线宽度选择为16,使能等待周期,周期设置为5(根据调试选择)。
由于NCS0默认是加载Flash片选线,而Flash有16位信号和7个等待周期,因此需要在EBI_CSR0中选择16位总线宽度、7个等待周期并使能NCS0。
AIC内存:AIC内存管理所有内部和外部中断。
只有正确初始化分配这块内存才会打开相应的中断。
设置AIC工作参数:应用串口通信模式为异步模式,串口发送的数据字符长度为8位,通信波特率为B/s,串口中断优先级为6(中断优先级从从低到高0~7),接收和发送通道使能。
TC内存:定时中断内存需要设置定时长度为1s(每1s产生一个中断用于故障查询),使能定时通道和软件触发模式,并将定时中断优先级设置为1。
C_BASE_EBI, //地址指针 0x3, //芯片NCS3使能 0xx3f39); //片选存储器初始化 Usart_init(); //初始化串口 timer_init(); //初始化定时器 while(1){} //循环等待 } ARM处理器完成各寄存器的初始化后进入应用主程序。
主程序中首先调用EBI接口使能函数设置参数:程序中设置存储器基地址值(0xFFE0),设置片选为0x3(NCS3使能),初始化NCS3的存储器;调用USART控制器函数初始化串口:打开串口,初始化串口收发通道,设置串口通信速率;调用定时中断函数:打开定时中断,设置定时中断时间,设置触发方式为软件触发;最终进入等待循环。
②串口命令接收中断服务程序 #define USART0_INTERRUPT_LEVEL 6//设置中断优先级为6 #define AT91C_US_USMODE_NORMAL AT91C_US_CHMODE_NORMAL//*设置通信模式(NORMAL定义为异步模式)*/ / AT91PS_USART COM0=AT91C_BASE_US0;//设置COM0为收发口 char message[4]; //控制口串口中断通讯程序// //*---- ----- --------------------------------------------------------- ----- ------------------*// void Usart0_c_irq_handler(AT91PS_USART USART_pt)//串口中断处理函数 { volatile unsigned int *conp;unsigned int status; int time; volatile unsigned int i; status = USART_pt->US_CSR &USART_pt ->US_IMR;//给状态寄存器赋一个初始值 if ( status &AT91C_US_RXRDY)//接收通道寄存器判断是否有数据 { AT91F_US_DisableIt(USART_pt,AT91C_US_RXRDY);//关闭接收通道,准备就绪 Interrupt AT91F_US_EnableIt(USART_pt,AT91C_US_ENDRX);//打开接收结束中断 AT91F_US_ReceiveFrame(USART_pt,(char*)(message),4);//调用接收的个数data 接收数据 } if ( status &AT91C_US_ENDRX){ AT91F_US_DisableIt(USART_pt,AT91C_US_ENDRX); // 关闭接收端发送结束中断 { if ((message[0]^0xff)==message[1])//判断接收码 {switch (message[0]) {case 0x31: {conp=(volatile unsigned int*)(0x1x);//OPE1使能 *conp=0x2;}; break;// 0x31 代码发送到 OPE1 端口 case 0x30: {conp=(volatile unsigned int*)(0x2x);//OPE2 使能 *conp=0x1;};休息; // 0x30 代码发送到 OPE2 端口 case 0x11: {conp=(volatile unsigned int*)(0x3x);//OPE3 启用 *conp=0x2;};break;//0x11 代码发送至 OPE3 端口 case 0x10: {conp=(易失性无符号整数*)(0x4x);//启用OPE4 *conp=0x1;};break; //0x10代码发送到OPE4口 default:break;} } } 以上程序为串口中断服务程序。
各函数语句的说明请参见注释。
中断级别设置为6(高于定时中断),使命令发送优先于故障查询(控制命令随机出现,故障查询始终循环执行);接收缓冲区message[4]数组类型必须设置为动态分配,静态数据分配会导致处理器在Flash芯片中开辟一个数据缓冲区,从而因中断中访问时间过长而导致串口收发器超时错误处理程序。
由于篇幅有限,其他流程不再一一描述。
编写ARM应用程序时,主函数中应尽量少使用循环操作。
main函数主要完成各个接口控制器应用程序的初始化,因为main函数不间断的循环运行不仅会增加功耗,而且耗时较长。
中断服务和主循环之间的频繁切换会导致程序运行不稳定,因此可以用定时中断完成的循环操作应尽可能用中断来完成。
结论 ARM芯片控制功能的独特优势结合FPGA在工程上灵活的多硬件接口仿真特性,已发展成为流行的硬件架构模型。

随着芯片功能的不断强大,这一优势将使其更加通用,在任务处理上更加灵活高效。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-18
06-18
06-18
06-17
06-18
06-17
06-18
最新文章
使用电子管有哪些注意事项?如何检查电子管之间是否短路?
博通支付1200万美元和解SEC财务欺诈指控
八名运营商高管确认加入虚拟运营商
内蒙古农牧区雷电灾害成因分析及防雷对策
北京联通将5G应用于世园会远程医疗急救
TD-SCDMA最后一轮冲刺测试启动,产业前景更加光明
专访阿里云总裁王健:云计算服务平台梦想成真
USB2.0控制器CY7C68013的接口设计与实现