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.

6748串口1 中断进不去,请指导



您好:

       我们用ti的tmsc6748,原先的代码用的串口2做控制一直没有问题。但是新的工程串口2倍占用了,所以换了一个串口1.也是用中断方式,参考串口2的初始化代码。但是仿真发现一直没有进入接收中断。请ti的工程师帮忙看一下问题。

       我这里代码如下,在第二段贴出来。

  • 代码贴出来:
    int main(void)
    {

    volatile unsigned int delay_11 = 0xFFF;
    volatile unsigned short j;


    // 外设使能配置
    PSCInit();

    GPIOBankPinMuxSet();
    GPIOBankPinModeInit();


    // DSP 中断初始化
    InterruptInit();



    // UART 初始化
    UART1Init();
    // UART 中断初始化
    UART1InterruptInit();
    //enable 485IC
    //GPIOPinWrite(SOC_GPIO_0_REGS, 106, GPIO_PIN_HIGH);


    while(1)
    {
    //GPIOPinWrite(SOC_GPIO_0_REGS, 106, GPIO_PIN_HIGH);
    xf_Delay_50ms();
    //UARTCharPut(SOC_UART_1_REGS, '4');

    //UARTCharPut(SOC_UART_1_REGS, '5');

    //UARTCharPut(SOC_UART_1_REGS, '6');
    //GPIOPinWrite(SOC_GPIO_0_REGS, 106, GPIO_PIN_LOW);
    //发送之后 拉低 使485IC处于接收状态
    xf_Delay_50ms();

    }

    }

    这里是使能psc代码

    static void PSCInit(void)
    {


    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON,
    PSC_MDCTL_NEXT_ENABLE);



    // 使能 UART1 模块
    // 对相应外设模块的使能也可以在 BootLoader 中完成
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);

    }

    这里是IO初始化代码

    static void GPIOBankPinMuxSet(void)
    {

    CSL_SyscfgRegsOvly sysRegs = (CSL_SyscfgRegsOvly)CSL_SYSCFG_0_REGS;


    sysRegs->PINMUX4 &=0x00FFFFFF; //GP1[0] GP1[1] uart1
    sysRegs->PINMUX4 |=0x22000000;

    sysRegs->PINMUX14 &=0xFFFFFF0F; //GP6[6] 485IC enable
    sysRegs->PINMUX14 |=0x00000080;



    }

    这里是中断初始化代码

    /****************************************************************************/
    /* */
    /* UART 初始化 */
    /* */
    /****************************************************************************/
    void UART1Init(void)
    {
    // 配置 UART1 参数
    // 波特率 115200 数据位 8 停止位 1 无校验位
    UARTConfigSetExpClk(SOC_UART_1_REGS, UART_1_FREQ, BAUD_115200,
    UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
    // 使能 UART1
    UARTEnable(SOC_UART_1_REGS);

    // 使能接收 / 发送 FIFO
    UARTFIFOEnable(SOC_UART_1_REGS);

    // 设置 FIFO 级别
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
    }

    /****************************************************************************/
    /* */
    /* UART 中断初始化 */
    /* */
    /****************************************************************************/
    void UART1InterruptInit(void)
    {
    IntRegister(C674X_MASK_INT4, UART1Isr);
    IntEventMap(C674X_MASK_INT4, SYS_INT_UART1_INT);
    IntEnable(C674X_MASK_INT4);

    // 使能中断
    unsigned int intFlags = 0;
    intFlags |= (UART_INT_LINE_STAT | \
    UART_INT_TX_EMPTY | \
    UART_INT_RXDATA_CTI);

    UARTIntEnable(SOC_UART_1_REGS, intFlags);
    }



    中断函数是这样写的,我们demo参考的创龙的代码,串口2用于交互用了好几年没有改过。

    void UART1Isr()
    {
    static unsigned int length = 0;
    static unsigned int count = 0;
    unsigned char rxData = 0;
    unsigned int int_id = 0;


    // 确定中断源
    int_id = UARTIntStatus(SOC_UART_1_REGS);

    // 清除 UART1 系统中断
    IntEventClear(SYS_INT_UART1_INT);

    if (send1_flag != 0)
    {
    send1_flag = 0;
    length = send1_len;//sizeof(txArray1);
    count = 0;
    }

    // 发送中断
    if(UART_INTID_TX_EMPTY == int_id)
    {
    if(0 < length)
    {
    // 写一个字节到 THR
    UARTCharPutNonBlocking(SOC_UART_1_REGS, txArray1[count]);
    length--;
    count++;
    }
    if(0 == length)
    {
    // 禁用发送中断
    UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
    }
    }

    // 接收中断
    if(UART_INTID_RX_DATA == int_id)
    {
    rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
    USART_RxData(rxData);
    }

    // 接收错误
    if(UART_INTID_RX_LINE_STAT == int_id)
    {
    while(UARTRxErrorGet(SOC_UART_1_REGS))
    {
    // 从 RBR 读一个字节
    UARTCharGetNonBlocking(SOC_UART_1_REGS);
    }
    }

    return;
    }
  • 回环测试可以吗?
  • 环路测了也是接不到数据,但是把tx接到pc上,用UARTCharPut(SOC_UART_1_REGS, '5');发送,pc能接到数据。
  • UART1配置应该没问题,手动置位IFR看一下能否进中断,看一下中断配置有没有问题。