一.串口输出
1)打开hcg图形配置软件,建立新工程后,选择driver enable选项,选中“Enable SCI2 driver”,如下图1所示:
2)在SCI2 选框中选择“SCI/LIN port”选项,勾选TX-pin 为输出,如下图2所示:
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所示:
2)然后进入串口配置的界面SCI2 ,使能RX中断,配置收发数据格式,如下图4,5所示:
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”