cancel
Showing results for 
Search instead for 
Did you mean: 

STM8S UART Receive problem

mostafanfs
Associate II
Posted on August 02, 2016 at 13:24

I have a weird condition in which the STM8S003 does not read the entire packet I'm sending using a PC serial port. For example I have sent 256 bytes using a PC software but at the end I have only read 214 bytes instead of 256 bytes in the controller. (RX ISR happened 214 times instead of 256 times)

What could be possibly wrong? It's said a read to the Data Register is enough to clear the flags.

I'm going crazy here because it's not supposed to be this hard getting a simple RX interrupt to work. 

#stm8s-uart
2 REPLIES 2
LRami
Associate

I wonder if you were able to solve this problem? I'm currently having the same issue with a stm8s207

Rafael Rizzon
Associate II

HI!

I do it!

//////////////////////////////////////////////////////////////////////////////////////

#include "stm8s.h"

#include "stm8s_uart1.h"

#include "stm8s_clk.h"

uint8_t RxBuffer1[5];

__IO uint8_t RxCounter1 = 0x00;

static void UART_Config(void);

void main(void)

{

 /* CLK configuration -----------------------------------------*/

 CLK_Config();

static void UART_Config(void)

{

 // Deinitializes the UART1 peripheral //

  UART1_DeInit();

  /* UART1 configuration -------------------------------------------------*/

  /* UART1 configured as follow:

     - BaudRate = 9600 baud  

     - Word Length = 8 Bits

     - One Stop Bit

     - No parity

     - Receive and transmit enabled

     - UART1 Clock disabled

   */

   

  /* Configure the UART1 */  

  UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,

        UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_RX_ENABLE);

   

  /* Enable UART1 Transmit interrupt*/

//  UART1_ITConfig(UART1_IT_TXE, ENABLE);

   

  /* Enable UART1 Receive interrupt */

  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);

  /* Enable general interrupts */

  enableInterrupts();  

}

INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) 

{

 /* Read one byte from the receive data register */

  

 uint8_t dados[1] = {0x00};

 dados[0] = UART1_ReceiveData8();

  

 if(RxCounter1 <= 3)

 {

  RxBuffer1[RxCounter1] = dados[0];

  IncrementVar_RxCounter1();

 }

 else

 {

    

  RxBuffer1[RxCounter1] = dados[0];

  RxCounter1 = 0;

 }

uint8_t GetVar_RxCounter1(void)

{

return RxCounter1;

}

uint8_t IncrementVar_RxCounter1(void)

{

return RxCounter1++;

}

static void CLK_Config(void)

{

  /* Initialization of the clock */

  /* Clock divider to HSI/1 */

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

}