开发基于STM8 (STM8S103F3)的串口用于日常调试。 (MCU RX调试)
1. TX
直接利用stm8现有接口。 UART1_SendData8(*str); 打开全局中断{_asm("rim\n");}即可
void Debug_printf(unsigned char *str)
{
if(FlagUartPrintfEnable)
{
while((*str)!='\0')
{
if (UART1_GetFlagStatus(UART1_FLAG_TC))
{
UART1_SendData8(*str);
str++;
}
}
}
}
2. RX
a. 配置RX中断开, UART1->CR2 |= (u8)UART1_CR2_REN;
b. 在中断向量表中添加irq18处理函数, //UART接收寄存器满 STM8
c. 实现中断处理函数 Uart1_RecvData_IRQ。
@far @interrupt void Uart1_RecvData_IRQ(void)
{
while(UART1_GetFlagStatus(UART1_FLAG_RXNE) == RESET)
; //RX buffer not empty,
RxData = UART1_ReceiveData8();
Rx_buffer[Rx_buffer_Length++] = RxData;
assert_param((Rx_buffer_Length<Rx_buffer_MAX_SIZE));
if (( RxData == 0x2E) || ( RxData == 0x0D)) // 0x0D 13 Enter ; 2E 句号 ; 0x08 backspace
{
RX_Flag = TRUE;
#if defined (CONTROL_RX_INT)
UART1->CR2 &= (u8)(~UART1_CR2_REN); /**< Clear the Receiver Disable bit */
#endif
}
UART1_ClearFlag(UART1_FLAG_RXNE);
}
d. 验证rx buffer数据, Display_Rxbuffer
void Display_Rxbuffer(void)
{
int i = 0;
if (RX_Flag)
{
Debug_printf(Rx_buffer);//Rx_buffer_Length
Debug_printf("\nRx_buffer_Length, Strlen(Rx_buffer) \n");
printByte(Strlen(Rx_buffer));
//reset rxbuffer
for (i=0; i < Rx_buffer_Length;i++ )
Rx_buffer[i]='\0';
Rx_buffer_Length = 0;
RX_Flag = FALSE;
#if defined (CONTROL_RX_INT)
UART1->CR2 |= (u8)UART1_CR2_REN; /**< Set the Receiver Enable bit */
#endif
}
}
e. 打印log调试
在接收到'Enter' key(0D) 或者'.' (2E) (ASIIC值)的时候,结束rx_buffer。
实际测试发现,无论2E有多少个,并不会退出rx_buffer中断部分,而是把所有值打印出来。
猜测是因为中断优先级比较高,会把轮询函数Display_Rxbuffer阻塞,导致不收数据的时候才会一次打印所有的数据。
添加中断处理控制部分,一旦发现2E,关闭RX中断,处理rx_buffer之后再打开RX中断。这部分依据需求看是否要开,CONTROL_RX_INT控制这部分。(说明因为中断优先级高,所有轮询函数得不到处理)
f. 添加接收命令解析部分 (TBD, 依据实际需求自行修改)
void ParserCmd(void)
{
;
}