zynq ucos hello world工程下添加uart中断接收数据

2015-10-22 19:53 阅读 1,993 次 评论 0 条

zynqucos hello world工程下,发送uart数据也是采用中断方式配合信号量控制发送,能够正常发送,并且能够正常产生uart1中断(中断号82),正常响应中断,信号量控制也正常。但是在使用ucos_uartps.c文件中UARTPS_RdByte()函数接收时,失败。表现为KAL_SemPend(handle->RxSem, 0u, 0u, &kal_err);函数一直处于等待信号量状态。

通过uart的寄存器,可以查看到uart_ps->INTR_MASK的值为0x00000001,即已经使能接收中断。uart_ps->RX_FIFO_LVL的值为0x00000001,表示接收到1byte数据即产生uart中断。uart_ps->CTRL的值为0x00000114,接收功能开启。当从外部发送数据到MicroZed板后,查看uart_ps->CHAN_STAT的值为0x000000a,表示发送与接收FIFO均为空状态,也就是外部从串口发送数据uart就没有收到数据,所以不产生中断。在以前vivado2014.2版本上裸跑的测试程序运行,串口收发均能正常。

百度一下,进行了以下shot过程

1、 在XMD下尝试通过【mrd】指令(没有括号)读取寄存器的值,通过【mwr】指令写寄存器的值;确认uart控制寄存器(CR)的值是否与配置一致;

通过mwr写入值失败。当时读取成功,从读取的值,可以发现,在UARTPS_Enable之后,并没有将cr寄存器的值更新。貌似这两个语句运行的成功率不高。

2、 将CR寄存器的值由目前的0x114,改为0x14或这0x17,如ps_init.c中定义的;如下图,zynq启动时的配置代码。

ps_init.c中uart CR寄存器配置

3、uart接收中增加timeout中断使能;

4、关闭data和instruction caches,方法通过注释掉BSP_CachesEn(),在ucosii系统中;或者注释掉UCOS_LowLevelInit(),在ucos_startup.c文件中,在ucosiii系统中,在/ucos_bsp_0/ps7_cortexa9_0/libsrc/ucos_v1_30/src/ps7/ucos_impl.c可以查看UCOS_LowLevelInit()函数内容。在ucos工程下,直接通过uart handler查看更方便,如下图。

uart在线调试时, 控制寄存器的状态

5、检查波特率生成时,Baud_rate_divider_reg0与Baud_rate_gen_reg0的值,一般Baud_rate_divider_reg0的值取15,这样接收RxD数据采样率为16倍的波特率。做过FPGA编写uart接收数据的同学比较清楚。

默认的配置为6,即采用7倍波特率的过采样频率。如下图所示配置。

ps_init.c中BDIV设置值

以上尝试均无成功。无法只能在vivado2014.2中重建microzed工程,这时发现串口不通,与vivado2015.1下现象相同,但以前vivado2014.2的工程串口能够成功。这时对别两个工程的差别,终于发现设置MIO bank没有选择bank1 IO电压,重新设置Bank1的电压为1.8V。一切功能正常。

zynq设置mio bank1电压控制

所以在uart调试时,如果发送能够正常,而接收不正常的话,可以查一下bank1的电压设置是否与正确。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:zynq ucos hello world工程下添加uart中断接收数据 | 起点博客
分类:应用笔记 标签:, , , , ,

发表评论


表情