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.

实例:通过EDMA和中断方式使用UART端口

鉴于最近有很多同事在使用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任务。

UART_test_ver1.0.zip
  • 真是及时雨啊!

    正在看UART ,就是DMA 中断不能响应!看看这个方法在6657 灵不灵!

  • 有没有 6657 的程序啊? 这个移植过去 好多错误,编译不过啊!

  • 您好,

    对您这个例程研究了很久,有一些问题想请教您。

    一、为什么我加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手册7.9节,使用EVENT Combiner

  • 您好:

    我翻看了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

  • Event combiner寄存器配置可以参考C66x corepac user guide,关于Event combiner的配置可以参考如下STK 例程GPIO project的GPIO_main.c对应函数GPIO_Interrupts_init.

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

  • 非常感谢您的帮助!