[STM32F1] F103C8T6 灵异现象

[复制链接]
 楼主| mcbot 发表于 2017-10-29 19:00 | 显示全部楼层 |阅读模式
本帖最后由 mcbot 于 2017-10-30 14:22 编辑

一、单片机型号 STM32F103C8T6
二、串口初始化如下
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
  2.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
  3.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  4.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  5.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  6.   /* Configure USART1 RX as input floating */
  7.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  10.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  11. USART_InitTypeDef USART_InitStructure;
  12. /* USART Format configuration ------------------------------------------------------*/
  13.         
  14. USART_InitStructure.USART_BaudRate = 1200;
  15. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  16. USART_InitStructure.USART_StopBits = USART_StopBits_1;                                                               
  17. USART_InitStructure.USART_Parity = USART_Parity_No;                                                                                
  18. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        
  19. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                        
  20. USART_Init(USART1, &USART_InitStructure);
  21.         
  22. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                                                                                                                         
  23.         /* Enable the USARTy */
  24. USART_Cmd(USART1, ENABLE);
  25. USART_ClearFlag(USART1, USART_FLAG_TC);               
  26.         NVIC_InitTypeDef NVIC_InitStructure;
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

  28.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  29.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  30.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  31.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  32.         NVIC_Init(&NVIC_InitStructure);

                                                                                 
三、问题:
设置为8N1,与电脑串口助手通信,电脑串口助手也设置成8N1,结果总是丢数,
电脑发送        1234567890abcdefghijklm
单片机收到  1234567890bcdefghijkm               

但是如果把电脑串口设置成8N1.5 或者8N2,就不会丢数。

在波特率从1200    9600    115200都是这种情况。

求大神指点,是哪里的问题?
为什么我单片机设置8N1,电脑设置成8N1.5或者8N2才能保证电脑发出的数据,单片机全部收到?如果我电脑也设置成8N1,单片机就会丢固定位置的数!没有修改过底层库文件、
中断只有一个systick10ms一次,再就是这个USART1接收中断。

系统主频72MHZ,换过一个以前用的没问题的晶振,还是同样现象,应该和晶振偏差无关。如果和晶振偏差有关,那么降低通信波特率就应该解决了


问题已经解决:接收中断中发送送数据,结果影响了数据的接收!!!


 楼主| mcbot 发表于 2017-10-29 19:10 | 显示全部楼层
丢数,总是丢第9、10、11个附近的数。没头绪
 楼主| mcbot 发表于 2017-10-29 19:12 | 显示全部楼层
本帖最后由 mcbot 于 2017-10-30 12:07 编辑

这是我的串口接收中断,收到数据立刻发出来,不做任何处理。
  1. void USART1_Interrupt_Handler_HOOK(void)
  2. {
  3.                 int8_t rev_data;
  4.          
  5.                 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  6.     {   
  7.         USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  8.                                 rev_data= USART_ReceiveData(USART1);
  9.                                 USART1_REC_BUFF[USART1_REC_COUNT]=rev_data;
  10.                                 USART1_REC_COUNT++;
  11.                                 UART_PutChar(USART1, rev_data);
  12.    }
  13. }

xyz549040622 发表于 2017-10-29 19:50 | 显示全部楼层
我想问,你主频设置的多少?
戈卫东 发表于 2017-10-29 20:25 | 显示全部楼层
可能是波特率误差太大
junpeng324 发表于 2017-10-29 21:09 | 显示全部楼层
波特率设置底层代码修改过?
 楼主| mcbot 发表于 2017-10-30 09:14 | 显示全部楼层
xyz549040622 发表于 2017-10-29 19:50
我想问,你主频设置的多少?

主频72MHZ
 楼主| mcbot 发表于 2017-10-30 09:15 | 显示全部楼层
戈卫东 发表于 2017-10-29 20:25
可能是波特率误差太大

问题是,波特率从1200bps-----115200bps,都是这种现象
一位停止位,一定会丢数
1.5或者2位停止位,就一定不会丢数
 楼主| mcbot 发表于 2017-10-30 09:15 | 显示全部楼层
junpeng324 发表于 2017-10-29 21:09
波特率设置底层代码修改过?

底层代码都是用的FWLIB3.50的库,没有修改过。
戈卫东 发表于 2017-10-30 10:43 | 显示全部楼层
另外的可能是接收处理时间太长,你处理完已经两个字节收到了,冲掉一个导致丢数据
 楼主| mcbot 发表于 2017-10-30 12:06 | 显示全部楼层
戈卫东 发表于 2017-10-30 10:43
另外的可能是接收处理时间太长,你处理完已经两个字节收到了,冲掉一个导致丢数据 ...

如果是接收时间太长的话,是否会和波特率有关?
波特率降低,就应该可以避免这个问题的。
huarana 发表于 2017-10-30 12:30 | 显示全部楼层
跑个例程看看就知道了,估计是代码有问题
 楼主| mcbot 发表于 2017-10-30 13:23 | 显示全部楼层
huarana 发表于 2017-10-30 12:30
跑个例程看看就知道了,估计是代码有问题

好的,我找个例程试一下,谢谢您了。
数码小叶 发表于 2017-10-30 13:26 | 显示全部楼层
试试字母数字随机交替发送的结果是啥。。。。
 楼主| mcbot 发表于 2017-10-30 13:41 | 显示全部楼层
本帖最后由 mcbot 于 2017-10-30 13:42 编辑

依然如此啊,间隔着发,波特率1200,还是这个问题。
错误的.png
正确的.png
ningling_21 发表于 2017-10-30 14:11 | 显示全部楼层
mcbot 发表于 2017-10-30 13:41
依然如此啊,间隔着发,波特率1200,还是这个问题。

发送数据不要放在接收中断里,会影响接收下个数据

评分

参与人数 1威望 +3 收起 理由
mcbot + 3

查看全部评分

 楼主| mcbot 发表于 2017-10-30 14:21 | 显示全部楼层
ningling_21 发表于 2017-10-30 14:11
发送数据不要放在接收中断里,会影响接收下个数据

大神说中了,多谢您了

确实是因为在接收中断中发送数据,所以影响了数据接收。现在屏蔽掉发送,就正常了。
Xflyan 发表于 2017-10-30 15:54 | 显示全部楼层
可以在接收中断里发送,但是不要在里面等待发送完成,冲突是在等待的过程中产生的,
teltium 发表于 2017-10-31 08:36 | 显示全部楼层
看标题进来了,ST灵异?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

255

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部