[STM32] 使用 STM32F103 的 USB模块做鼠标时,串口不能进入中断

[复制链接]
2597|7
 楼主| bsaver 发表于 2013-12-28 09:38 | 显示全部楼层 |阅读模式
大家好,我使用 stm32f103 的 USB 做了个鼠标程序,然后想通过 串口发送数据,然后将数据通过USB口返还给主机,从而测试 USB 功能,结果发现程序不能进入串口中断,我在终端里面接收数据的。请大家帮忙分析下原因。
  1.         GPIO_InitTypeDef GPIO_InitStructure;
  2.         USART_InitTypeDef USART_InitStructure;

  3.         /* config USART1 clock */
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

  5.         /* USART1 GPIO config */
  6.            /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  7.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  8.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  9.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10.           GPIO_Init(GPIOA, &GPIO_InitStructure);   
  11.           /* Configure USART1 Rx (PA.10) as input floating */
  12.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  13.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  14.           GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.           
  16.         /* USART1 mode config */
  17.         USART_InitStructure.USART_BaudRate = 115200;
  18.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  19.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  20.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  21.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  22.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  23.         USART_Init(USART1, &USART_InitStructure);

  24.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  25.           USART_Cmd(USART1, ENABLE);

以上是串口的初始化代码。

  1. void INTERRUPT_Config(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;

  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  5.         NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  6.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  7.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  8.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9.         NVIC_Init(&NVIC_InitStructure);

  10.         /* Enable the USB Wake-up interrupt */
  11.           NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;
  12.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  13.           NVIC_Init(&NVIC_InitStructure);


  14.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  15.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  16.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  17.         NVIC_Init(&NVIC_InitStructure);

  18. }

这个是中断初始化代码。

  1. /*******************************************************************************
  2. * Function Name  : USB_LP_CAN_RX0_IRQHandler
  3. * Description    : This function handles USB Low Priority or CAN RX0 interrupts
  4. *                  requests.
  5. * Input          : None
  6. * Output         : None
  7. * Return         : None
  8. *******************************************************************************/
  9. void USB_LP_CAN1_RX0_IRQHandler(void)       
  10. {
  11.     USB_Istr();
  12. }


  13. /*******************************************************************************
  14. * Function Name  : USBWakeUp_IRQHandler
  15. * Description    : This function handles USB WakeUp interrupt request.
  16. * Input          : None
  17. * Output         : None
  18. * Return         : None
  19. *******************************************************************************/
  20. void USBWakeUp_IRQHandler(void)
  21. {
  22.         EXTI_ClearITPendingBit(EXTI_Line18);
  23. }


  24. /*******************************************************************************
  25. * Function Name  : USART1_IRQHandler
  26. * Description    : This function handles USART1 global interrupt request.
  27. * Input          : None
  28. * Output         : None
  29. * Return         : None
  30. *******************************************************************************/
  31. void USART1_IRQHandler(void)
  32. {
  33.         USART1_IRQHandler_Fun();
  34. }

这是 USB 与串口的中断函数,该做的基本都做了,而且串口中断接收专门建立了个工程测试是能使用的,但是加入USB 模块后就不能进入中断了,大家帮帮忙!谢谢了!

 楼主| bsaver 发表于 2013-12-28 09:40 | 显示全部楼层
本帖最后由 bsaver 于 2013-12-30 08:25 编辑
 楼主| bsaver 发表于 2013-12-28 09:42 | 显示全部楼层
  1. /*******************************************************************************
  2. * Function Name  : USART1_IRQHandler_Fun
  3. * Description    : ISTR events interrupt service routine
  4. * Input          : None.
  5. * Output         : None.
  6. * Return         : None.
  7. *******************************************************************************/
  8. void USART1_IRQHandler_Fun(void)
  9. {
  10.    volatile unsigned int IIR;
  11.    uint8_t        recvData;

  12.    IIR = USART1->SR;

  13.    if (IIR & USART_FLAG_RXNE)
  14.    {
  15.               USART1->SR &= ~USART_FLAG_RXNE;            // clear interrupt
  16.                
  17.                 recvData = USART1->DR & 0x1FF;

  18.                 if(bDataCount)
  19.                 {
  20.                         bDataCount--;
  21.                         BUFF_WriteByte(recvData);
  22.                 }
  23.                 else
  24.                 {
  25.                         if(recvData >= 0xf8)
  26.                         {
  27.                                 bDataCount = 3;
  28.                                 BUFF_WriteByte(recvData);
  29.                         }
  30.                 }
  31.    }

  32.    LED(OFF);
  33. }

上面的是中断接收函数,不要管数据的判断,那是我定义的数据组判断。中断函数退出时候我用个 LED 来监视中断情况,结果LED没有熄灭,表示根本没有进入中断程序
 楼主| bsaver 发表于 2013-12-28 11:41 | 显示全部楼层
顶一下,大家帮下忙,谢谢!
 楼主| bsaver 发表于 2013-12-30 08:22 | 显示全部楼层
好吧,要结贴了。
问题解决了,将中断初始化修改如下就可以了,具体原因我自己没有搞明白,希望大家指出来,帮我解惑。代码贴在下面:
  1. void INTERRUPT_Config(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;

  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  5.         NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  6.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  7.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  8.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9.         NVIC_Init(&NVIC_InitStructure);

  10.         /* Enable the USB Wake-up interrupt */
  11.           NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;
  12.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  13. //        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  14.           NVIC_Init(&NVIC_InitStructure);


  15.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  16.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  17. //        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  18.         NVIC_Init(&NVIC_InitStructure);

  19. }
 楼主| bsaver 发表于 2013-12-30 08:24 | 显示全部楼层
期待大家的解答...
shuibao123 发表于 2014-1-7 14:07 | 显示全部楼层
不明觉厉!
fengqun 发表于 2014-2-16 11:09 | 显示全部楼层
应该是中断优先级的问题,你之前的USB唤醒中断里的响应优先级没设,应该是这个问题引起的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

51

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部