TI中文支持网
TI专业的中文技术问题搜集分享网站

关于串口中断

在TI的库里面关于TMS570LS0432的串口接收中断,在HALCOGEN的SCI/LIN Global配置接收中断,在初始化时调用sciEnableNotification(UART,  SCI_RX_INT );就行了吗?

发生接收中断时,程序调到哪里?有两个函数:第一个能够查询也能够中断接收?中断接收岂不是需要调用了?

第二个 SVE是中断标志,SVE==11是接收中断?在SVE==11下添加自己的中断函数后,当用HALCOGEN重新生成代码,岂不是要把自己的中断函数冲没了?

1

void sciReceive(sciBASE_t *sci, uint32 length, uint8 * data)
{
/* USER CODE BEGIN (17) */
/* USER CODE END */

    if ((sci->SETINT & (uint32)SCI_RX_INT) == (uint32)SCI_RX_INT)
    {
        /* we are in interrupt mode */
               /* clear error flags */
        sci->FLR = ((uint32) SCI_FE_INT | (uint32) SCI_OE_INT | (uint32) SCI_PE_INT);

        g_sciTransfer_t.rx_length = length;
  /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
        g_sciTransfer_t.rx_data   = data;
    }
    else
    {       /*SAFETYMCUSW 30 S MR:12.2,12.3 <APPROVED> "Used for data count in Transmit/Receive polling and Interrupt mode" */
        while (length > 0U)
        {
         /*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found – Hardware Status check for execution sequence" */
            while ((sci->FLR & (uint32)SCI_RX_INT) == 0U)            {            } /* Wait */
   /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
            *data = (uint8)(sci->RD & 0x000000FFU);
   /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
   /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer operation required." */       
            data++;
   length–;
        }
    }

 

 

2void linHighLevelInterrupt(void)
{
    uint32 vec = scilinREG->INTVECT0;
 uint8 byte;
/* USER CODE BEGIN (29) */

/* USER CODE END */

    switch (vec)
    {
    case 1U:
        sciNotification(scilinREG, (uint32)SCI_WAKE_INT);
        break;
    case 3U:
        sciNotification(scilinREG, (uint32)SCI_PE_INT);
        break;
    case 6U:
        sciNotification(scilinREG, (uint32)SCI_FE_INT);
        break;
    case 7U:
        sciNotification(scilinREG, (uint32)SCI_BREAK_INT);
        break;
    case 9U:
        sciNotification(scilinREG, (uint32)SCI_OE_INT);
        break;

    case 11U:
        /* receive */
   byte = (uint8)(scilinREG->RD & 0x000000FFU);

            if (g_sciTransfer_t.rx_length > 0U)
            {
                *g_sciTransfer_t.rx_data = byte;
                /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer increment needed" */
                g_sciTransfer_t.rx_data++;
                g_sciTransfer_t.rx_length–;
                if (g_sciTransfer_t.rx_length == 0U)
                {
                    sciNotification(scilinREG, (uint32)SCI_RX_INT);
                }
            }
        break;

    case 12U:
        /* transmit */
  /*SAFETYMCUSW 30 S MR:12.2,12.3 <APPROVED> "Used for data count in Transmit/Receive polling and Interrupt mode" */
  –g_sciTransfer_t.tx_length;
        if ((g_sciTransfer_t.tx_length) > 0U)
        {
   uint8 txdata = *g_sciTransfer_t.tx_data;
            scilinREG->TD = (uint32)(txdata);
            /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer increment needed" */
            g_sciTransfer_t.tx_data++;
        }
        else
        {
            scilinREG->CLEARINT = SCI_TX_INT;
            sciNotification(scilinREG, (uint32)SCI_TX_INT);
        }
        break;

    default:
        /* phantom interrupt, clear flags and return */
        scilinREG->FLR = ~scilinREG->SETINTLVL & 0x07000303U;
        break;
    }
/* USER CODE BEGIN (30) */

Jay:

你好。

1. 配置中断,你需要在VIM Channel那些页标签中进行配置对应中断。在主程序中还需要找开全局中断。

2. SCI的中断函数在notification.c的sciNotification函数中。判断是哪个中断向量的,在你贴出的代码中调用sciNotification里有参数传递,可以用来判断中断源。

Lonny:

回复 Jay:

你好 谢谢回复,我找到问题了:把中断指向函数void linHighLevelInterrupt(void)中的case 11(接收中断)的所有语句都去掉,只保留中断函数sciNotification(scilinREG, (uint32)SCI_RX_INT);这样接收中断就没问题,由于case11下的程序都是HALCOGEN生成的  这样岂不是要生成一次程序就要手动屏蔽一次那些语句?

 case 11U:        /* receive *///   byte = (uint8)(scilinREG->RD & 0x000000FFU);

//            if (g_sciTransfer_t.rx_length > 0U)//            {//                *g_sciTransfer_t.rx_data = byte;                /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer increment needed" *///                g_sciTransfer_t.rx_data++; //               g_sciTransfer_t.rx_length–;//                if (g_sciTransfer_t.rx_length == 0U) //               {                    sciNotification(scilinREG, (uint32)SCI_RX_INT); //               }//            }        break;

Jay:

回复 Lonny:

Halcogen生成的代码在使用中断时,加入了一个软件的Buffer,由g_sciTransfer_t这个结构体来维护。

g_sciTransfer_t【1】用于LINSCI模块的发送和接收Buffer。

所以,在初始化完成后,需要初始化g_sciTransfer_t【1】的发送和接收Buffer的相关设置(字节长度和Buffer指针)。

如果需要每接收一个字节就调用sciNotification函数,那么可以按下面进行实始化

g_sciTransfer_t.rx_length = 1;

g_sciTransfer_t.rx_data = (自定义的接收Buffer起始地址);

在调的sciNotification函数中,最后再次按上面的代码进行初始化,以准备下一次接收。

这接的话,你就可以直接使用Halcogen生成的代码了。

Lonny:

回复 Jay:

3Q,那原本的程序是表示length个字节调用sciNotification();那这样是不是必须是LENGTH的整数倍才能保证接收中断的接收数据不丢失,否则最后一次接收不到length个字节,这样最后一次的接收始终调用不了sciNotification();????

赞(0)
未经允许不得转载:TI中文支持网 » 关于串口中断
分享到: 更多 (0)