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

2019-07-21 08:35发布

我在STM32  mini开发板串口例程的基础上把串口1的应用改成了串口3,同时用杜邦线把串口3的引脚(PB11,PB10)引到了串口芯片的引脚上,用串口助手发送数据,但是怎么就是收不到数据?用jtag观察程序,发现每发送一次,会进入接收中断,但是接收的数据是空的(0x01、0xb9之类的)。这到底是为什么啊,苦恼了好几天了?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
shuuger
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
}

一周热门 更多>