OpenEdv-开源电子网

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

USART1改为USART2通讯不正常?

[复制链接]

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2011-8-10
在线时间
8 小时
发表于 2011-8-30 17:36:25 | 显示全部楼层 |阅读模式
改动UART_init如下, 不能通讯, 请原子指点! 谢谢!

 void UART_Init(INT32U pclk2,INT32U rate)
{   
 float temp;
 INT16U mantissa,fraction;
    
 temp = (float)(pclk2 * 1000000) / (rate * 16);    //得到USARTDIV
 mantissa = temp;                 //得到整数部分
 fraction = (temp - mantissa) * 16;           //得到小数部分 
    mantissa <<= 4;
 mantissa += fraction;
 RCC->APB2ENR |= 1 << 2;                      //使能PORTA口时钟  
 RCC->APB1ENR |= 1 << 17;                     //使能串口2时钟  
 GPIOA->CRL = 0x44444B44;                     //IO状态设置   
 RCC->APB1RSTR |= 1 << 17;                    //复位串口2
 RCC->APB1RSTR &= ~(1 << 17);                 //停止复位       
 //波特率设置
 USART2->BRR = mantissa;                      //波特率设置 
 USART2->CR1 |= 0x200C;                       //1位停止,无校验位.
#ifdef EN_USART2_RX                           //如果使能了接收
 //使能接收中断
 USART2->CR1 |= 1 << 8;                       //PE中断使能
 USART2->CR1 |= 1 << 5;                       //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,2,USART2_IRQChannel,2);       //组2,倒数第二优先级
#endif
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-30 19:49:24 | 显示全部楼层
软件仿真看了么?
软件仿真,对比下两者的区别,立马知道原因的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2011-8-10
在线时间
8 小时
 楼主| 发表于 2011-8-30 20:25:40 | 显示全部楼层

没仿真, 我把仿真去掉了.

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-30 23:11:11 | 显示全部楼层
回复【3楼】cqarm:
---------------------------------
软件仿真还能去掉的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2011-8-10
在线时间
8 小时
 楼主| 发表于 2011-8-31 12:52:04 | 显示全部楼层

没外接任何调试接口

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-31 14:07:52 | 显示全部楼层
回复【5楼】cqarm:
---------------------------------
软件仿真!!!!!!!!!!!!!!!!!!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2011-8-20
在线时间
3 小时
发表于 2011-8-31 22:23:15 | 显示全部楼层
回复【楼主位】cqarm:
---------------------------------
楼主,俺也在调USART2啊。不过我用电子白菜的程序可以调的通。用原子大哥的程序,我刚才只调出来传出去的了,现在USART2还接收不到数据。你是不是时钟频率没设对啊,我改的和你的程序一样的,你试试36M。看行不行。
回复 支持 反对

使用道具 举报

13

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2011-8-20
在线时间
3 小时
发表于 2011-8-31 22:53:49 | 显示全部楼层
回复【楼主位】cqarm:
---------------------------------
楼主,俺调出来啦,哈哈。把程序公开。你来看看对你有啥帮助没有。记住USART2用的是PCLK1时钟。最大频率是36M。呵呵
void uart2_init(u32 pclk1,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->APB1ENR|=1<<17;  //使能串口2时钟 
GPIOA->CRL=0X00008B00;//IO状态设置  A2输出
  
RCC->APB1RSTR|=1<<17;   //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位        
//波特率设置
  USART2->BRR=mantissa; // 波特率设置  
USART2->CR1|=0X200C;  //1位停止,无校验位.

//使能接收中断
USART2->CR1|=1<<8;    //PE中断使能
USART2->CR1|=1<<5;    //接收缓冲区非空中断使能     
MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级 

}
void USART2_IRQHandler(void)
{
//接收中断
if(USART2->SR&(1<<5) )
{
USART2->SR&=~(1<<5);
Uart2_Get_Data=(USART2->DR & (u16)0x01FF);
Uart2_Get_Flag=1;
}

//溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
if(USART2->SR & (1<<3))
{
USART2->SR&=~(1<<3); //读SR
Uart2_Get_Data=(USART2->DR & (u16)0x01FF);
}
 

回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-3-26
在线时间
0 小时
发表于 2012-3-26 16:31:24 | 显示全部楼层
回复【8楼】tangyuchen163:
回复【楼主位】cqarm:
---------------------------------
楼主,俺调出来啦,哈哈。把程序公开。你来看看对你有啥帮助没有。记住USART2用的是PCLK1时钟。最大频率是36M。呵呵
void uart2_init(u32 pclk1,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->APB1ENR|=1<<17;  //使能串口2时钟 
GPIOA->CRL=0X00008B00;//IO状态设置  A2
......
---------------------------------
我用你的程序调的usart2,为什么我的USART2进入接收中断就卡死
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-26 16:53:35 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2012-4-27 22:09:51 | 显示全部楼层
STM32F107VC这个片子中串口2在哪个端口上啊?如果在D端口上就没发用了 我是了一下 无论是A口还是D口都不行 郁闷了!!谁能帮帮我??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-28 00:33:33 | 显示全部楼层
回复【11楼】shenhao7752376:
---------------------------------
看数据手册啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2013-6-1
在线时间
54 小时
发表于 2013-6-17 15:28:54 | 显示全部楼层
回复【7楼】tangyuchen163:
---------------------------------
为什么形参是pclk1,而调用时是pclk2 ?
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-4-15
在线时间
0 小时
发表于 2015-5-27 20:17:19 | 显示全部楼层

回复【9楼】yyhao20:
---------------------------------
我也是这样改的  但是程序都下不进去   请问这是什么原因? 我是菜鸟
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-4-15
在线时间
0 小时
发表于 2015-5-27 20:20:36 | 显示全部楼层
回复【9楼】yyhao20:
---------------------------------
void uart_init(u32 pclk1,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;    
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp;  //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
    mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
RCC->APB1ENR|=1<<17;  //使能串口时钟 
GPIOA->CRL&=0XFFFF00FF;//IO状态设置
GPIOA->CRL|=0X00008B00;//IO状态设置
  
RCC->APB1RSTR|=1<<17;   //复位串口1
RCC->APB1RSTR&=~(1<<17);//停止复位        
//波特率设置
  USART2->BRR=mantissa; // 波特率设置  
USART2->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART2_RX   //如果使能了接收
//使能接收中断
USART2->CR1|=1<<8;    //PE中断使能
USART2->CR1|=1<<5;    //接收缓冲区非空中断使能     
MY_NVIC_Init(3,3,USART2_IRQn,2);//组2,最低优先级 
#endif
}

这是我改的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 22:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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