串口调试

开发基于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)
{
;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值