OpenEdv-开源电子网

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

求助原子哥,串口3为什么收不到数据

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-12-22
在线时间
1 小时
发表于 2013-3-15 16:15:23 | 显示全部楼层 |阅读模式
我在STM32  mini开发板串口例程的基础上把串口1的应用改成了串口3,同时用杜邦线把串口3的引脚(PB11,PB10)引到了串口芯片的引脚上,用串口助手发送数据,但是怎么就是收不到数据?用jtag观察程序,发现每发送一次,会进入接收中断,但是接收的数据是空的(0x01、0xb9之类的)。这到底是为什么啊,苦恼了好几天了?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-12-22
在线时间
1 小时
 楼主| 发表于 2013-3-15 16:17:20 | 显示全部楼层
回复【楼主位】shuuger:
---------------------------------

下面是串口3的初始化和中断处理函数


#ifdef EN_USART3_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   
u8 USART3_RX_BUF[USART3_REC_LEN];     //串口3接收缓冲区,最大USART3_REC_LEN个字节,末字节为换行符
u8 USART3_RX_TEMP[USART3_REC_LEN];   //缓存串口3数据,全局变量
u16 usart3_rx_len;    //串口3接收到的的字节数,全局变量
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u16 USART3_RX_STA=0;       //串口3接收状态标记   
u16 usart3_rx_cnt;     //计数器
u16 as=0;  
void USART3_IRQHandler(void)
{
u8 res;  
 
if(USART3->SR&(1<<5))//接收到数据
{  
res=USART3->DR; 
if((USART3_RX_STA&0x8000)==0)//接收未完成
{
if(USART3_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)
{
USART3_RX_STA=0;//接收错误,重新开始
}
else
{
as=0;
USART3_RX_STA|=0x8000; //接收完成了
usart3_rx_len=USART3_RX_STA&0x3fff; //获取接收到的数据长度
for(usart3_rx_cnt=0;usart3_rx_cnt<usart3_rx_len;usart3_rx_cnt++)//缓存串口数据
{
USART3_RX_TEMP[usart3_rx_cnt]=USART3_RX_BUF[usart3_rx_cnt];
}

}  
}else //还没收到0X0D
{
if(res==0x0d)
{
USART3_RX_STA|=0x4000;
}
else
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=res;
USART3_RX_STA++;
as++;
if(USART3_RX_STA>USART3_REC_LEN)USART3_RX_STA=0;//接收数据错误,重新开始接收   
}  
}
}          
}
 

#endif  
//初始化IO 串口3
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void usart3_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<<3;   //使能PORTB口时钟  
RCC->APB1ENR|=1<<18;  //使能串口3时钟
// RCC->APB2ENR|=1<<0;    //开启辅助时钟
// AFIO->MAPR&=0XFFFFFFE7; //清除MAPR的[26:24]
 
GPIOB->CRH&=0XFFFF00FF;   //PB11-RX,PB10-TX
GPIOB->CRH|=0X00008B00;//IO状态设置
  
RCC->APB1RSTR|=1<<18;   //复位串口3,只有串口1的寄存器在APB2RSTR中
RCC->APB1RSTR&=~(1<<18);//停止复位        
//波特率设置
  USART3->BRR=mantissa; // 波特率设置  
USART3->CR1|=0X200C;  //1位停止,无校验位.
//USART3->CR2&=0XCFFF;  //1个停止位
#ifdef EN_USART3_RX   //如果使能了接收
//使能接收中断
USART3->CR1|=1<<8;    //PE中断使能
USART3->CR1|=1<<5;    //接收缓冲区非空中断使能     
MY_NVIC_Init(3,3,USART3_IRQChannel,2);//组2,抢占3,优先级2 
#endif
}
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-12-22
在线时间
1 小时
 楼主| 发表于 2013-3-15 16:21:46 | 显示全部楼层
上传了工程,麻烦各位大侠帮忙解答啊,求原子哥指点啦。

ALIENTEK MINISTM32 实验3 串口实验.rar

648.17 KB, 下载次数: 1264

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-15 18:10:59 | 显示全部楼层
把main函数的

usart3_init(72,9600);  //串口初始化为9600
改为

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

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-12-22
在线时间
1 小时
 楼主| 发表于 2013-3-15 20:22:44 | 显示全部楼层
 

原子哥v5,一语破的,厉害
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-12-22
在线时间
1 小时
 楼主| 发表于 2013-3-17 17:29:40 | 显示全部楼层
继续请教原子哥,串口3按上面的配置好了,两个串口都工作之后,串口3收到数据后系统常常死掉,有时候几分钟死掉,有时候十几分钟死掉。并且串口3中断接收数据时,如果按下按键触发外部中断,死掉的概率很大,这是为什么呢?
程序里用到了一下的一些中断,不知道串口的中断设置是否有问题?
timer     1 3 2  抢占1,子优先级3,组2
usart1   3 3 2
usart3   3 2 2
key0     2 2 2
key 1    2 1 2  
rtc        0 0 2
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-12-22
在线时间
1 小时
 楼主| 发表于 2013-3-17 17:37:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
如果用串口1中断接收,试了好长时间好像是没问题,外部中断来也不会卡死,不解啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-17 18:04:59 | 显示全部楼层
用仿真器跟踪代码,这个不好说了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2012-12-22
在线时间
1 小时
 楼主| 发表于 2013-3-17 18:28:18 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我这几个中断的使用情况是:串口接收中断中 被外部按键中断 外部按键中断中 调用了定时器又被定时器中断。会不会这些嵌套有问题?在外部中断中调用定时器的目的是想用一个按键来实现长按键和短按键两个功能,感觉这样实现没os时还可以,但是放在os上之后,按键常常会不灵敏。原子哥有没有什么好的方法和建议啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-17 20:50:59 | 显示全部楼层
中断嵌套应该是没问题的,stm32支持嵌套.
OS做长按键,利用os自带的延时函数做就很好做了啊.只要把按键扫描任务的优先级设置高一点,然后通过延时函数去判断就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-3
在线时间
57 小时
发表于 2017-10-30 16:39:27 | 显示全部楼层
正点原子 发表于 2013-3-15 18:10
把main函数的

        usart3_init(72,9600);        &nbsp;//串口初始化为9600
改为

        usart3_init(36,9600);        &nbsp;// ...

库函数呢原子哥
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-25
在线时间
16 小时
发表于 2018-10-27 19:55:21 | 显示全部楼层
正点原子 发表于 2013-3-15 18:10
把main函数的

        usart3_init(72,9600);        &nbsp;//串口初始化为9600
改为

        usart3_init(36,9600);        &nbsp;// ...

原子哥,不改成36M的话,会出现串口发送给上位机的数据正常显示,上位机发给stm32的数据错误?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 21:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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