hzp2022 2024-03-22 14:19 采纳率: 46.2%
浏览 11

stm32空闲中断问题

STM32进入中断的一个问题,为什么我Xcom发字符1,STM32也能回我字符1,但是LED灯却一直不反转呢?LED对应的IO口也没有搞错

#include "gpio.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);

  /*Configure GPIO pins : PF9 PF10 */
  GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

}

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */

    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
    uint16_t pwmValue = 500;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
         
         
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  /* USER CODE END 3 */
}

void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
{
    HAL_UART_DMAStop(&huart1);

        if (rx_buffer[0] == '1')
    {
                HAL_GPIO_TogglePin(GPIOF,9);
        }
    else if (rx_buffer[0] == '2')
    {
        HAL_GPIO_TogglePin(GPIOF,10);
    }
    else
    {
                
    }
    uint8_t data_length  = BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
//    printf("Receive Data(length = %d): ",data_length);
    HAL_UART_Transmit(&huart1,rx_buffer,data_length,0x200);
//    printf("\r\n");

    memset(rx_buffer,0,data_length);
    data_length = 0;
    HAL_UART_Receive_DMA(&huart1, (uint8_t*)rx_buffer, BUFFER_SIZE);
}

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-22 14:19
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 从代码中可以看出,在接收到字符1时应该将LED灯反转。但实际上,LED灯却没有反转。同时,也没有搞错对应的IO口。因此,可以推断问题可能出现在中断处理过程中。 解决方案: 1.检查中断优先级配置是否正确。 2.检查是否正确启用了中断。 3.检查中断处理程序是否正确。 4.检查HAL库函数是否正确使用。 案例解析: 从代码中可以看出,在启用DMA接收数据后,在接收完成后会回调“USAR_UART_IDLECallback”函数。这个函数主要完成的是数据处理以及重新启用DMA接收数据等操作。 在这个函数中,接收到的数据会先被处理。而处理代码中主要的逻辑是,当接收到字符1时会反转LED灯。因此,可以先对这部分代码进行检查。 在处理字符1的代码中,使用了“HAL_GPIO_TogglePin”函数来实现LED灯状态的反转。检查这个函数的定义,可以发现这个函数是用来实现GPIO的输出电平反转的。而这里的GPIO输出电平与LED灯状态是一一对应的。因此,在处理代码中没有问题。 接下来,可以检查中断的配置是否正确。从代码中可以看出,代码已经正确地启用了UART接收中断。同时,在初始化代码中也正确地配置了GPIO端口。因此,可以排除中断优先级配置以及启用中断的问题。 接下来,可以考虑检查HAL库函数是否正确使用。从代码中可以看出,HAL库函数已经全部正确地被使用了。在这里不存在HAL库函数使用不当的问题。 最后,可以检查一下中断处理程序的逻辑。从代码中可以推断出,中断处理程序中主要的逻辑都是处理接收到的数据,因此处理程序的逻辑大部分是没有问题的。 因此,在排除了以上可能出现的问题后,建议进行以下几步操作: 1.检查硬件连接是否正确。 2.使用示波器或者调试输出等工具,对中断处理过程中的数据进行调试。 3.查阅STM32参考手册等资料,对相关中断处理过程的原理进行了解,帮助快速定位问题所在。
    评论

报告相同问题?

问题事件

  • 创建了问题 3月22日