天天看點

TMS570ls3137之序列槽使用一.序列槽輸出二.序列槽中斷接收資料

一.序列槽輸出

1)打開hcg圖形配置軟體,建立新工程後,選擇driver enable選項,選中“Enable SCI2 driver”,如下圖1所示:

TMS570ls3137之序列槽使用一.序列槽輸出二.序列槽中斷接收資料

2)在SCI2 選框中選擇“SCI/LIN port”選項,勾選TX-pin 為輸出,如下圖2所示:

TMS570ls3137之序列槽使用一.序列槽輸出二.序列槽中斷接收資料

3)以上設定完畢後即可生成代碼。

4)在sys_main.c中編寫以下代碼:

int my_printf(char *fmt,...)
{
    char *p;
    va_list ap;
    //擷取第一個實際參數的起始位址
    va_start(ap,fmt);
    //分析fmt指向的字元串
    for(p = fmt;*p;p++)
    {
        if(*p == '%')
        {
            p++;
            switch(*p)
            {
            //整形十進制數
            case 'd':
                printf("%d",va_arg(ap,int));
                、、sciSendByte(scilinREG,va_arg(ap,int));
                break;
            //字元
            case 'c':
                printf("%c",va_arg(ap,int));
                break;
            //字元串
            case 's':
                printf("%s",(char *)va_arg(ap,int));
                break;
            //浮點數
            case 'f':
                printf("%f",va_arg(ap,double));
                break;
            //%
            case '%':
                putchar('%');
                break;

            }

        }
        else{
            //putchar(*p);
            sciSendByte(scilinREG,(*p));
        }
        //sciSendByte(scilinREG,(*p));
    }
    //将ap指派為NULL
    va_end(ap);
    return 0;
}


/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    sciInit();
    int num = 0;
    //_enable_IRQ();
    while(1)
    {
        my_printf("printf 序列槽列印成功!!!");
    }
/* USER CODE END */

    return 0;
}
           

編譯生成代碼後燒錄至開發闆,波特率為預設的9600,觀察序列槽列印資訊.

注:以上為測試序列槽輸出使用,這裡有編寫好的序列槽輸出檔案,隻需修改#define putchar© sciSendByte(scilinREG,c);

序列槽寄存器位址即可使用,直接調用printf即可實作序列槽輸出。

https://download.csdn.net/download/weixin_42259397/12493360

二.序列槽中斷接收資料

1)打開HCG,在以上的配置的基礎上,點選進入VIM Channel 0-31 中勾選序列槽中斷選項,如下圖3所示:

TMS570ls3137之序列槽使用一.序列槽輸出二.序列槽中斷接收資料

2)然後進入序列槽配置的界面SCI2 ,使能RX中斷,配置收發資料格式,如下圖4,5所示:

TMS570ls3137之序列槽使用一.序列槽輸出二.序列槽中斷接收資料
TMS570ls3137之序列槽使用一.序列槽輸出二.序列槽中斷接收資料

3)完成以上配置後生成代碼後,在sys_main.c中代碼編寫如下:

#include "sys_common.h"

/* USER CODE BEGIN (1) */
#include "sci.h"
/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */

/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
	sciInit();
	_enable_IRQ();
	while(1);
/* USER CODE END */
    return 0;
}
           

在中斷處理的函數中,注釋掉其他代碼,隻保留接收中斷進入函數:

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

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

在回調函數“void sciNotification(sciBASE_t *sci,uint32_t flags)”中增加以下代碼:

void sciNotification(sciBASE_t *sci,uint32_t flags)
{
	unsigned char byte = sci->RD;
	sciSendByte(sci,byte);
}
           

以上完成後,編譯後燒錄開發闆,打開序列槽調試助手,通過序列槽工具發送hello,然後序列槽列印出“hello”