STM32L071使用cubeMX库开发---利用串口rxne中断 接收数据问题static void MX_USART1_UART_Init(void) { huart1.Instance =

本文详细解析了STM32使用Cubemx生成的UART初始化代码中出现的中断接收异常问题,通过修改中断服务函数,直接访问RDR寄存器获取数据,解决了接收数据异常和RXNE中断无法正常工作的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Cubemx生成的初始化函数如下:

static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

管脚及中断初始化在void HAL_UART_MspInit(UART_HandleTypeDef* huart)函数中,需要自己添加函数开启RXNE中断。

if(huart->Instance==USART1)
{
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
		
    /* Jx: enable rxne */
    __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
    
    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
}

问题出在中断服务函数中,在判断了标志位后,使用了HAL_UART_Receive_IT()函数接收一个字节的数据,出现我在上位机发送一个字节,但是stm32收到7,8个字节并且全是00,不仅如此如果再次发送数据,发现再也不会,置位rxne中断。

针对这个情况,不再使用HAL_UART_Receive_IT()函数接收数据 ,我改为以下方式:

void USART1_IRQHandler(void)
{
    uint8_t buf=0;
	
    if(RESET != __HAL_UART_GET_IT(&huart1, UART_IT_RXNE) )
    {
	buf = huart1.Instance->RDR;
	printf("%02x ",buf);
    }

}

直接去访问  rdr寄存器 取回数据 。其实  应该加上一些错误处理,比如判断 溢出错误(ORE),噪声探测 (NE),校验错误(PE)。。。这个 可以 参考 cubemx生成的void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)函数 。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值