首先自然是跟着实验指导书做实验了

实验2B

然后发现别人添加另外一个gpio的方法是需要重新添加一个gpio的ip核的,而不是直接用同一个ip核的另外一个gpio口

而且感觉在SDK上编程的体验还是不太佳,没有代码自动补全能力~ ,网上搜索了一下,发现代码补全的能力是有的,快捷键alt+/

这个实验的目标是使用中断检测按键输入,然后控制led灯的变换,按键(btns)按下时,对应leds的那一位加1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int InterruptSystemSetup(XScuGic *XScuGicInstancePtr)
{
// Enable interrupt
XGpio_InterruptEnable(&BTNInst, BTN_INT);
XGpio_InterruptGlobalEnable(&BTNInst);
...
return XST_SUCCESS;

}

int IntcInitFunction(u16 DeviceId, XGpio *GpioInstancePtr)
{
...
status = XScuGic_Connect(&INTCInst,
INTC_GPIO_INTERRUPT_ID,
(Xil_ExceptionHandler)BTN_Intr_Handler,
(void *)GpioInstancePtr);
if(status != XST_SUCCESS) return XST_FAILURE;

// Enable GPIO interrupts interrupt
XGpio_InterruptEnable(GpioInstancePtr, 1);
XGpio_InterruptGlobalEnable(GpioInstancePtr);

// Enable GPIO and timer interrupts in the controller
XScuGic_Enable(&INTCInst, INTC_GPIO_INTERRUPT_ID);
...
}

zynq的ps这边使用中断和以前mcu开发时很像,也都是需要先对中断注册,然后开中断,最后才能使用。

中断能用了,还要声明一个处理中断的函数,这个例程中的BTN_Intr_Handler就是一个处理中断的函数,在初始化中断的时候就注册好了。

效果如下:

实验2B总结

通过这个部分的实验,学会了如何在Vivado中,开启一个ip的中断,又是怎么与zynq的ps核连接。

还学习到,要想在ps中使用这个中断,需要注册初始化这个中断和声明一个处理中断的函数。

实验2D

这个实验是教我们添加更多的中断源,很现实的一个例子。

目前来看,ps添加多个中断源,需要增加一个mask,通过判定加了mask后的中断号,来判定是哪一个外设产生的中断。

这个实验添加了一个定时器中断源,在上一个实验的基础上使用了定时器中断,每三次定时器中断会让leds的值加1,控制定时器中断时间的,是TMRInst这个变量,每达到设置的0xF8000000这个值,触发一次中断

效果如下:

实验2D总结

学习了怎么添加多个中断源

学习了xilinx中的定时器的使用