SCI 接收中断

一、创建CCS空工程(略)

二、配置HALCoGen工程

1、使能SCI1设备

2、SCI1通用配置 配置接收中断

3、配置数据格式

4、设置端口

选择SCI模式配置合适GIO模式配置IO

5、是能中断

6、File-->Generate Code 生成代码

三、修改CCS代码

1、修改HL_sys_main.c

#include "HL_sys_common.h"

/* USER CODE BEGIN (1) */
#include "HL_gio.h"
#include "HL_sci.h"
#include "stdio.h"
#include "HL_sys_core.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) */

#define UART1 sciREG1
uint8 g_SCI_RX_Var = 0;
int fputc(int ch, FILE *f)
{
    sciSendByte(UART1,ch);
  return ch;
}

/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    int i = 0;
    gioInit();
    sciInit();      /* initialize sci/sci-lin    */   /* even parity , 2 stop bits */
    sciReceive(UART1, 1, &g_SCI_RX_Var);
    _enable_IRQ_interrupt_();
     while(1)
     {
         printf("Hello! TMS570\r\n");
         gioToggleBit(gioPORTB, 6);
         for( i = 0;i<50000000;i++)
         {
         }
     }
/* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */


/* USER CODE END */

需要添加

sciReceive(UART1, 1, &g_SCI_RX_Var);

_enable_IRQ_interrupt_();

2、修改HL_notification.c

这里第一个字节做了特殊处理 ,不做处理第一个字节会是空 ,但是实际上第一个字节接受在了g_SCI_RX_Var,就是main函数的接受那里。(下面有处理掉

......
uint32 num_sci = 0;
uint8 g_SCI_RX_Data = 0;
uint8 sci_buf[10];
extern uint8 g_SCI_RX_Var;
/* USER CODE END */

#pragma WEAK(sciNotification)
void sciNotification(sciBASE_t *sci, uint32 flags)     
{
/*  enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (32) */
    static uint8 first_flag = 0;
    sciReceive(sciREG1, 1, &g_SCI_RX_Data);
    if(first_flag == 0)
    {
        first_flag =1;
        g_SCI_RX_Data = g_SCI_RX_Var;
    }
    else
    {

    }
    sci_buf[num_sci] = g_SCI_RX_Data;
    num_sci++;
/* USER CODE END */
}
......

3、调试

--------------------------------------分割线------------------------------------------------------------------------------------------

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 */
        uint32 index = (sci  == sciREG1) ? 0U : 
                       ((sci == sciREG2) ? 1U : 
                       ((sci == sciREG3) ? 2U : 3U));
        
        /* clear error flags */
        sci->FLR = ((uint32) SCI_FE_INT | (uint32) SCI_OE_INT | (uint32) SCI_PE_INT);

        g_sciTransfer_t[index].rx_length = length;
		/*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
        g_sciTransfer_t[index].rx_data   = data;
    }
    else
    {   
        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 increment needed" */
			data++;
			length--;
        }
    }
/* USER CODE BEGIN (18) */
/* USER CODE END */
}

分析了下源码  发现初始化是时候的

分下了下源码发现 初始化时候的sciReceive()函数只是给

g_sciTransfer_t[index].rx_length = length;

g_sciTransfer_t[index].rx_data = data;

做出了初始化 rx_data有了有效的地址 ,

所以初始化和中断里的rx_data有效地址是同一个参数就不会出现第一个字节的问题了

具体代码如下

HL_sys_main.c代码

#include "HL_sys_common.h"

/* USER CODE BEGIN (1) */
#include "HL_gio.h"
#include "HL_sci.h"
#include "stdio.h"
#include "HL_sys_core.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) */

#define UART1 sciREG1
uint8 g_SCI_RX_Var = 0;
int fputc(int ch, FILE *f)
{
    sciSendByte(UART1,ch);
  return ch;
}

/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    int i = 0;
    gioInit();
    sciInit();      /* initialize sci/sci-lin    */   /* even parity , 2 stop bits */
    sciReceive(UART1, 1, &g_SCI_RX_Var);  
    _enable_IRQ_interrupt_();
     while(1)
     {
         printf("Hello! TMS570\r\n");
         gioToggleBit(gioPORTB, 6);
         for( i = 0;i<50000000;i++)
         {
         }
     }
/* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */


/* USER CODE END */

HL_notification.c代码

......
uint32 num_sci = 0;
uint8 sci_buf[10];
extern uint8 g_SCI_RX_Var;
/* USER CODE END */

#pragma WEAK(sciNotification)
void sciNotification(sciBASE_t *sci, uint32 flags)     
{
/*  enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (32) */
  
    sciReceive(sciREG1, 1, &g_SCI_RX_Var);
    sci_buf[num_sci] = g_SCI_RX_Var;
    num_sci++;
/* USER CODE END */
}
......

结果就不会有第一个数据的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值