Allen嵌入式 2024-11-21 16:47 采纳率: 33.3%
浏览 8
已结题

stm32h750vb按键控制led不稳定

请问各位:
按键是pc13,led是pe3,现象就是led闪烁不受控制
下面是我的关键代码,用的hal库

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LED_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);

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

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* 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();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
      if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET)
      {
        HAL_Delay(30);
        if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET)
        {
            HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
            while (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET); 
        }
      }
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

小玩意长这样

img


不知道是我的问题还是板子的问题。

  • 写回答

1条回答 默认 最新

  • 铭渊老黄 新星创作者: Python技术领域 2024-11-21 16:59
    关注
    🕒下午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“成功不是终点,失败也不是致命的,继续前进的勇气才是最重要的。” — 温斯顿·丘吉尔
    

    看起来你的代码大致正确,但可能有一些细节需要调整。以下是一些建议,希望能帮助你解决问题:

    1. 确保按键连接正确:检查PC13和PE3的连接是否正确,确保没有短路或松动。
    2. **去除HAL_Delay()**:HAL_Delay()在嵌入式系统中可能不太稳定,建议使用定时器来实现延时。
    3. 检查外部干扰:确保没有外部干扰(如电磁干扰)影响按键和LED的工作。
    4. 使用Pull-up或Pull-down:尝试在按键引脚上使用内部上拉或下拉电阻,以减少噪声。

    你可以尝试以下代码来替换HAL_Delay()部分:

    /* USER CODE BEGIN WHILE */
    while (1)
    {
        if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET)
        {
            HAL_TIM_Base_Start_IT(&htim2); // 启动定时器中断
        }
    }
    /* USER CODE END WHILE */
    

    并在定时器中断函数中实现LED闪烁:

    void HAL_TIM_Base_IRQHandler(TIM_HandleTypeDef *htim)
    {
        if (htim->Instance == TIM2)
        {
            if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
            {
                if (__HAL_TIM_GET_ITSTATUS(htim, TIM_IT_UPDATE) != RESET)
                {
                    __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE);
                    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
                }
            }
        }
    }
    

    这样可以避免使用HAL_Delay()带来的不稳定性。希望这些建议对你有所帮助!如果问题依然存在,可以考虑检查硬件或尝试不同的开发板。😊

    你有尝试过其他的解决方案吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 已采纳回答 11月21日
  • 修改了问题 11月21日
  • 创建了问题 11月21日