一、创建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 */
}
......
结果就不会有第一个数据的问题