Zynq的uart中断接收与发送

2015-01-27 23:05 阅读 3,565 次 评论 0 条

Zynq Vivado SDK的开发工具中,串口收发采用BSP包中已经编写好的uartps驱动。不过在使用的时候,觉得驱动中的接收函数没有自带接收缓冲区,也需要自己手动控制缓存区。特别对于大数据发送很不方便,因为PS中的UART自带64字节的硬件缓冲区,很快就会被填满,剩余的数据发送不完,并且占用发送缓冲区,如果当前突发数据较大,又有数据需要发送,则很有可能造成数据被覆盖,而造成发送数据失败。

所以建议不使用驱动中自带的发送缓冲区,而是放一个队列,这样就不用关心缓冲区了,有数据就往队列里放,然后uart的TXEMPTY中断中判断发送队列中是否有数据,如果有数据则将数据填满发送硬件fifo,如果没有则关闭TXEMPTY。注意:发送TXEMPTY中断必须在往硬件fifo中写数,然后发送完毕后才会触发,如果硬件fifo中的数据本身是空的,开启TXEMPTY中断,也不会触发中断。

对于接收做相同的处理,将硬件触发中断后,将硬件fifo中的数据存入接收队列,便于每次处理时,能够从上次处理完的地址,继续处理。

更改后的XUartPs定义如下

typedef struct {

XUartPs_Config Config; /* Configuration data structure */

u32 InputClockHz; /* Input clock frequency */

u32 IsReady; /* Device is initialized and ready */

u32 BaudRate; /* Current baud rate */

XUartPs_Handler Handler;

void *CallBackRef; /* Callback reference for event handler */

SEQUEUE SendBuffer;

SEQUEUE ReceiveBuffer;

} XUartPs;

当然这么做,会浪费一些内容RAM空间,作为接收发送队列的存储空间,并且是在变量定义时就分布完整的。

关于中断配置的说明

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:Zynq的uart中断接收与发送 | 起点博客
分类:应用笔记 标签:, ,

发表评论


表情