打印
[STM32]

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

[复制链接]
1931|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bsaver|  楼主 | 2013-12-28 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我使用 stm32f103 的 USB 做了个鼠标程序,然后想通过 串口发送数据,然后将数据通过USB口返还给主机,从而测试 USB 功能,结果发现程序不能进入串口中断,我在终端里面接收数据的。请大家帮忙分析下原因。
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

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

        /* USART1 GPIO config */
           /* Configure USART1 Tx (PA.09) as alternate function push-pull */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);   
          /* Configure USART1 Rx (PA.10) as input floating */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
          
        /* USART1 mode config */
        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_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;
        USART_Init(USART1, &USART_InitStructure);

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
          USART_Cmd(USART1, ENABLE);

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

void INTERRUPT_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

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


        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_Init(&NVIC_InitStructure);

}

这个是中断初始化代码。

/*******************************************************************************
* Function Name  : USB_LP_CAN_RX0_IRQHandler
* Description    : This function handles USB Low Priority or CAN RX0 interrupts
*                  requests.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USB_LP_CAN1_RX0_IRQHandler(void)       
{
    USB_Istr();
}


/*******************************************************************************
* Function Name  : USBWakeUp_IRQHandler
* Description    : This function handles USB WakeUp interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USBWakeUp_IRQHandler(void)
{
        EXTI_ClearITPendingBit(EXTI_Line18);
}


/*******************************************************************************
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
        USART1_IRQHandler_Fun();
}

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

相关帖子

沙发
bsaver|  楼主 | 2013-12-28 09:40 | 只看该作者
本帖最后由 bsaver 于 2013-12-30 08:25 编辑

使用特权

评论回复
板凳
bsaver|  楼主 | 2013-12-28 09:42 | 只看该作者
/*******************************************************************************
* Function Name  : USART1_IRQHandler_Fun
* Description    : ISTR events interrupt service routine
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void USART1_IRQHandler_Fun(void)
{
   volatile unsigned int IIR;
   uint8_t        recvData;

   IIR = USART1->SR;

   if (IIR & USART_FLAG_RXNE)
   {
              USART1->SR &= ~USART_FLAG_RXNE;            // clear interrupt
               
                recvData = USART1->DR & 0x1FF;

                if(bDataCount)
                {
                        bDataCount--;
                        BUFF_WriteByte(recvData);
                }
                else
                {
                        if(recvData >= 0xf8)
                        {
                                bDataCount = 3;
                                BUFF_WriteByte(recvData);
                        }
                }
   }

   LED(OFF);
}

上面的是中断接收函数,不要管数据的判断,那是我定义的数据组判断。中断函数退出时候我用个 LED 来监视中断情况,结果LED没有熄灭,表示根本没有进入中断程序

使用特权

评论回复
地板
bsaver|  楼主 | 2013-12-28 11:41 | 只看该作者
顶一下,大家帮下忙,谢谢!

使用特权

评论回复
5
bsaver|  楼主 | 2013-12-30 08:22 | 只看该作者
好吧,要结贴了。
问题解决了,将中断初始化修改如下就可以了,具体原因我自己没有搞明白,希望大家指出来,帮我解惑。代码贴在下面:
void INTERRUPT_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

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


        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
//        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_Init(&NVIC_InitStructure);

}

使用特权

评论回复
6
bsaver|  楼主 | 2013-12-30 08:24 | 只看该作者
期待大家的解答...

使用特权

评论回复
7
shuibao123| | 2014-1-7 14:07 | 只看该作者
不明觉厉!

使用特权

评论回复
8
fengqun| | 2014-2-16 11:09 | 只看该作者
应该是中断优先级的问题,你之前的USB唤醒中断里的响应优先级没设,应该是这个问题引起的

使用特权

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

本版积分规则

4

主题

51

帖子

1

粉丝