STM32 接收中断可以接收数据,但进入中断后RXNE标识位是0

[复制链接]
8003|6
 楼主| yshiliu 发表于 2012-7-27 14:52 | 显示全部楼层 |阅读模式
本帖最后由 yshiliu 于 2012-7-27 15:03 编辑

如题。配置串口1为接收中断,在调试环境下,用电脑串口发送一个数据,程序进入串口1中断。打开Peripherals下的USART窗口,RXNE位为0。这是为什么呢,我的程序进入中断前没有读数据寄存器,也没有给它清零,我还想判断RXNE位来读数据呢。另外:USART1->SR = 0x00D0;USART2->CR1 = 0x202C;USART2->CR2 =  0x0200;
USART2->CR3 = 0;
 楼主| yshiliu 发表于 2012-7-27 15:05 | 显示全部楼层
figo20042005 发表于 2012-7-27 15:12 | 显示全部楼层
不知道你的初始化程序是怎么写的
IJK 发表于 2012-7-27 15:20 | 显示全部楼层
“打开Peripherals下的USART窗口” 就有可能把标志位清0了。
按理,关闭USART窗口 应该就行了。
 楼主| yshiliu 发表于 2012-7-27 15:21 | 显示全部楼层

  1. void RCC_Configuration(void)
  2. {
  3.   /* RCC system reset(for debug purpose) */
  4.   RCC_DeInit();                                                                                         //将外设RCC寄存器重设为缺省值

  5.   /* Enable HSE */
  6.   RCC_HSEConfig(RCC_HSE_ON);                                                        //设置外部高速晶振(HSE )

  7.   /* Wait till HSE is ready */
  8.   HSEStartUpStatus = RCC_WaitForHSEStartUp();                        //等待HSE 起振

  9.   if(HSEStartUpStatus == SUCCESS)
  10.   {
  11.     /* Enable Prefetch Buffer */
  12.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  13.     /* Flash 2 wait state */
  14.     FLASH_SetLatency(FLASH_Latency_2);   
  15.         /* HCLK = SYSCLK */
  16.     RCC_HCLKConfig(RCC_SYSCLK_Div1);                                         //设置AHB时钟(HCLK)
  17.   
  18.     /* PCLK2 = HCLK/2 */
  19.     RCC_PCLK2Config(RCC_HCLK_Div2);                                         //设置高速AHB时钟(PCLK2)

  20.     /* PCLK1 = HCLK/2 */
  21.     RCC_PCLK1Config(RCC_HCLK_Div2);                                                //设置低速AHB时钟(PCLK1)

  22.    /* PLLCLK = 8MHz * 9 = 72 MHz */
  23.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);         //设置PLL 时钟源及倍频系数

  24.     /* Enable PLL */
  25.     RCC_PLLCmd(ENABLE);                                                                        //使能PLL

  26.     /* Wait till PLL is ready */
  27.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  28.     {
  29.     }

  30.     /* Select PLL as system clock source */
  31.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  32.     /* Wait till PLL is used as system clock source */
  33.     while(RCC_GetSYSCLKSource() != 0x08)
  34.     {
  35.     }
  36.   }

  37.   /* Enable peripheral clocks --------------------------------------------------*/
  38.   /* GPIOA,GPIOB,GPIOC,SPI1 and USART1 clock enable */
  39.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
  40.                          RCC_APB2Periph_USART1 |RCC_APB2Periph_SPI1, ENABLE);

  41.   /* USART2,USART3,UART4 Periph clock enable */
  42.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3 |
  43.                                                    RCC_APB1Periph_UART4, ENABLE);                                //USART2,USART3,UART4在APB1总线上
  44. }


  1.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
  2.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
  3.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  4.        
  5.         /* Configure USART1 Tx (PA9) as alternate function push-pull                */
  6.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
  7.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  9.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  1.   NVIC_InitTypeDef   NVIC_InitStructure;
  2.   /* Configure one bit for preemption priority */
  3.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  4.   /* Enable the SPI1 Interrupt */
  5. //  NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel ;
  6. //  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  7. //  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  8. //  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9. //  NVIC_Init(&NVIC_InitStructure);

  10.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;                                         //选择串口1中断
  11.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                                         //抢占式中断优先级设置为0
  12.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                                 //响应式中断优先级设置为0
  13.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                         //使能中断          
  14.   NVIC_Init(&NVIC_InitStructure);

  1.         USART_InitStructure.USART_BaudRate = 1200;
  2.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  3.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  4.         USART_InitStructure.USART_Parity = USART_Parity_No;
  5.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  6.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  7.         USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
  8.         USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
  9.         USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
  10.         USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
  11.         USART_Init(USART1, &USART_InitStructure);
  12.         USART_ClockInit(USART1, &USART_ClockInitStructure);
  13.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  14.         USART_Cmd(USART1, ENABLE);
 楼主| yshiliu 发表于 2012-7-27 15:22 | 显示全部楼层
应该没有问题吧
 楼主| yshiliu 发表于 2012-7-27 15:24 | 显示全部楼层
我明白你的意思了,是keil这个软件读RDR寄存器的时候把这个标志位给清了,有道理啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

11

帖子

1

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