STM8的UART接收中断遇到0x00出现溢出错误
本帖最后由 crystal1987 于 2020-3-17 16:52 编辑使用STM8的UART与485芯片进行通信。STM8的UART接收中断没有接收0X00数据时,通信数据正常,数据也不会丢失;当接收数据中含有0X00时,就会进入数据溢出中断,而且接收的数据也会丢失,如果发送八个数据,很多时候只能接收到6个;网上的很多方法都试过,也没效果;代码发出来,大神帮忙看看。
void ALL_GPIO_Config(void)
{
/////////////////////////////// LED //////////////////////////////////////////////
GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
LED_G_OFF;LED_R_OFF;LED_Y_OFF;
/////////////////////////////// UART //////////////////////////////////////////////
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); //RS485接收转换使能
GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_IT);
}
void UART1_Config(void)
{
CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);
//初始化UART中的所有寄存器
UART1_DeInit();
//UART的参数初始化
UART1_Init(9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_TXE,DISABLE);//关闭串口发送中断
UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE);//打开串口接收中断
//使能UART
UART1_Cmd(ENABLE);
//中断使能
enableInterrupts();
}
/************************************************************************************************
** @function UART1_RX_IRQHandler
** @author
** @version V1.0
** @date 接收中断
************************************************************************************************/
unsigned char IT_States= {0};
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
unsigned char kk = 0;
unsigned charstatus=UART1->SR;
if(UART1_GetFlagStatus(UART1_FLAG_OR) == SET)//stm8 uart?生溢出??的原因
{
UART1->SR &= 0xDF;
UART1_ClearFlag(UART1_FLAG_OR); //清除ORE
kk = UART1_ReceiveData8();
LED_G_ON;
}
elseif(UART1_GetFlagStatus(UART1_FLAG_RXNE) != RESET) //查看UART1中?是否?生
{
// TIM2_SetCounter(0);
// TIM2_Cmd(ENABLE);
LED_R_ON_OFF;
USART1_RECEIVE_BUFF = UART1_ReceiveData8();
rec_len++;
if(rec_len>=100)rec_len = 0;
UART1_ClearITPendingBit(UART1_IT_RXNE); //清除UART1挂起?志
}
}
/************************************************************************************************
** @function UART1_TX_IRQHandler
** @author
** @version V1.0
** @date 发送中断
************************************************************************************************/
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
{
if( (RESET != UART1_SR_TC) && (RESET != UART1_CR2_TCIEN) ) //if(UART1_SR & 0x80)//
{
if(uart_len != 0)
{
UART1_SendData8(*uart_buf);
uart_buf++;
uart_len--;
}
else
{
UART1_ITConfig(UART1_IT_TXE, DISABLE);//close send interrupt
RX485;
}
}
}
补充一下:用示波器测量通信信号,进入STM8之前的信号都是正常的(没有缺少数据的信号),但STM8收到的数据出错时,就进入数据溢出中断;也不是每次带0x00就进入溢出中断,偶尔也能收到完整的数据帧(带0x00)。 补充一下:目前的问题,不知道是软件还是硬件问题(软件的可能性大),借了一块开发板和例程测试,也存在同样的问题。难道是STM8单片机在这种情况下,对数据00敏感??? 可能是发送端漏了00,
不少人把数据当作字符串输出处理,字符串中0x0 会被认为是字符串结束,不发送。
xch 发表于 2020-3-18 19:02
可能是发送端漏了00,
不少人把数据当作字符串输出处理,字符串中0x0 会被认为是字符串结束,不发送。
谢谢,回复。用示波器监测到发送的00数据,应该不是这个问题。 问题解决。说一下解决方法,便于以后程序设计大家参考。 将通信IO口初始化删除,也就是UART通信的IO口不用初始化,使用系统默认的。
如下:
void ALL_GPIO_Config(void)
{
/////////////////////////////// LED //////////////////////////////////////////////
GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
LED_G_OFF;LED_R_OFF;LED_Y_OFF;
/////////////////////////////// UART //////////////////////////////////////////////
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); //RS485接收转换使能
// GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
// GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_IT);
}
本帖最后由 crystal1987 于 2020-3-18 19:36 编辑
学习了
页:
[1]