STM32F051串口接收中断问题,进入不了中断

2019-07-21 07:16发布

网上下的F0例程,在中断打断点,点全速运行会停在断点一次,继续点全速运行再发送数据,进入不了中断函数;代码如下
/************************************************
函数名称 : RCC_Configuration
功    能 : 时钟配置
参    数 : 无
返 回 值 : 无
*************************************************/

void RCC_Configuration(void)
{
  /* 使能AHB时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
                        RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);

  /* 使能APB2时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  /* 使能APB1时钟 */
}


/************************************************
函数名称 : NVIC_Configuration
功    能 : NVIC配置
参    数 : 无
返 回 值 : 无
*************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* 外设中断 */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                  //IRQ通道:串口1
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;                    //优先级 :1级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                    //使能IRQ通道
  NVIC_Init(&NVIC_InitStructure);
}



/************************************************
函数名称 : USART_GPIO_Configuration
功    能 : USART所使用管脚输出输入定义
参    数 : 无
返 回 值 : 无
*************************************************/
void USART_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

  /* 定义USART TX_RX 引脚为复用输出 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;            //引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                       //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //高速
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推完输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/************************************************
函数名称 : USART_Configuration
功    能 : 配置USART
参    数 : 无
返 回 值 : 无
*************************************************/
void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;

  /******************************************************************
  USART参数初始化:  波特率     传输位数   停止位数  校验位数
                    115200         8         1        0(NO)
  *******************************************************************/
  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);                          //初始化USART1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                     //使能USART1接收中断

  USART_Cmd(USART1, ENABLE);                                         //使能USART1
}

/************************************************
函数名称 : USART_Initializes
功    能 : 串口初始化
参    数 : 无
返 回 值 : 无
*************************************************/
void USART_Initializes(void)
{
  RCC_Configuration();
  NVIC_Configuration();
  USART_GPIO_Configuration();
  USART_Configuration();
}


/************************************************
函数名称 : USART1_IRQHandler
功    能 : USART1中断
参    数 : 无
返 回 值 : 无
*************************************************/
void USART1_IRQHandler(void)
{
  if((USART1->ISR & USART_FLAG_RXNE) == USART_FLAG_RXNE)
  {
    USART1_SendByte((uint8_t)(USART1->RDR));     //发送接收到的字符数据
  }
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
mill
1楼-- · 2019-07-22 03:03
中断函数里面没有清除中断标志位,所以第二次不会进中断
利弊
2楼-- · 2019-07-22 08:30
qq455738812 发表于 2018-4-16 09:32
那为什么是USART2呢?

我的意思你每次收到数据后,先把USART1->RDR读取到一个串口接受缓存数组中,发送时再发送这个数组
利弊
3楼-- · 2019-07-22 11:32
 精彩回答 2  元偷偷看……
利弊
4楼-- · 2019-07-22 14:45
qq455738812 发表于 2018-4-16 09:32
那为什么是USART2呢?

那是我在我程序中复制过来的
qq455738812
5楼-- · 2019-07-22 17:45
利弊 发表于 2018-4-16 09:38
那是我在我程序中复制过来的

根据你的意思,我把中断函数改成了这样,但是还是一样程序在开始运行时进入一次中断,之后一直都不进入中断。

void USART1_IRQHandler(void)
{
    if(USART_GetITStatues(USART1,USART_IT_RXNE) == SET)
    {
         RecvBuf[RecvCount]=(uint8_t)(USART->RDR);
         RecvCount++;
         RecvFlag=1;
    }
    USART_ClearFlag(USART1,USART_IT_RXNE);
}
qq455738812
6楼-- · 2019-07-22 23:08
mill 发表于 2018-4-16 09:35
中断函数里面没有清除中断标志位,所以第二次不会进中断

void USART1_IRQHandler(void)
{
    if(USART_GetITStatues(USART1,USART_IT_RXNE) == SET)
    {
         RecvBuf[RecvCount]=(uint8_t)(USART->RDR);
         RecvCount++;
         RecvFlag=1;
    }
    USART_ClearFlag(USART1,USART_IT_RXNE);
}

一周热门 更多>