OpenEdv-开源电子网

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

串口2一个非常奇怪的问题

[复制链接]

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
发表于 2014-8-1 16:29:36 | 显示全部楼层 |阅读模式
5金钱
以一秒钟50次左右访问串口2,每次访问都会回应,波特率为115200,半小时内正常,半小时后,会

死循环在 “while((USART2->SR&0X40)==0);” 这个回应语句中,望大神指点

void uart_init2(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->APB1ENR|=1<<17;  //使能串口时钟 
 GPIOA->CRL&=0XFFFF00FF; //
 GPIOA->CRL|=0X00008B00;//IO状态设置 PA03 PA02
    
 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,3,USART2_IRQn,2);//组2,最低优先级 
#endif
}

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

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-8-1 17:55:13 | 显示全部楼层
比较奇怪,用库函数的版本试试。。。
站在巨人的肩膀上不断的前进。。。
回复

使用道具 举报

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
 楼主| 发表于 2014-8-2 09:47:48 | 显示全部楼层
多次试验后,发现,串口二接收数据频率一高,就会死在里面
回复

使用道具 举报

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
 楼主| 发表于 2014-8-2 10:08:36 | 显示全部楼层
回复【3楼】yxwdczh:
---------------------------------
最新发现,是不停的进入串口2中断,但是  if(USART2->SR&(1<<5))//接收到数据  却无法进入这个处理   也就是说SR&(1<<5) 的值不为1,请教是何原因
回复

使用道具 举报

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
 楼主| 发表于 2014-8-2 10:09:36 | 显示全部楼层
导致中断无法处理,不停地进入中断
回复

使用道具 举报

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
 楼主| 发表于 2014-8-2 10:29:27 | 显示全部楼层
产生了ORE过载错误,请问这个如何解决,过载错误是如何产生的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-2 23:12:51 | 显示全部楼层
回复【5楼】yxwdczh:
---------------------------------
在中断的最后,加一句:
USART1->SR=0;
将所有的中断标志清零试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
 楼主| 发表于 2014-8-5 16:27:16 | 显示全部楼层
我现在用这样的方法:
if((USART2->SR&(1<<5))||(USART2->SR&(1<<4)))//接收到数据
{
  res2=USART2->DR; 
}

反正读了之后,两个标志位都会硬件自动清掉,测试了两天通信一直正常!
回复

使用道具 举报

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
 楼主| 发表于 2014-8-5 16:28:38 | 显示全部楼层
只是不太清楚“过载错误是如何产生的”,而串口一却不会产一过载中断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 11:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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