一.序列槽輸出
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”