OpenEdv-开源电子网

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

STM32F407的串口通信

[复制链接]

38

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2017-3-18
在线时间
85 小时
发表于 2017-3-28 10:27:49 | 显示全部楼层 |阅读模式
1金钱
我仔细看了探索者STM32F407的串口通信实验的讲解,关于波特率的计算我有一些疑问。PPT和中文参考手册中都详细讲解了波特率的计算方法,但是在实验代码中只是在库函数中设置USART_InitStructure.USART_BaudRate=115200就行了,那么是如何设置波特率寄存器的呢?

最佳答案

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

这位同学! 老师不得不说你了,你就不能跳过这个问题继续奋斗么?等你觉悟高了,再返回来解决这个问题,不行吗? /*---------------------------- USART BRR Configuration -----------------------*/ /* Configure the USART Baud Rate */ RCC_GetClocksFreq(&RCC_ClocksStatus); if ((USARTx == USART1) || (USARTx == USART6)) { apbclock = RCC_ClocksStatus.PCLK2_Frequency; } else { ap ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2017-3-11
在线时间
15 小时
发表于 2017-3-28 10:27:50 | 显示全部楼层
这位同学!
老师不得不说你了,你就不能跳过这个问题继续奋斗么?等你觉悟高了,再返回来解决这个问题,不行吗?
/*---------------------------- USART BRR Configuration -----------------------*/
  /* Configure the USART Baud Rate */
  RCC_GetClocksFreq(&RCC_ClocksStatus);

  if ((USARTx == USART1) || (USARTx == USART6))
  {
    apbclock = RCC_ClocksStatus.PCLK2_Frequency;
  }
  else
  {
    apbclock = RCC_ClocksStatus.PCLK1_Frequency;
  }
  
  /* Determine the integer part */
  if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  {
    /* Integer part computing in case Oversampling mode is 8 Samples */
    integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));   
  }
  else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  {
    /* Integer part computing in case Oversampling mode is 16 Samples */
    integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));   
  }
  tmpreg = (integerdivider / 100) << 4;

  /* Determine the fractional part */
  fractionaldivider = integerdivider - (100 * (tmpreg >> 4));

  /* Implement the fractional part in the register */
  if ((USARTx->CR1 & USART_CR1_OVER8) != 0)
  {
    tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  }
  else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */
  {
    tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  }
  
  /* Write to USART BRR register */
  USARTx->BRR = (uint16_t)tmpreg;
}

至于计算公式,想必你已经弄到手了!
回复

使用道具 举报

38

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2017-3-18
在线时间
85 小时
 楼主| 发表于 2017-3-28 10:46:02 | 显示全部楼层
视频中直接就是设置成115200,不需要计算吗?还是说我们只需设置想要的波特率就行了,单片机替我们去计算好了波特率寄存器的值??
回复

使用道具 举报

38

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2017-3-18
在线时间
85 小时
 楼主| 发表于 2017-3-28 10:48:46 | 显示全部楼层
@正点原子, @八度空间
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-3-28 11:43:41 | 显示全部楼层
luojue10330 发表于 2017-3-28 10:46
视频中直接就是设置成115200,不需要计算吗?还是说我们只需设置想要的波特率就行了,单片机替我们去计算好 ...

看下USART_Init()函数里边,官方是怎么计算的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

8

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-17
在线时间
102 小时
发表于 2017-3-28 13:31:20 | 显示全部楼层
我现在也是卡这里了
回复

使用道具 举报

8

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-17
在线时间
102 小时
发表于 2017-3-28 13:48:08 | 显示全部楼层
在usart.c中串口初始化程序有个

        USART2->BRR=mantissa;        
这个就是设置寄存器波特率的
回复

使用道具 举报

8

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-17
在线时间
102 小时
发表于 2017-3-28 13:48:56 | 显示全部楼层
luojue10330 发表于 2017-3-28 10:46
视频中直接就是设置成115200,不需要计算吗?还是说我们只需设置想要的波特率就行了,单片机替我们去计算好 ...

波特率只要和串口调试助手的一致就行
回复

使用道具 举报

38

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2017-3-18
在线时间
85 小时
 楼主| 发表于 2017-3-28 15:01:39 | 显示全部楼层
maple2 发表于 2017-3-28 14:45
这位同学!
老师不得不说你了,你就不能跳过这个问题继续奋斗么?等你觉悟高了,再返回来解决这个问题,不 ...

我也是刚刚找到这段代码了,明白了。哈哈哈哈
回复

使用道具 举报

38

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2017-3-18
在线时间
85 小时
 楼主| 发表于 2017-3-28 15:01:57 | 显示全部楼层
丶路常寻走不 发表于 2017-3-28 13:48
波特率只要和串口调试助手的一致就行

回复

使用道具 举报

38

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2017-3-18
在线时间
85 小时
 楼主| 发表于 2017-3-28 15:02:51 | 显示全部楼层
八度空间 发表于 2017-3-28 11:43
看下USART_Init()函数里边,官方是怎么计算的

找到了那段代码,确实是已经替我们计算好了。谢谢
回复

使用道具 举报

38

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2017-3-18
在线时间
85 小时
 楼主| 发表于 2017-3-28 15:05:44 | 显示全部楼层

stm32f4xx_usart.c文件里的void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)函数详细写出了过程(这个过程网上有很多资料,中文参考手册里也有),不需要我们人为地再去计算了,我们只需设置好想要的波特率就行了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 20:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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