OpenEdv-开源电子网

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

原子及各位大虾,帮忙看下

[复制链接]

6

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-3-24
在线时间
3 小时
发表于 2012-3-26 21:31:06 | 显示全部楼层 |阅读模式
void uart_init(u32 pclk2,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;   
temp=(float)(pclk2*1000000)/(bound*16);//这里乘16是什么意思啊?没弄明白
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
    mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
RCC->APB2ENR|=1<<14;  //使能串口时钟 
GPIOA->CRH&=0XFFFFF00F; 
GPIOA->CRH|=0X000008B0;//IO状态设置
 
RCC->APB2RSTR|=1<<14;   //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位     
//波特率设置
  USART1->BRR=mantissa; // 波特率设置  
USART1->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART1_RX  //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8;    //PE中断使能
USART1->CR1|=1<<5;    //接收缓冲区非空中断使能    
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级 
#endif
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-3-26 21:39:32 | 显示全部楼层
这个是对波特率的设置问题

串口的波特率比较任性话,分为整数部分,和小数部分,这样串口出错的几率大大降低了

具体的是低四位表示小数部分,所以乘以十六相当于把你设置的波特率向左移动四位,然后的到波特率的整数部分

楼主可以参考一下串口哪一张的东西就OK了
努力,前进。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-26 21:42:15 | 显示全部楼层
看<<STM32参考手册>>串口一章的BRR寄存器设置那一部分.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-26 22:57:41 | 显示全部楼层
感觉参官方的考手册上把那个寄存器分成整数部分和小数部分意义不大,貌似只是想说明误差的问题

我在代码里不作区分直接把波对率寄存器的值当一个整体用了,没发现问题,只不过公式变一下形就可以了。

具体的可以看这里:http://www.openedv.com/posts/list/3210.htm (15楼)

https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-27 01:16:15 | 显示全部楼层
当整体用也是一样的效果.ST确实这里有忽悠的成分.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2012-3-27 02:09:08 | 显示全部楼层
不是忽悠的,首先从硬件上,的确是前12位和后4位有区别的。
软件上,在开启8分频采样的时候, BRR的第4位是置零的。
ST把两个不同功能的信号,映射到同一个寄存器里,方便软件编写,反而变成忽悠了。。
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-27 09:07:25 | 显示全部楼层
之前有一网友和我讨论过,ST这里的波特率发生器是玩了一个数字游戏.
ST提供的波特率公式:波特率 = fPLCKx /(16*USARTDIV)
但若视USARTDIV为整数,波特率公式就成了:波特率 = fPLCKx /USARTDIV
按照第2个公式,它就是一个整数波特率发生器,把它除16变成小数再在公式里乘16,其实是玩了一个数字游戏,是骗人的。

所以,我们可以把波特率计算公式修改为如下:
USART1->BRR==pclk2*1000000/bound;
如果希望最后能四舍五入就改成:
USART1->BRR==(pclk2*1000000+(bound/2))/bound;
这公式得出的结果和我们现在用的计算结果基本是一样的,最多相差1.

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-3-24
在线时间
3 小时
 楼主| 发表于 2012-4-1 16:36:35 | 显示全部楼层
明白了,多谢!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 07:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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