历史上的今天
今天是:2024年09月16日(星期一)
2019年09月16日 | Zynq篇——uart中断
2019-09-16 来源:eefocus
中断处理函数映射说法是否正确不敢保证,意思就是将中断处理函数的地址与参数放入中断向量表中(_vector_table)中。
早期运用的arm芯片规模较小,在芯片上直接有uart的中断服务函数地址寄存器,直接将中断服务函数的地址写入寄存器就搞定了。然后zynq似乎比较复杂,中断也比较。在zynq中有个Scu(snoop control unit窥探控制单元,也是arm所有的)专门控制中断处理。Vivado SDK中提供了scugic驱动来处理相关的操作。下面具体说一下,中断hook的过程。
XScuGic_LookupConfig // 找到scugic的定义实体;
XScuGic_CfgInitialize // 初始化scugic实体;
Xil_ExceptionInit() //异常处理初始化
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
pScuGic);
这一步基本是固定的,中断触发之后统一由XScuGic_InterruptHandler先处理,然后在HandlerTable中查找相应的处理函数。这个HandlerTable数组的长度为95个,包含了所有的中断ID。
Xil_ExceptionEnable(); 异常处理使能
XScuGic_Connect( pScuGic,XPAR_PS7_UART_1_INTR, (Xil_InterruptHandler)ZUartPs_InterruptHandler , (void*)pUart1Inst);
这才是将我们定义的中断服务函数地址映射到HandlerTable中。也可以使用UartPs驱动中包含的中断处理函数。
XScuGic_Enable( pScuGic, XPAR_PS7_UART_1_INTR); 使能uart对应的中断ID。
XUartPs_SetInterruptMask( pUart1Inst, XUARTPS_IXR_RXOVR | XUARTPS_IXR_TXEMPTY /*| XUARTPS_IXR_TNFUL*/ ); 这应用程序中开启接收缓冲fifo中断与发送为空中断。
这时uart接收到数据,则会自动跳入中断处理函数ZUartPs_InterruptHandler中。向发送硬fifo中写入数据,在数据发空后,也会跳入中断处理函数ZUartPs_InterruptHandler中。两者根据不同中断状态寄存器中的标识进行相应的处理。
史海拾趣
|
如今的汽车电子系统越来越复杂。同时,汽车环境对任何电子产品来说都是很大的挑战,因为汽车电子系统要求运行电压很宽,并且有很大的瞬态电压和温度变化。另外,性能要求也越来越高,需要多个供应电压以满足系统的不同要求。典型的导航系统可以有六 ...… 查看全部问答> |
|
RT,改了内存映射表,startup.s的Jump to KernelStart里面的add r0, pc, #g_oalAddressTable - (. + 8)出错,是不是单改内存映射表不行的?不知道哪里还需要修改… 查看全部问答> |
|
我现在做法如下,记得有人说第一次枚举的是缺省设备,但是for循环的i从0还是-1开始? int s_nAudDevCount = waveOutGetNumDevs(); printf(\"s_nA ...… 查看全部问答> |
|
小弟刚接触这个东东,为一DVDROM写ATAPI驱动,检测到硬件没问题,Identify命令(0xa1)执行成功,但执行SCSI测试命令时出错,通过RequestSense(0x03h)命令检测到sensekey 为2。我的主芯片是三星5009。请问各位大虾这是什么原因造成的阿,不胜感激 ...… 查看全部问答> |




