打印

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

[复制链接]
7079|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窗口 应该就行了。

使用特权

评论回复
5
yshiliu|  楼主 | 2012-7-27 15:21 | 只看该作者

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

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

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

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);   
        /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);                                         //设置AHB时钟(HCLK)
  
    /* PCLK2 = HCLK/2 */
    RCC_PCLK2Config(RCC_HCLK_Div2);                                         //设置高速AHB时钟(PCLK2)

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

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

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);                                                                        //使能PLL

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

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

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

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

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


        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Configure USART1 Tx (PA9) as alternate function push-pull                */
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

  NVIC_InitTypeDef   NVIC_InitStructure;
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  /* Enable the SPI1 Interrupt */
//  NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel ;
//  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//  NVIC_Init(&NVIC_InitStructure);

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

        USART_InitStructure.USART_BaudRate = 1200;
        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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
        USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
        USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
        USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
        USART_Init(USART1, &USART_InitStructure);
        USART_ClockInit(USART1, &USART_ClockInitStructure);
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_Cmd(USART1, ENABLE);

使用特权

评论回复
6
yshiliu|  楼主 | 2012-7-27 15:22 | 只看该作者
应该没有问题吧

使用特权

评论回复
7
yshiliu|  楼主 | 2012-7-27 15:24 | 只看该作者
我明白你的意思了,是keil这个软件读RDR寄存器的时候把这个标志位给清了,有道理啊。

使用特权

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

本版积分规则

0

主题

11

帖子

1

粉丝