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.

F28M35x 的M3 UART 发送中断无法进入



我在用F28M35H52C1 M3 CORE的uart1外设时,希望通过FIFO来发送数据,具体而言:每接收到4个字节后产生接收中断;当使能发送中断后,FIFO可用空间为14时产生发送中断。我的初始化程序如下:

SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB0_U1RX);
GPIOPinConfigure(GPIO_PB1_U1TX);
GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); 

UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(SYSTEM_CLOCK_SPEED), 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));      //this function has enabled the uart Rx and Tx,

                                                                                                                                                                           //and start the uart as well.


UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX1_8,UART_FIFO_RX2_8);   //UART_FIFO_TX1_8 = 0x00000000,which means that

                                                                                                                                                //Transmit interrupt at 1/8 Full.

                                                                                                                                                //UART_FIFO_RX2_8 = 0x00000008,which means that

                                                                                                                                                //Receive interrupt at 1/4 Full

UARTFIFOEnable(UART1_BASE);

IntMasterEnable();                                                                                                               // Enable processor interrupts.
IntRegister(INT_UART1, UART1IntHandler);
UARTIntEnable(UART1_BASE, UART_INT_RX );
IntEnable(INT_UART1);

按照上面的初始化后,我的接收中断是正常的,每接收4个字节后,会进入中断。然后在我会在接收中断ISR 里给一个变量赋值,在主函数里面对该变量进行查询,如果满足条件就使能发送中断,具体而言就是调用:

UARTIntEnable(UART1_BASE, UART_INT_TX );

                                                                                      图1

但是这样之后,CPU并没有进入到Uart中断函数。我通过CCS 发现UARTRIS 寄存器的TXRIS并没有置位,如图1所示,这意味着不满足发送中断。

我的疑问是:我配置UART 发送FIFO LEVEL=14,是不是意味着发送FIFO必须满14个才会产生中断吗?因为如果我第一次使能UART发送中断后,此时发送FIFO 可用空间为16,此时难道不会产生中断吗?按理说,这不合理。

F28M35 关于M3 UART的数据手册好像没有说到我遇到的情况。我主要参考F28M35xTechnical Reference Manual(2015版)的23.6.8和23.68.9两个小节关于相关寄存器的定义来配置的。

有谁遇到相同情况,或者能够指出我的遗漏之处。

  • 经过我的测试,发现这个问题有一种解决办法:先向Tx FIFO 写(16 - LEVEL)个字节后再使能uart发送中断(只需执行这个操作一次,即使中间禁能发送中断后再使能,该操作可以省略),这样就可以激活UARTRIS 寄存器的TXRIS 位了。

    这也是我目前能够实现我所期望功能的一种办法,期待其他人还有更好的办法。

  • 经过我的测试,发现这个问题有一种解决办法:先向Tx FIFO 写(16 - LEVEL)个字节后再使能uart发送中断(只需执行这个操作一次,即使中间禁能发送中断后再使能,该操作可以省略),这样就可以激活UARTRIS 寄存器的TXRIS 位了。

    这也是我目前能够实现我所期望功能的一种办法,期待其他人还有更好的办法。