你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的串口2无法中断接收数据

[复制链接]
gehaiyangtai 提问时间:2014-4-28 23:16 /
 我的程序搭载ucs-ii实现串口2数据接收,同样的程序,只是将USART2改成USART1都可以实现数据接收,但换成串口2就无法接收,请各路大神解疑答惑!具体相关参数如下:

串口2配置:
void USART2_Config(u32 baud)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        
        SystemInit();
        /* config USART2 clock */
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE);    //换成串口1时是RCC_APB2Periph_USART1

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                              //USART2 TX,换成串口1时是PA9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                            //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                            //A端口 
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                                          //USART2 RX,换成串口1时是PA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                   //复用开漏输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);        
        
        USART_InitStructure.USART_BaudRate = 115200;                                                //速率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //停止位1位
        USART_InitStructure.USART_Parity = USART_Parity_No;                                //无校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                                        //收发模式
        
        /* Configure USART2 */
        USART_Init(USART2, &USART_InitStructure);                                                //配置串口参数函数   
        
        /*配置USART2 */
        USART_Init(USART2,&USART_InitStructure);                                                        //配置串口参数函数   
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                    //使能接收中断
        USART_ITConfig(USART2, USART_IT_TXE, ENABLE);                                                //使能发送缓冲空中断   
        /* 使能USART2 */
        USART_Cmd(USART2, ENABLE);                                                                                //使能USART2
}


void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        /* Configure the NVIC Preemption Priority Bits */  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);          
        
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                     //设置串口2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                     //抢占优先级 0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                //子优先级为0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能

          NVIC_Init(&NVIC_InitStructure);
}



USART2中断配置:
void USART2_IRQHandler(void)
{
   OS_CPU_SR  cpu_sr;
   OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断 Tell uC/OS-II that we are starting an ISR
   OSIntNesting++;
   OS_EXIT_CRITICAL();          //恢复全局中断标志                

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)           //判断读寄存器是否非空
  {         
      rx_buf_t[RxCount1++] = USART_ReceiveData(USART2);   //将读寄存器的数据缓存到接收缓冲区里
      if(rx_buf_t[RxCount1-2]==0x0d&&rx_buf_t[RxCount1-1]==0x0a)    //结束标志位0D 0A
          {
          for(i=0; i< RxCount1; i++) rx_buf
        = rx_buf_t;              //将接收缓冲器的数据转到发送缓冲区,准备转发
          OSMboxPost(UsartMsgMbox,(void *)&rx_buf);        
                                          
                }
  }

        /* 避免USART第一个字节发布出去的BUG */
        if(USART_GetITStatus(USART2,USART_IT_TXE) != RESET)
        {
                USART_ITConfig(USART2,USART_IT_TXE,DISABLE);        //禁止发缓冲器空中断
         }

         OSIntExit();           //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换           
}
运行之后USART2接收不到数据,调试时:通过串口助手网串口写数据时中断处理函数只能运行到蓝色字体部分(if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)        ),下面的中断处理函数进不去!

同样的程序,将红色字体(USART2)换成串口1(USART1),其他不变,能够准确接收数据。

我用的板子是野火STM32,如图所示。单独测试USART2,不加ucos-ii,也是可以接收数据的。

我已经搞这个问题好多天了,至今没有进展,实属无奈,才麻烦各路大神的!在这小弟拜谢了!
202450ycckluuzk9lz0iwu.jpg
收藏 评论1 发布时间:2014-4-28 23:16

举报

1个回答
wjywts 回答时间:2014-5-21 20:45:45

回复:STM32的串口2无法中断接收数据

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版