我想知道,将 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;
}
答案 0 :(得分:1)
我也遇到同样的问题。我只是重新配置系统时钟就完成了。 我的方式:
/ 高速内部时钟预分频器:1 /
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);