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条回答
利弊
2019-07-23 01:12
本帖最后由 利弊 于 2018-4-16 10:30 编辑

改成!=reset    我之前用的跟你一样,改成!=reset后好了   你试下,你不是使用了一个接受标志位,在main中检测,只要标志位置位,把缓存数组中的数给发送数据寄存器,还有一个问题,发送和接受不能同时进行,你要不要接受完成后开发送关接受,发送完成后开接受,关发送,反正我是这么干的,目前没有什么问题

一周热门 更多>