先把问题列出来,然后贴代码。
1、从PC机向STM8L152C6发送字符串:123456789abcdefgh(仅仅是举例)
2、STM8L接收到字符后,逐一返回PC机。
3、现象:收到的字符串:123456789ac...h 少了b,或者少了10位以后的某一位。如此循环。
4、PC机定时发送字符串给STM8L。STM8L接收一定时间后,大约是一两百个字符后,串口无反应,并且不再可以通信。
5、暂停ST-link。再打开,单片机发送初始化的一串数据。(是不是说明单片机复位?)
已经排除:
1、PC机和串口线硬件。
2、内部时钟切换了外部晶振,扔存在。
3、不管接收,连续循环发送字符,字符串无问题。
4、收到的字符,不发送出来,直接存到数组,仍是接收不完全。
5、禁止中断,查询方式接收,一样效果。
main()
{
CLK_HSEConfig(CLK_HSE_ON);
CLK_SYSCLKSourceSwitchCmd(ENABLE);
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSE);
usart_init();
}
void usart_init(void)
{
//set tx as output
GPIO_Init(GPIOC,GPIO_Pin_3,GPIO_Mode_Out_PP_High_Fast);
//set rx as input.
GPIO_Init(GPIOC,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT);
USART_DeInit(USART1);
USART_Init(USART1, 9600, USART_WordLength_8b, USART_StopBits_1,\
USART_Parity_No,USART_Mode_Rx|USART_Mode_Tx);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_ERR, ENABLE);
USART_Cmd(USART1, ENABLE);
enableInterrupts();
printf("Hello world!");
}
INTERRUPT_HANDLER(USART1_RX_IRQHandler,28)
{
unsigned char t=0;
if(USART_GetFlagStatus(USART1, USART_IT_RXNE)!=RESET)
{
t=USART_ReceiveData8(USART1);
putchar(t);
}
return; |