打印
[STM32F1]

F103C8T6 灵异现象

[复制链接]
1569|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcbot|  楼主 | 2017-10-29 19:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mcbot 于 2017-10-30 14:22 编辑

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

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

USART_InitTypeDef USART_InitStructure;
/* USART Format configuration ------------------------------------------------------*/
        
USART_InitStructure.USART_BaudRate = 1200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;                                                               
USART_InitStructure.USART_Parity = USART_Parity_No;                                                                                
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                        
USART_Init(USART1, &USART_InitStructure);
        
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                                                                                                                         
        /* Enable the USARTy */
USART_Cmd(USART1, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC);               
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        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 编辑

这是我的串口接收中断,收到数据立刻发出来,不做任何处理。
void USART1_Interrupt_Handler_HOOK(void)
{
                int8_t rev_data;
         
                if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
    {   
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                                rev_data= USART_ReceiveData(USART1);
                                USART1_REC_BUFF[USART1_REC_COUNT]=rev_data;
                                USART1_REC_COUNT++;
                                UART_PutChar(USART1, rev_data);
   }
}

使用特权

评论回复
地板
xyz549040622| | 2017-10-29 19:50 | 只看该作者
我想问,你主频设置的多少?

使用特权

评论回复
5
戈卫东| | 2017-10-29 20:25 | 只看该作者
可能是波特率误差太大

使用特权

评论回复
6
junpeng324| | 2017-10-29 21:09 | 只看该作者
波特率设置底层代码修改过?

使用特权

评论回复
7
mcbot|  楼主 | 2017-10-30 09:14 | 只看该作者
xyz549040622 发表于 2017-10-29 19:50
我想问,你主频设置的多少?

主频72MHZ

使用特权

评论回复
8
mcbot|  楼主 | 2017-10-30 09:15 | 只看该作者
戈卫东 发表于 2017-10-29 20:25
可能是波特率误差太大

问题是,波特率从1200bps-----115200bps,都是这种现象
一位停止位,一定会丢数
1.5或者2位停止位,就一定不会丢数

使用特权

评论回复
9
mcbot|  楼主 | 2017-10-30 09:15 | 只看该作者
junpeng324 发表于 2017-10-29 21:09
波特率设置底层代码修改过?

底层代码都是用的FWLIB3.50的库,没有修改过。

使用特权

评论回复
10
戈卫东| | 2017-10-30 10:43 | 只看该作者
另外的可能是接收处理时间太长,你处理完已经两个字节收到了,冲掉一个导致丢数据

使用特权

评论回复
11
mcbot|  楼主 | 2017-10-30 12:06 | 只看该作者
戈卫东 发表于 2017-10-30 10:43
另外的可能是接收处理时间太长,你处理完已经两个字节收到了,冲掉一个导致丢数据 ...

如果是接收时间太长的话,是否会和波特率有关?
波特率降低,就应该可以避免这个问题的。

使用特权

评论回复
12
huarana| | 2017-10-30 12:30 | 只看该作者
跑个例程看看就知道了,估计是代码有问题

使用特权

评论回复
13
mcbot|  楼主 | 2017-10-30 13:23 | 只看该作者
huarana 发表于 2017-10-30 12:30
跑个例程看看就知道了,估计是代码有问题

好的,我找个例程试一下,谢谢您了。

使用特权

评论回复
14
数码小叶| | 2017-10-30 13:26 | 只看该作者
试试字母数字随机交替发送的结果是啥。。。。

使用特权

评论回复
15
mcbot|  楼主 | 2017-10-30 13:41 | 只看该作者
本帖最后由 mcbot 于 2017-10-30 13:42 编辑

依然如此啊,间隔着发,波特率1200,还是这个问题。

错误的.png (111.63 KB )

错误的.png

正确的.png (111.83 KB )

正确的.png

使用特权

评论回复
16
ningling_21| | 2017-10-30 14:11 | 只看该作者
mcbot 发表于 2017-10-30 13:41
依然如此啊,间隔着发,波特率1200,还是这个问题。

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

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
mcbot + 3
17
mcbot|  楼主 | 2017-10-30 14:21 | 只看该作者
ningling_21 发表于 2017-10-30 14:11
发送数据不要放在接收中断里,会影响接收下个数据

大神说中了,多谢您了

确实是因为在接收中断中发送数据,所以影响了数据接收。现在屏蔽掉发送,就正常了。

使用特权

评论回复
18
Xflyan| | 2017-10-30 15:54 | 只看该作者
可以在接收中断里发送,但是不要在里面等待发送完成,冲突是在等待的过程中产生的,

使用特权

评论回复
19
teltium| | 2017-10-31 08:36 | 只看该作者
看标题进来了,ST灵异?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

255

帖子

1

粉丝