Mendozo
Mendozo

Reputation: 9

Receiving data on UART with STM8L

i wanna to know that, is there any thing to do for sending data on UART to STM8L? i wrote a code that was similar to others and i think my hardware is okay. i send some data to STM8L with PC by terminal software. here i think i should first send some data that it detects the start as it was described in datasheet. now what should i do? excuse me for my syntax error. thanks for your help :)

/*********************
*
* USART
*
*********************/

#include <iostm8l.h>
#include <delay.h>
#include <HD44780.h>
/*********************
*
* Defining BITs of Registers
*
*********************/
#define UART1   0X05
#define TC      0X06    //transmittion complete
#define M           0X04    //word length
#define PS      0X01    //parity selection
#define PCEN    0X02    //parity control enable/disable
#define WAKE    0X03    //wake up method
#define TIEN    0X07    //Transmitting interrupt enable
#define TCIEN   0X06    //wherever tc become set
#define TEN     0X03    //Transmitting enable
#define REN     0X02    //Reciving enable
#define RIEN    0X05    //Recieving interrupt enable
#define PC3     0X03    //pin 3 of the PORTC
#define TXE     0X07    //transmit data register is empty
#define TX      0XF0    
#define RX      0X0F
#define RXNE    0X05
#define PE      0X00
#define FE      0X01
#define OR      0X03
#define NF      0X02
/*********************
*
* Initializing
*   1-Config Port Direction
* 2-Enabling USART clock
* 3-Buad rate on 9600 in 2MHz cpu clock
* 4-no parity
* 5-one stop bit
*
*********************/
void Initialize_USART(void)
{
    PC_DDR|=(1 << PC3);
    PC_CR1|=(1 << PC3);
    CLK_PCKENR1|=(1 << UART1);
    //program the m bit
    //program stop bit
    //USART1_CR1|=(1<<PCEN);
    //select dma
    USART1_BRR2=0X00;
    USART1_BRR1=0X0D;
    USART1_CR2|=(1<<TEN)|( 1 << REN );
    delay_us(1);
}
void Sending_Data(char *data)
{
    while(*data++)
    {
        USART1_DR=*data;
        while(!(USART1_SR & ( 1 << TXE )));
        while(!(USART1_SR & ( 1 << TC )));
        USART1_SR&=~(1<<TC);
    }
}
void Get_Data(char *return_data)
{
    while(!(USART1_SR & ( 1 << RXNE )));
    /*if(USART1_SR && ( 1 << PE ))
    {
        Clear_Lcd();
        Display_Char(" Parity Error ");
        delay_ms(250);
        return;
    }
    else if(USART1_SR && ( 1 << FE ))
    {
        Clear_Lcd();
        Display_Char(" Frame Error ");
        delay_ms(250);
        return;
    }
    else if(USART1_SR && ( 1 << OR ))
    {
        Clear_Lcd();
        Display_Char(" Overrun Error ");
        delay_ms(250);
        return;
    }
    else if(USART1_SR && ( 1 << NF ))
    {
        Clear_Lcd();
        Display_Char(" Parity Error ");
        delay_ms(250);
        return;
    }*/
    *return_data=USART1_DR;
}

STM8L15xxx Datasheet, detecting start bit in UART

Upvotes: 0

Views: 2538

Answers (1)

Ricky Nguyen Anh Giau
Ricky Nguyen Anh Giau

Reputation: 87

I also meet the same problem. I just re-configure system clock is done. My way:

/High speed internal clock prescaler: 1/

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

Upvotes: 1

Related Questions