求助,STM32串口接收进入不了中断

[复制链接]
6512|9
 楼主| kyzb001 发表于 2012-3-21 13:09 | 显示全部楼层 |阅读模式
  1. void NVIC_Configuration(void)
  2. {
  3. NVIC_InitTypeDef NVIC_InitStructure;

  4. #ifdef VECT_TAB_RAM

  5. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  6. #else

  7. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  8. #endif

  9. /* Configure one bit for preemption priority */
  10. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  11. /*UART2*/
  12. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  13. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  14. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  15. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  16. NVIC_Init(&NVIC_InitStructure);
  17. /*timer2*/
  18. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  19. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  20. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  21. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22. NVIC_Init(&NVIC_InitStructure);

  23. }
  24. void USART_Configuration(void)
  25. {
  26. GPIO_InitTypeDef GPIO_InitStructure;
  27. USART_InitTypeDef USART_InitStructure;
  28. USART_ClockInitTypeDef USART_ClockInitStructure;

  29. //使能串口1,PA,AFIO总线
  30. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  31. RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO ,ENABLE );
  32. RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 ,ENABLE);

  33. /* A9 USART1_Tx */
  34. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  35. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX
  37. GPIO_Init(GPIOA, &GPIO_InitStructure);

  38. /* A10 USART1_Rx */
  39. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  40. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX
  41. GPIO_Init(GPIOA, &GPIO_InitStructure);


  42. USART_InitStructure.USART_BaudRate = 115200;
  43. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  44. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  45. USART_InitStructure.USART_Parity = USART_Parity_No;
  46. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  47. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  48. // USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
  49. // USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
  50. // USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
  51. // USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
  52. //
  53. // USART_ClockInit(USART2, &USART_ClockInitStructure);
  54. USART_Init(USART2, &USART_InitStructure);
  55. /* Enable the USARTx */
  56. USART_Cmd(USART2, ENABLE);
  57. //串口1使用接收中断
  58. USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

  59. }



  60. void USART2_IRQHandler(void)
  61. {
  62. u16 i;

  63. if(USART_GetFlagStatus(USART2,USART_IT_RXNE)==SET)
  64. {
  65. i = USART_ReceiveData(USART2);
  66. USART_SendData(USART2,i);
  67. while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
  68. {
  69. }
  70. }

  71. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  72. {

  73. USART_ClearITPendingBit(USART2, USART_IT_RXNE);

  74. }

  75. //溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
  76. if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
  77. {
  78. USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR
  79. USART_ReceiveData(USART2); //读DR
  80. }
  81. }
 楼主| kyzb001 发表于 2012-3-21 13:10 | 显示全部楼层
发送数据正常, 我从串口发回东西,不能返回打印。

请教大家, 这是咋回事啊!!!
 楼主| kyzb001 发表于 2012-3-21 13:22 | 显示全部楼层
有木有人呐!!!!
香水城 发表于 2012-3-21 13:36 | 显示全部楼层
有人,但是没有时间看代码。
logokfu 发表于 2012-3-21 15:45 | 显示全部楼层
YHW2003 发表于 2012-3-21 16:11 | 显示全部楼层
你使用了串口2接受中断
sdrztw001 发表于 2012-3-21 17:02 | 显示全部楼层
你这中断函数也太乱了
固件代码如下
void USARTy_IRQHandler(void)
{
  if(USART_GetITStatus(USARTy, USART_IT_RXNE) != RESET)
  {
    /* Read one byte from the receive data register */
    RxBuffer1[RxCounter1++] = USART_ReceiveData(USARTy);

    if(RxCounter1 == NbrOfDataToRead1)
    {
      /* Disable the USARTy Receive interrupt */
      USART_ITConfig(USARTy, USART_IT_RXNE, DISABLE);
    }
  }
  
  if(USART_GetITStatus(USARTy, USART_IT_TXE) != RESET)
  {   
    /* Write one byte to the transmit data register */
    USART_SendData(USARTy, TxBuffer1[TxCounter1++]);

    if(TxCounter1 == NbrOfDataToTransfer1)
    {
      /* Disable the USARTy Transmit interrupt */
      USART_ITConfig(USARTy, USART_IT_TXE, DISABLE);
    }   
  }
}
 楼主| kyzb001 发表于 2012-3-22 10:35 | 显示全部楼层
你好, 这个不行吗? 6# YHW2003
 楼主| kyzb001 发表于 2012-3-22 10:36 | 显示全部楼层
这个不是那个开发板上的??? 7# sdrztw001
 楼主| kyzb001 发表于 2012-3-22 10:37 | 显示全部楼层
  1. void USART2_IRQHandler(void)
  2. {
  3.         USART2_Str("In USART2 Init");
  4.        
  5.         //接收中断
  6.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  7.         {                  
  8.                 LED_ALL_OFF;
  9.                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);
  10.                 Uart1_Get_Data=USART_ReceiveData(USART2);
  11.                 Uart1_Get_Flag=1;
  12.                 USART2_Byte(Uart1_Get_Data);
  13.         }
  14.        
  15.         //溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
  16.         if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
  17.         {
  18.                 USART_ClearFlag(USART2,USART_FLAG_ORE);        //读SR
  19.                 USART_ReceiveData(USART2);                                //读DR
  20.         }
  21. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

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