搜索
bottom↓
回复: 14

我的stm32f100串口接收正常,发送有固定的错误,什么原因?

[复制链接]

出200入0汤圆

发表于 2017-3-20 15:03:12 | 显示全部楼层 |阅读模式
本帖最后由 zjr0411 于 2017-3-20 16:36 编辑

之前用的f103,串口正常使用,一直非常稳定,从来没发现有问题

由于用的外设很少,就用了f100c8这个芯片,但是串口却不能正常使用,

表现为接收正常,发送出来电脑接收的不正常,比如
发送十进制的:0123456789    //Uart1PutString("0123456789\r\n");
接收到的数字用十六进制显示为:30 B1 B2 33 B4 35 36 B7 B8 39 8D 0A

错误一直都是固定这几个错误,如果f100一直发0x01(此处描述错误,应该是发送字符1,也就是0x31,谢谢楼下指正),那电脑接收到的一直都是0xb1

串口初始化程序如下:

void USART1_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
        
        /* config USART1 clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        
        /* USART1 GPIO config */
        /* Configure USART1 Tx (PA.09) as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);   
        /* Configure USART1 Rx (PA.10) as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        /* USART1 mode config */
        USART_InitStructure.USART_BaudRate = UART_BPS;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_Even ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
        
//        RCC->APB2RSTR|=1<<14;   //¸´Î»´®¿Ú1
//        RCC->APB2RSTR&=~(1<<14);//Í£Ö¹¸´Î»
        
          NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//BSP_INT_ID_USART1;USART1_IRQHandler
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);
        
        USART_Cmd(USART1, ENABLE);

        /* CPUµÄСȱÏÝ£º´®¿ÚÅäÖúã¬Èç¹ûÖ±½ÓSend£¬ÔòµÚ1¸ö×Ö½Ú·¢ËͲ»³öÈ¥
                ÈçÏÂÓï¾ä½â¾öµÚ1¸ö×Ö½ÚÎÞ·¨ÕýÈ··¢ËͳöÈ¥µÄÎÊÌâ */
        USART_ClearFlag(USART1, USART_FLAG_TC);     /* Çå·¢ËÍÍê³É±êÖ¾£¬Transmission Complete flag */

}


现在该往哪里想办法解决这个问题?谁知道解决办法的请告知,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入57汤圆

发表于 2017-3-20 15:21:07 | 显示全部楼层
没看程序,可能原因:
1. 波特率有偏差
2. 停止位太短
3. 两边校验不一致

出200入0汤圆

 楼主| 发表于 2017-3-20 15:41:35 | 显示全部楼层
leafstamen 发表于 2017-3-20 15:21
没看程序,可能原因:
1. 波特率有偏差
2. 停止位太短

上下位机都是2400波特率
用的硬件串口,就配置位1位停止位,我无法干涉长短
两边都是偶检验

谢谢

出200入0汤圆

 楼主| 发表于 2017-3-20 15:48:40 | 显示全部楼层
leafstamen 发表于 2017-3-20 15:21
没看程序,可能原因:
1. 波特率有偏差
2. 停止位太短

另外,f100接收电脑的数据是正常的,用在线调试,运行到这了看数据是对的

出0入0汤圆

发表于 2017-3-20 15:59:26 | 显示全部楼层
串口发送0xAA,直接使用示波器/逻辑分析仪查看波形,看看信号的波特率是多少。
推测你的原因可能是使用的晶振和你SystemInit中配置的不匹配,导致PLL之后core的频率并不是72M。
还有一种简单的方式,直接使用systick定时1ms,观察中断触发频率是不是1ms,就可以判断core是不是72M。

出200入0汤圆

 楼主| 发表于 2017-3-20 16:13:19 | 显示全部楼层
wzd5230 发表于 2017-3-20 15:59
串口发送0xAA,直接使用示波器/逻辑分析仪查看波形,看看信号的波特率是多少。
推测你的原因可能是使用的晶 ...

用的是f100的芯片,24Mhz,另外别忘记了,单片机接收是正常的,这个是我没有去考虑时钟的原因

出0入93汤圆

发表于 2017-3-20 16:26:11 | 显示全部楼层
你发字符1(HEX:0x31)收到0xB1还可以算是波特率有偏差。
但是你发0x01还能收到0xB1只能说出现灵异事件了。

上逻辑分析仪吧,我表示根本不相信你说的。

出200入0汤圆

 楼主| 发表于 2017-3-20 16:39:01 | 显示全部楼层
takashiki 发表于 2017-3-20 16:26
你发字符1(HEX:0x31)收到0xB1还可以算是波特率有偏差。
但是你发0x01还能收到0xB1只能说出现灵异事件了 ...

这个地方确实描述错误,是字符1,0x31

波特率有偏差会出现发送字符:0123456789收到十六进制的:30 B1 B2 33 B4 35 36 B7 B8 39吗
并且接收还是正常的。

如果是的话,怎么处理或者说怎么确认是波特率偏差?

出0入93汤圆

发表于 2017-3-20 16:51:31 | 显示全部楼层
zjr0411 发表于 2017-3-20 16:39
这个地方确实描述错误,是字符1,0x31

波特率有偏差会出现发送字符:0123456789收到十六进制的:30 B1 B ...

是的,有可能出现。
你的下位机速率稍微高过上位机的速率,而且上位机容错能力比较弱的话,就会出现这种情况。比如上位机容忍±3%的误差,下位机容忍±5%的误差,那么误差在4%的情况下,上位机就可能出错而下位机却能保持正常。

比如你发的字符1,十六进制为0x31,二进制码为: 0011 0001,于是UART发送出去:0(起始位) 1000 1100 1(校验位) 1(停止位),上位机采样每个都有点偏差稍微慢了点,结果采到 0(起始位) 1000 110(这里最后位丢了) 1(校验位) 1(停止位),还差1位,如果你的字符发送有间隔的话,那么会把空闲的电平采集进来当做停止位,于是得到:0 1000 110 1 1 1,转换正常的十六进制为:0xB1,校验错误

出200入0汤圆

 楼主| 发表于 2017-3-20 16:59:43 | 显示全部楼层
takashiki 发表于 2017-3-20 16:51
是的,有可能出现。
你的下位机速率稍微高过上位机的速率,而且上位机容错能力比较弱的话,就会出现这种 ...

那这样的话,如何解决呢,用的是外部8M晶振,初始化时钟用的库函数

出0入93汤圆

发表于 2017-3-20 17:07:26 | 显示全部楼层
takashiki 发表于 2017-3-20 16:51
是的,有可能出现。
你的下位机速率稍微高过上位机的速率,而且上位机容错能力比较弱的话,就会出现这种 ...


好人做到底,再看看你的数值的规律,校验位为0的都是正确的,校验位为1的都把最高位丢失了采到了校验位当最高位了,而且一个字节发送完成后至少有1bit的空闲。
字符         HEX        UART 发送顺序     UART 接收顺序(最高位丢失,补充一位停止位)         接收到的数据
0           30          0 0000 1100 0 1                  0 0000 110 0 1 1                                            30
1           31          0 1000 1100 1 1                  0 1000 110 1 1 1                                            B1
2           32          0 0100 1100 1 1                  0 0100 110 1 1 1                                            B2
3           33          0 1100 1100 0 1                  0 1100 110 0 1 1                                            33
4           34          0 0010 1100 1 1                  0 0010 110 1 1 1                                            B4
5           35          0 1010 1100 0 1                  0 1010 110 0 1 1                                            35
...

猜测可能是你的外部8M失效自动切换成内部的了

出200入0汤圆

 楼主| 发表于 2017-3-20 17:36:55 | 显示全部楼层
takashiki 发表于 2017-3-20 17:07
好人做到底,再看看你的数值的规律,校验位为0的都是正确的,校验位为1的都把最高位丢失了采到了校验位当 ...

照你这样看,真的是这样的规律的错误,我用示波器看osc_in基本上无波形,osc_out有大概在2v高度的地方有峰峰值为0.7v左右的波形

看来这晶振太差了?

出200入0汤圆

 楼主| 发表于 2017-3-20 18:26:43 | 显示全部楼层
用示波器观察晶振的引脚,OSC_IN基本上无波形,OSC_OUT有大约8M的波形,并且波动范围为7.937Mhz-8.065Mhz之间,

用之前能正常通信的f103板子测量也是这个波动范围,这样看来晶振好像没有问题呀,会不会有可能是串口总线配置的问题?

示波器观察串口发送如下:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入93汤圆

发表于 2017-3-20 15:03:13 | 显示全部楼层
本帖最后由 takashiki 于 2017-3-20 18:43 编辑
zjr0411 发表于 2017-3-20 18:26
用示波器观察晶振的引脚,OSC_IN基本上无波形,OSC_OUT有大约8M的波形,并且波动范围为7.937Mhz-8.065Mhz之 ...


晶振没有问题,但是发送有问题。查一查你是不是哪儿不小心搞成7位了吧。看看0x31,就没有最高位了;0xAA没有校验位了

查到了,这里有坑,ST不按规矩出牌啊。使能了校验位,就要用9位模式……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出200入0汤圆

 楼主| 发表于 2017-3-20 19:17:13 | 显示全部楼层
takashiki 发表于 2017-3-20 18:37
晶振没有问题,但是发送有问题。查一查你是不是哪儿不小心搞成7位了吧。看看0x31,就没有最高位了;0xAA ...

正是这个问题,非常感谢一直帮忙查找原因并且一直回复,非常感谢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 14:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表