OpenEdv-开源电子网

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

发现原子哥串口初始化波特率计算太复杂

[复制链接]

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
发表于 2014-7-12 09:44:53 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]void uart_init(u32 pclk2,u32 bound) { float temp; u16 mantissa; u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV mantissa=temp; //得到整数部分 fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4; mantissa+=fraction; RCC->APB2ENR|=1<<2; //使能PORTA口时钟 RCC->APB2ENR|=1<<14; //使能串口时钟 GPIOA->CRH&=0XFFFFF00F;//IO状态设置 GPIOA->CRH|=0X000008B0;//IO状态设置 RCC->APB2RSTR|=1<<14; //复位串口1 RCC->APB2RSTR&=~(1<<14);//停止复位 //波特率设置 USART1->BRR=mantissa; // 波特率设置 USART1->CR1|=0X200C; //1位停止,无校验位. #if EN_USART1_RX //如果使能了接收 //使能接收中断 USART1->CR1|=1<<8; //PE中断使能 USART1->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级 #endif } [/mw_shl_code]
个人认为,在计算波特率的时候,没必要去计算中间变量,开始看计算波特率的部分一时还没弄明白是为什么,理解了之后发现太复杂了。

[mw_shl_code=c,true] [mw_shl_code=c,true]
[mw_shl_code=c,true] temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV mantissa=temp; //得到整数部分 fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4; mantissa+=fraction; [/mw_shl_code]


[/mw_shl_code] [/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] 和下面的式子相比较,首先计算 temp的时候除以 16是没必要的,因为在下面小数部分和整数部分都乘了 16再作和运算
其次也没必要将整数部分和小数部分分开来运算了,所以上面的式子还是等价于   
mantissa (pclk2*1000000)/bound;    //得到USARTDIV


纯属个人见解,如有错误之处,烦请更正,谢谢。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-12 13:34:53 | 显示全部楼层
验证一下就知道正确与否了,这种细究的精神很值得学习呀
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-7-13 00:06:59 | 显示全部楼层
确实有点麻烦,其实是可以很大简化的,我也是被ST牵着鼻子走,根据他们的计算方式,在设计程序。
实际上,是ST饶了个圈子。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
 楼主| 发表于 2014-7-13 20:33:01 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
是的,开始不明白为什么这么做,看数据手册才明白
回复 支持 反对

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
 楼主| 发表于 2014-7-13 20:33:54 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
是因为刚开始不明白为什么这么写,所以才细看了下~
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-14 08:27:38 | 显示全部楼层
回复【5楼】灰色世界001:
---------------------------------
恩,一直我都是用库函数的,管它怎么算的,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-3-11
在线时间
11 小时
发表于 2016-11-16 20:00:00 | 显示全部楼层
GPIOA->CRH&=0XFFFFF00F;//IO状态设置
GPIOA->CRH|=0X000008B0;//IO状态设置
请问这个是怎么来的,菜鸟刚学STM32,还有PD2的IO状态设置是什么?
回复 支持 反对

使用道具 举报

11

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
353
金钱
353
注册时间
2019-4-22
在线时间
83 小时
发表于 2019-9-18 17:31:05 | 显示全部楼层
黄靖淞 发表于 2016-11-16 20:00
GPIOA->CRH&=0XFFFFF00F;//IO状态设置
GPIOA->CRH|=0X000008B0;//IO状态设置
请问这个是怎么来的,菜鸟刚 ...

PA9和PA10都在CRH寄存器中,且是第二位和第三位,先清零再置1使能
回复 支持 反对

使用道具 举报

11

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2016-1-5
在线时间
208 小时
发表于 2020-4-25 16:15:26 | 显示全部楼层
对的 验证无误
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 02:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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