使用STM8L在UART上接收数据

时间:2017-06-03 05:46:30

标签: c microcontroller stm8

我想知道,将 UART 上的数据发送到 STM8L 是否有任何关系? 我写了一个与其他人类似的代码,我认为我的硬件没问题。 我通过终端软件向PC发送一些数据到 STM8L 。 在这里,我认为我应该首先发送一些数据,它检测到数据表中描述的开始。那我该怎么办? 对不起我的语法错误。 谢谢你的帮助:))

/*********************
*
* 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

1 个答案:

答案 0 :(得分:1)

我也遇到同样的问题。我只是重新配置系统时钟就完成了。 我的方式:

/ 高速内部时钟预分频器:1 /

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);