This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
鉴于最近有很多同事在使用Keystone DSP时遇到如何使用中断或者EDMA方式访问UART端口的问题,在原有代码的基础上整理出此UART实例供大家参考。
1. 实例说明
该实例可运行于C6670或C6678 EVM板,可以直接编译后在EVM上运行,UART端口配置为FIFO模式。
UART 发送端通过中断方式发送,当发送FIFO为空时,UART将产生中断,通过CIC映射到DSP 核中断6,中断服务程序将启动发送流程。
UART接收端通过EDMA方式实现,当有接收数据到达时,UART将自动触发EDMA事件搬移接收FIFO的数据,完成后EDMA产生完成中断5通知CPU做下一步处理。
另外UART支持异常状态,UART端口出现异常时将通过CIC触发中断4,DSP可以通过重启UART等方式处理异常。
2. 实例流程
在初始化PLL和DDR3以后,首先初始化CIC映射UART和中断事件,然后初始化UART和EDMA模块,在中断处理函数里,我们将对FLAG置位,主函数里检查FLAG决定是否通过UART发送数据,通过串口线,可以在PC终端上看到UART的打印输出 HELLOWORLD。
3.用户代码需要注意的问题
在初始化时,应先初始化中断再初始化UART触发发送时间,否则可能引起UART事件被丢弃不能正常进入中断。
在中断服务函数不要写UART FIFO,同样可能引起UART事件被丢弃,UART中断函数只应对FLAG置位或发送信号量以触发UART任务。
您好,
对您这个例程研究了很久,有一些问题想请教您。
一、为什么我加log查看,断点在第一次发送字符的函数keystone_uartWrite_Busy()位置,当进入断点的时候,发现调用了两次UartTxISR();一次UartISR();单步走发现初始化完成后,先执行了上述两个函数,然后又执行了一次TxISR(),后才进入主函数的发送字符函数,为什么第一次进入TxISR()后标志位已经置1,没有执行主函数,而是由走触发中断函数了?
二、按照您的例程,我写了一个利用中断接收字符的函数,大意为,
UART 接收端通过中断方式接收,当串口线发送数据后,UART将产生接收中断149号(,您用的是148和150),通过CIC映射到DSP 核中断7,中断服务程序将启动接收流程。
问题有2个,为什么设置的是FIFO模式而且是8byte 的trigger level,每次无论从pc发几个byte的数据到dsp,总能触发中断7调用服务函数,而且此时读取 RBR的数据时不正确的,不知道什么时候读取数据合适,而且不明白这个16byte的FIFObuffer,是逐个byte读,还是触发中断后多个字节多,您用没有这样的方式试过,期待您给解答。。
您好,我是菜鸟,有个问题想请教一下,看到您写的中断向量表,就是Vector.asm中,每个中断响应函数对应一个INT,那么我最多只能挂12个中断函数吗,要是其他设备也需要中断,中断函数很多,我应该怎么设置啊
您好,我现在跟你遇到了同样的问题,也是写了一个接收中断响应函数,一模一样的问题
您现在解决这两个问题了吗?
您现在是怎么理解FIFO模式的16byte的FIFObuffe以及接收中断时的 RBR啊?
您好:
我翻看了6678 Multicore Fixed and Floating-Point Digital Signal Processor 只有145页的Table7-38有关于Event combiner 字样的内容(见下),请问如何配置,哪里还有更详细的说明?
Table7-38
Event Number Interrupt Event Description
0 EVT0 Event combiner 0 output
1 EVT1 Event combiner 1 output
2 EVT2 Event combiner 2 output
3 EVT3 Event combiner 3 output