OpenEdv-开源电子网

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

STM32F1串口通信,相同代码USART1正常,USART3却收到乱码

[复制链接]

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-7-21
在线时间
25 小时
发表于 2016-7-21 11:47:46 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 cheyj520 于 2016-7-21 14:51 编辑

代码就是视频里讲解的代码,如果我把它改成USART1,收发数据就是正常的(USART1是挂在APB2,USART3挂在APB1我是注意到的)
我硬件仿真了一下,发现波特率寄存器配置是错误的,
我理解的算法是36000000/16/9600=234.375,而程序里配置的整数部分9C,换成十进制是156
我用156回算波特率发现是14400,而且我串口助手改成14400后就可以收到正常数据了
时钟方面,由于我的晶振是12M的,我就把SetSysClockTo72()下面的PLL倍频从RCC_CFGR_PLLMULL9改成6了,我仿真了倍频确实是6
大概情况是这样,请大家帮忙看看怎么回事


void USART3_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);            //使能PB时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);        
//        USART_DeInit(USART3);
         
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                            //TX
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度为50MHz
        GPIO_Init(GPIOB, &GPIO_InitStructure);                             //初始化GPIOB.5
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                            //RX
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度为50MHz
        GPIO_Init(GPIOB, &GPIO_InitStructure);

         
        USART_InitStructure.USART_BaudRate=9600;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        USART_InitStructure.USART_Parity=USART_Parity_No;
        USART_InitStructure.USART_StopBits=USART_StopBits_1;
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;
        USART_Init(USART3,&USART_InitStructure);
        
        USART_Cmd(USART3,ENABLE);
        
        NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);

}

void USART3_IRQHandler(void)
{
        uint16_t temp;
        if(USART_GetITStatus(USART3,USART_IT_RXNE))
        {
                temp=USART_ReceiveData(USART3);
                USART_SendData(USART3,temp);
        }
        
}


int main(void)
{        

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        USART3_Init();

while(1);


}



1.png

最佳答案

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

貌似找到原因了, #if !defined HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #else #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */ #endif /* STM32F10X_CL */ #endif /* HSE_VALUE */ 在stm32f10x.h里,有上面这段代码,HSE_VALUE,一开始定义成了8000000,我改成12000000就没问 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-7-21
在线时间
25 小时
 楼主| 发表于 2016-7-21 11:47:47 | 显示全部楼层
貌似找到原因了,
#if !defined  HSE_VALUE
#ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
  #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
在stm32f10x.h里,有上面这段代码,HSE_VALUE,一开始定义成了8000000,我改成12000000就没问题了,但想不明白为什么之前USART1可以通信,USART3是乱码
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-8-17
在线时间
6 小时
发表于 2016-8-18 16:52:25 | 显示全部楼层
楼主我也是串口1改成串口2就不行了。我想问问你是怎么发现自己的波特率配置不正常的?我的板子是STM32F103RB
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-7-21
在线时间
25 小时
 楼主| 发表于 2016-8-22 13:36:39 | 显示全部楼层
DesirecH 发表于 2016-8-18 16:52
楼主我也是串口1改成串口2就不行了。我想问问你是怎么发现自己的波特率配置不正常的?我的板子是STM32F103R ...

硬件仿真一下,看看寄存器
回复

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-6-22
在线时间
56 小时
发表于 2016-8-25 10:24:19 | 显示全部楼层
cheyj520 发表于 2016-7-21 11:47
貌似找到原因了,
#if !defined  HSE_VALUE
#ifdef STM32F10X_CL   

你是怎样的思路来找到这部分函数的?
回复

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-6-22
在线时间
56 小时
发表于 2016-8-25 10:26:38 | 显示全部楼层
DesirecH 发表于 2016-8-18 16:52
楼主我也是串口1改成串口2就不行了。我想问问你是怎么发现自己的波特率配置不正常的?我的板子是STM32F103R ...

怎么我的USART1~3都是正常的 ,没有你们说的乱码现象,MCU是STM32F103ZE
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-4-14
在线时间
8 小时
发表于 2020-4-18 17:40:19 | 显示全部楼层
cheyj520 发表于 2016-7-21 11:47
貌似找到原因了,
#if !defined  HSE_VALUE
#ifdef STM32F10X_CL   

stm32f10x.h好像改不了吧  我试着该了一下 魔术棒的晶振频率 还是不行  现象图如下。

魔术般设置

魔术般设置
[@KY]1`HOI}X]B61@A$DB5L.png
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-4-14
在线时间
8 小时
发表于 2020-4-18 17:59:41 | 显示全部楼层
今天试着调试了下 发现个有很多可疑的地方不知道怎么解决 麻烦各位帮忙看一下
第一点: 调试到主函数中while循环里的串口发送字节函数(19行)的时候,串口发送字节函数 给USART1->DR寄存器赋值时,DR寄存器没有赋值


第二点:调试到主函数中while循环里的串口接收字节函数的时候(20行),串口接收字节函数一直会卡死在其while循环里,尽管我通过串口助手发送数据 USART1->SR寄存器中 RXNE位也没有置一,不知道为什么,调试图如下



主函数及现象如下,但如果不注释串口1接收函数的话就会卡死在串口1接收函数中:
main.png
DR寄存器.png
RDR.png
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 14:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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