打印

进不了串口中断

[复制链接]
2260|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2013-6-11 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我的初始化函数

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;  //使能串口2时钟
GPIOA->CRL&=0XFFFF00FF;
GPIOA->CRL|=0X00008B00;//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,3,USART2_IRQChannel,2);//组2,最低优先级
#endif
}

下面是我的中断处理函数
  
void USART2_IRQHandler(void)
{
u8 res;   
if(USART2->SR&(1<<5))//接收到数据
{
  D3 = !D3; //没有进来
  res=USART2->DR;
  if((USART_RX_STA&0x80)==0)//接收未完成
  {
   if(USART_RX_STA&0x40)//接收到了0xef,再接收最后一字节0x05
   {
    if(res!=0x05)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x80; //接收完成了
   }else //
   {
    if(res==0xef)USART_RX_STA|=0x40;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3F]=res;
     USART_RX_STA++;
     if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收   
    }   
   }
  }                  
}              
}
#endif

我下载程序后通过串口调试助手,发送数据,我这里结尾用0xef,0x05表示,当收到这两个字节就表示发送完成了,最长64字节。始终进不到接收中断中区。主函数中的打印函数能用,说明串口配置的没有错吧?而且主函数可以直接发送单个字节到串口调试助手上去,为什么从串口助手发送字节,stm32接不到啊?
谢谢。
沙发
trumpxp| | 2013-6-11 20:04 | 只看该作者
应该是代码中哪里的中断标志位没有及时清除   个人是这么理解的

使用特权

评论回复
板凳
grasswolfs| | 2013-6-11 22:29 | 只看该作者
且主函数可以直接发送单个字节到串口调试助手上去,串口调试助手可以发送单个数据到主机么?

使用特权

评论回复
地板
航天风云| | 2013-6-25 15:52 | 只看该作者
可以查查串口数据发送得对不对,看看时序关系是否一致,你可用“RS232串口数据采集器”在电脑上直接看到发送的数据,同时也能看到时序关系,我用过,调试起来很好,很方便,让你一目了然,用了以后你会放不下,现在我还在用,真的很好,你可以用用,帮助很大。在淘宝上就可以买到。

使用特权

评论回复
5
trumpxp| | 2013-6-25 19:35 | 只看该作者
查一查串口输出  看看问题  应该不是很大  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝