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

2019-07-21 08:35发布

我在STM32  mini开发板串口例程的基础上把串口1的应用改成了串口3,同时用杜邦线把串口3的引脚(PB11,PB10)引到了串口芯片的引脚上,用串口助手发送数据,但是怎么就是收不到数据?用jtag观察程序,发现每发送一次,会进入接收中断,但是接收的数据是空的(0x01、0xb9之类的)。这到底是为什么啊,苦恼了好几天了?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
shuuger
1楼-- · 2019-07-21 09:03
回复【楼主位】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
}
shuuger
2楼-- · 2019-07-21 09:34
上传了工程,麻烦各位大侠帮忙解答啊,求原子哥指点啦。
正点原子
3楼-- · 2019-07-21 12:24
 精彩回答 2  元偷偷看……
shuuger
4楼-- · 2019-07-21 15:40
 

原子哥v5,一语破的,厉害
shuuger
5楼-- · 2019-07-21 21:29
继续请教原子哥,串口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
shuuger
6楼-- · 2019-07-22 00:42
回复【4楼】正点原子:
---------------------------------
如果用串口1中断接收,试了好长时间好像是没问题,外部中断来也不会卡死,不解啊?

一周热门 更多>