OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2753|回复: 2

STM32F429 UART5收发数据异常

[复制链接]

19

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
796
金钱
796
注册时间
2013-9-29
在线时间
179 小时
发表于 2019-1-19 17:26:02 | 显示全部楼层 |阅读模式
1金钱
代码是按照USART1修改的,USART1通讯正常,但是改为UART5,图中是利用串口调试助手,将收到的70字节数据,一模一样的发送出来,但是串口调试助手收到的数据不对。
在线调试时,UART5接收的数据不对,导致发送出去的数据有误。
各位大神,帮我看看,我这里问题出在哪里,我是直接焊了两根线将UART5的RX和TX与串口工具连接。
void uart_init(u32 pclk2,u32 bound)
{           
        float temp;
        u16 mantissa;
        u16 fraction;          
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
    mantissa<<=4;
        mantissa+=fraction;

        RCC->AHB1ENR|=1<<2;           //使能PORTC口时钟
        RCC->AHB1ENR|=1<<3;           //使能PORTD口时钟
        RCC->APB1ENR|=1<<20;          //使能串口5时钟
       
        RCC->APB1RSTR |= 1<<20;        //复位串口5
        RCC->APB1RSTR &= ~(1<<20);//停止复位串口5
       
        GPIO_Set(GPIOC,PIN12,GPIO_MODE_AF,0,GPIO_SPEED_50M,GPIO_PUPD_PU);
        GPIO_Set(GPIOD,PIN2,GPIO_MODE_AF,0,GPIO_SPEED_50M,GPIO_PUPD_PU);
        GPIO_AF_Set(GPIOC,12,8);        //PC12,AF8
        GPIO_AF_Set(GPIOD,2,8);//PD2,AF8            
        //波特率设置
        UART5->BRR=mantissa;         //波特率设置         
        UART5->CR1&=~(1<<15);         //设置OVER8=0
        UART5->CR1&=~(1<<12);          //1 起始位,8 数据位,n 停止位
        UART5->CR1&=~(1<<10);          //关闭奇偶校验
        UART5->CR2&=~(1<<13);         
        UART5->CR2&=~(1<<12);          //1个停止位       
        UART5->CR1|=1<<3;          //串口发送使能
        UART5->CR1|=1<<2;          //串口接收使能
        UART5->CR1|=1<<5;            //接收缓冲区非空中断使能                   

        MY_NVIC_Init(2,0,UART5_IRQn,1);//组2,最低优先级

        UART5->CR1|=1<<13;          //串口使能
        USART_RX_STA=0;                                //清零        
}


void Usart_Send_Data(u8 *buf,u16 len)
{
        u8 t;
       
          for(t=0;t<len;t++)                        //循环发送数据
        {
                while((UART5->SR&0X40)==0);//等待发送结束                  
                UART5->DR=buf[t];
        }         
        while((UART5->SR&0X40)==0);//等待发送结束       
}


void UART5_IRQHandler(void)
{
        u8 res;       

        if(UART5->SR&(1<<5))//接收到数据
        {
                TIM3->SR&=~(1<<0);//清除中断标志位
                USART_RX_BUF[USART_RX_STA]=UART5->DR;
                TIM3->ARR = 500;        //50ms
                MY_NVIC_Init(1,0,TIM3_IRQn,1);        //抢占1,子优先级3,组2       
                TIM3->CR1|=0x01;    //使能定时器3
                USART_RX_STA++;                       

                if(USART_RX_STA==70)
                {
                        Usart_Send_Data(USART_RX_BUF,USART_RX_STA);
                        USART_RX_STA = 0;
                        UART5->SR &= ~(1<<5);
                       
                }
        }
}

1547889603(1).png

最佳答案

查看完整内容[请看2#楼]

已经找到原因了,UART5是用的PCLK1,USART1用的PCLK2,导致波特率设置错误。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
796
金钱
796
注册时间
2013-9-29
在线时间
179 小时
 楼主| 发表于 2019-1-19 17:26:03 | 显示全部楼层
正点原子 发表于 2019-1-22 02:00
八成波特率设置不对。

已经找到原因了,UART5是用的PCLK1,USART1用的PCLK2,导致波特率设置错误。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-22 02:00:59 | 显示全部楼层
八成波特率设置不对。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 04:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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