赞
踩
关注+星标公众号,及时获取更多技术分享~
作者 | 冰茶奥利奥
微信公众号 | 嵌入式电子创客街
目录
这个坑蹲了一整天,配置PS端的串口只能发数,不能收数,代码翻来覆去折腾一天,最后查到问题原来是bank1的电压选择的不对,我选择的是3.3V,其实硬件接的是1.8V。我也是无语了啊。。原来BANK电压选择这么重要。
串口和定时器中断单独使用都能使用,但是只能响应后配置的中断。分析是有什么应该全局配置的寄存器被重配置了。原来是GIC中断寄存器“只能被初始化一次,一旦初始化后映射地址不可更改,否则会出现不可预料的结果”(库函数的注释里说的)。然后把gic初始化拎出来作为全局的传递给各个初始化配置函数用就可以了。其实从xparameter.h提供的INT_ID就能看出来,所有的例程中的外设中断ID都是0,这也就意味着全局可能只有一个GIC中断源,查看ZYNQ的硬件设计也印证了这一点。
- /*
- * gic_init.c
- *
- * Created on: 2022年3月29日
- * Author: Lisboa
- */
-
- #include "gic_init.h"
-
- #define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
-
- XScuGic GobalInterruptController; /* Instance of the Interrupt Controller */
- int gic_init()
- {
- int Status;
- XScuGic_Config *IntcConfig; /* Config for interrupt controller */
- /* Initialize the interrupt controller driver */
- IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
- if (NULL == IntcConfig)
- {
- return XST_FAILURE;
- }
- Status = XScuGic_CfgInitialize(&GobalInterruptController, IntcConfig,
- IntcConfig->CpuBaseAddress);
- if (Status != XST_SUCCESS)
- {
- return XST_FAILURE;
- }
- return XST_SUCCESS;
- }
新画的板子PL能单独跑起来,但是PS根本跑不起来,进不了主程序,我猜测是DDR3的问题。
板子上买的是MT41K256的DDR3,K和之前的J系列的区别其实就是K是低压版本,1.35V,但是在电路和试用上是兼容1.5V的老版本的。所以我设计电路时候都是按照MT41J设计的,软件BlockDesign里面选择的也是DDR3,MT41J。
后来把BlockDesign中配置zynq这部分的DDR3选成了DDR3 Low Voltage,这样就能正常工作了。
我找遍了中外网站,翻了好几个Xilinx的官方文档,都没有找到关于这部分的说明,所以也不知道硬件上到底有啥区别让他不能兼容低压版的。
新板子做回来,SDK里面没法烧程序,vivado里面也没法烧程序。SDK里面报错的界面我忘记截图,但是vivado里面报错:
ERROR: [Labtools 27-3165] End of startup status: LOW。
有人说是芯片虚焊或者有短路怎么样,我就拆了Zynq重新焊接,不行。又把芯片换了一个,也不行。
后来对照原理图看发现有个电阻焊的不对。这是我的原理图。
这个SPI_D0是拉高了。这个引脚同时是MIO2,MIO2的功能如下:
这个cascaded JTAG就是JTAG的级联模式,因为我们JTAG是连接到了Ps端,所以必须选择级联模式,而不是独立模式。
比如我这次使用了log( )函数,也添加了头文件,查看该函数引用也能转到math.h头文件里面,但是编译会报错。这种情况下,需要在编译选型里添加编译指令,如图所示,在项目的设置选项里添加-lm,这种方式就和linux比较像了。
如果您觉得这篇文章帮到了你,请点赞或者留下您的评论,您的鼓励是我前进的动力~
关注博主公众号 “嵌入式电子创客街” 获取更多及时技术分享~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。