我在用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两个小节关于相关寄存器的定义来配置的。
有谁遇到相同情况,或者能够指出我的遗漏之处。