OpenEdv-开源电子网

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

uart1 2 两个串口同时使用问题

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-4-4 13:03:46 | 显示全部楼层 |阅读模式
如题,例程中,为什么不能改 uart_init(72,9600); //串口1初始化   72改为36,改后就不能正常发送数据?
因为我想双串口发送数据,而uart2 在说明中最高只能是36,我改后uart2可以正常使用,但是uart1不能正常使用?为什么uart1不能为36?
求大神指点。

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;  //使能串口1时钟 
RCC->APB1ENR|=1<<17;  //使能串口2时钟 

GPIOA->CRH&=0XFFFFF00F; 
GPIOA->CRH|=0X000008B0;//IO状态设置 PA9 推挽输出 PA10 上拉下拉

GPIOA->CRL&=0XFFFF00FF; 
GPIOA->CRL|=0X00008B00;//IO状态设置 PA2 PA3
 
RCC->APB2RSTR|=1<<14;   //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位  
RCC->APB1RSTR|=1<<17;   //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位   
//波特率设置
  USART1->BRR=mantissa; // 波特率设置  
USART1->CR1|=0X200C;  //1位停止,无校验位.
USART2->BRR=mantissa; // 波特率设置  
USART2->CR1|=0X200C;  //1位停止,无校验位.

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

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-4-4
在线时间
0 小时
 楼主| 发表于 2013-4-4 14:21:51 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我知道啊,但是为啥不能用uart_init(36,9600); 使uart1初始化呢?这样的话就不能正常工作了,为啥?谢谢
回复 支持 1 反对 0

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-4-4
在线时间
0 小时
 楼主| 发表于 2013-4-4 13:05:27 | 显示全部楼层
求大神指点,在线苦等,QQ1332242978,各种求。。。 谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-4 13:17:51 | 显示全部楼层
因为usart1最大频率是72M,比usart2、3、4、5频率快一倍。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-4-4 17:32:53 | 显示全部楼层
回复【4楼】taopj123:
---------------------------------
你要看下时钟树了,串口1得到的频率要配多大的值才能达到9600还有其他串口也是。你看下手册56页是时钟树,比如说USB需要48MHz但它前面的分频器只有1和1.5选择。(72除以1.5分频等于48M 或者  48M除以1分频是48M)那你要保证usb正常工作的频率是48M所以时钟树PLLMUL倍频器给出的频率只能是72M或者48M     当然,你也可以修改倍频值,变大或变小。比如8M的外晶振倍频5后是40M(倍频器PLLMUL出来频率是40MHz)那你USB就别想正常工作(硬件限制没法。。。。)大哥,您都学到串口了,小弟还停在学中断。帮忙回复下我的中断的帖子    中断工作详解      看了15天的书也没学会中断,跪求指导。。。。
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-4-4 17:45:36 | 显示全部楼层
回复【4楼】taopj123:
---------------------------------
uart_init(36,9600); 是可以的,你必须保证时钟树的sysclk到这里的点的时钟是36MHz  USA RT_BRR寄存器放配置值,36M除以9600的结果比如是756.32那整数756放在USA RT_BRR的位15~4     小数32放在USA RT_BRR的位3~0   如果不能整除(比如3.141592.....)那完蛋了,好像误差百分之多少就没用了,就算收到数据也是乱码。。。。要是我说的有错请张洋,原子哥指正。。。这2位才是大牛。。。
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-4 19:03:51 | 显示全部楼层
回复【4楼】taopj123:
---------------------------------
还知道?
usart1,是uart_init(72,9600);
按你那36M配置,配出来的波特率应该是4800了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-4-4
在线时间
0 小时
 楼主| 发表于 2013-4-5 10:42:56 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我想使uart1和2都是9600,而且用一楼那样的一个子函数调用不行对吧?uart_init(36,9600);
这样的话uart2是9600,uart1是4800?

而只能分别用两个函数调用么,uart1_init(72,9600); uart2_init(36,9600);  对吗?谢谢大神回复。。。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-4-5 12:41:55 | 显示全部楼层
回复【8楼】taopj123:
---------------------------------你试下,你不去试一试怎么知道?
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-5 13:20:51 | 显示全部楼层
回复【8楼】taopj123:
---------------------------------
我们提供的uart_init是针对串口1的,你要是想实现串口2,得自己写个对应的初始化函数。
串口2的初始化函数我们也提供了,在最新的:蓝牙模块,GPS模块的 源码里面,都有usart2的初始化代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-4-4
在线时间
0 小时
 楼主| 发表于 2013-4-5 16:56:14 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
我懂了,函数Stm32_Clock_Init(9);//系统时钟设置   里面RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
已经把PCLK2=72M  CLK1=72/2M=36M固定下来了,自己不能随便改uart_init(72,9600);里面的pclk,对吧?谢谢大神指点~~~
回复 支持 反对

使用道具 举报

9

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-3-16
在线时间
0 小时
发表于 2013-7-19 21:41:47 | 显示全部楼层
回复【11楼】taopj123:
---------------------------------
应该对的  时钟在初始化决定了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-17 13:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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