中断处理函数映射说法是否正确不敢保证,意思就是将中断处理函数的地址与参数放入中断向量表中(_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中。两者根据不同中断状态寄存器中的标识进行相应的处理。
上一篇:解决stm8会卡在串口中断的问题
下一篇:STM8S学习03——寄存器版本的一些程序
推荐阅读最新更新时间:2024-11-08 16:42
设计资源 培训 开发板 精华推荐
- EVAL-AD5340DBZ,用于评估 AD5340 12 位单通道电压输出数模转换器 (DAC) 的评估板
- 基于 ADG904-R 的中频带通滤波器组切换网络,用于无线基础设施
- atmega-328p-t12 开源焊台
- 采用 LTC1929 2V/20A CPU 电源并具有有源电压定位的典型应用电路
- NCP301LSN45T1 4.5V 电压检测器的典型应用,用于具有附加迟滞的微处理器复位电路
- LT6656AIS6-2.5、2.5V 微控制器电压基准和稳压器的典型应用
- MIC94091YC6 消费类高端负载开关的典型应用电路
- LT1085CT-12、12V/7.5A 并联低压差稳压器的典型应用电路
- MC33071DR2G高速低压比较器典型应用
- mini-jlink-v9