STM32F401RE核子发光二极管和按钮示例

STM32F401RE核子发光二极管和按钮示例,stm32,Stm32,我想在我的新核子板上运行一个简单的程序 我制作这个程序是为了在按下用户按钮时打开和关闭绿色led,蓝色的 #include "stm32f4xx.h" #include "stm32f4xx_nucleo.h" #include "system_stm32f4xx.h" #include "stm32f4xx_hal_gpio.h" #include "stm32f4xx_hal_rcc.h" GPIO_InitTypeDef GPIO_InitStructure; int main(vo

我想在我的新核子板上运行一个简单的程序

我制作这个程序是为了在按下用户按钮时打开和关闭绿色led,蓝色的

#include "stm32f4xx.h"
#include "stm32f4xx_nucleo.h"
#include "system_stm32f4xx.h"
#include "stm32f4xx_hal_gpio.h"
#include "stm32f4xx_hal_rcc.h"

GPIO_InitTypeDef GPIO_InitStructure; 

int main(void) {

    HAL_Init(); 

    __GPIOA_CLK_ENABLE();
    GPIO_InitStructure.Pin   = GPIO_PIN_5;
    GPIO_InitStructure.Mode  = GPIO_MODE_OUTPUT_PP;    
    GPIO_InitStructure.Pull  = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;  
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);    

    __GPIOC_CLK_ENABLE();
    GPIO_InitStructure.Pin   = GPIO_PIN_13;
    GPIO_InitStructure.Mode  = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull  = GPIO_PULLDOWN;
    GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

    while (1) {
        if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {         
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); 
        } else {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
        }
    }
}
但我得到了错误的结果:

当我按下用户按钮时,什么也没发生, 当我一直按用户按钮,然后按黑色按钮重新启动时,我得到了很好的结果, 看起来程序只在第一次运行时检查蓝色按钮的状态,我不知道为什么


如果您对问题的起因有任何想法,或者您有一个正在运行的程序可以打开led按钮,请帮助我。

将GPIO\U下拉模式更改为GPIO\U浮动或类似模式

将GPIO_下拉模式更改为GPIO_浮动或类似模式

将按钮的GPIO拉力设置为上拉:

#include "stm32f4xx.h"
#include "stm32f4xx_nucleo.h"
#include "system_stm32f4xx.h"
#include "stm32f4xx_hal_gpio.h"
#include "stm32f4xx_hal_rcc.h"

GPIO_InitTypeDef GPIO_InitStructure; 

int main(void) {

    HAL_Init(); 

    __GPIOA_CLK_ENABLE();
    GPIO_InitStructure.Pin   = GPIO_PIN_5;
    GPIO_InitStructure.Mode  = GPIO_MODE_OUTPUT_PP;    
    GPIO_InitStructure.Pull  = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;  
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);    

    __GPIOC_CLK_ENABLE();
    GPIO_InitStructure.Pin   = GPIO_PIN_13;
    GPIO_InitStructure.Mode  = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull  = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

    while (1) {
        if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {         
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); 
        } else {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
        }
    }
}

将按钮的GPIO Pull设置为PULLUP:

#include "stm32f4xx.h"
#include "stm32f4xx_nucleo.h"
#include "system_stm32f4xx.h"
#include "stm32f4xx_hal_gpio.h"
#include "stm32f4xx_hal_rcc.h"

GPIO_InitTypeDef GPIO_InitStructure; 

int main(void) {

    HAL_Init(); 

    __GPIOA_CLK_ENABLE();
    GPIO_InitStructure.Pin   = GPIO_PIN_5;
    GPIO_InitStructure.Mode  = GPIO_MODE_OUTPUT_PP;    
    GPIO_InitStructure.Pull  = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;  
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);    

    __GPIOC_CLK_ENABLE();
    GPIO_InitStructure.Pin   = GPIO_PIN_13;
    GPIO_InitStructure.Mode  = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull  = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

    while (1) {
        if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {         
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); 
        } else {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
        }
    }
}

我也有同样的问题这是我如何解决的:

while (1) {
        int stateOfPushButton = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
        if ( stateOfPushButton == 1 ) {         
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); 
        } else {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
        }
    }

我也有同样的问题这是我如何解决的:

while (1) {
        int stateOfPushButton = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
        if ( stateOfPushButton == 1 ) {         
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); 
        } else {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
        }
    }

如果您的按钮具有更高的电流种类,如my mechanical 2状态开关,则您需要使用此代码:

GPIO_InitStructure.Pull  = GPIO_PULLUP;
添加int变量也不会有什么坏处,只要确保在启动main while函数之前只初始化变量一次,否则就会导致内存泄漏

另外,我发现您不熟悉函数,请尝试以下操作:

int main(void) {

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

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    HAL_Init();
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* start your stuff*/
        /* doping stuff*/
        /* end your stuff*/
    }

}

/* System Clock Configuration*/
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
      Error_Handler();
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                        |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
      Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pins : P_BUT_Pin R_BUT_Pin O_BUT_Pin I_CSW_Pin */
  GPIO_InitStruct.Pin = P_BUT_Pin|R_BUT_Pin|O_BUT_Pin|I_CSW_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : P_LED_Pin R_LED_Pin O_LED_Pin C_LED_Pin */
  GPIO_InitStruct.Pin = P_LED_Pin|R_LED_Pin|O_LED_Pin|C_LED_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, P_LED_Pin|R_LED_Pin|O_LED_Pin|C_LED_Pin, 
GPIO_PIN_RESET);

}

或者如果你不自信,考虑使用这样的工具:[

< P> >如果你的按钮是像我的机械2状态开关那样的更高的电流种类,那么你想使用的代码是:< /P>
GPIO_InitStructure.Pull  = GPIO_PULLUP;
添加int变量也不会有什么坏处,只要确保在启动main while函数之前只初始化变量一次,否则就会导致内存泄漏

另外,我发现您不熟悉函数,请尝试以下操作:

int main(void) {

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

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    HAL_Init();
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* start your stuff*/
        /* doping stuff*/
        /* end your stuff*/
    }

}

/* System Clock Configuration*/
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
      Error_Handler();
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                        |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
      Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pins : P_BUT_Pin R_BUT_Pin O_BUT_Pin I_CSW_Pin */
  GPIO_InitStruct.Pin = P_BUT_Pin|R_BUT_Pin|O_BUT_Pin|I_CSW_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : P_LED_Pin R_LED_Pin O_LED_Pin C_LED_Pin */
  GPIO_InitStruct.Pin = P_LED_Pin|R_LED_Pin|O_LED_Pin|C_LED_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, P_LED_Pin|R_LED_Pin|O_LED_Pin|C_LED_Pin, 
GPIO_PIN_RESET);

}

或者如果你不自信,考虑使用这样的工具:[/p>每当你下载代码到你的板上时,Mac会停留在一个重置模式,这就是为什么你的代码看起来不起作用。一旦你按下黑重置按钮,它将从主代码运行你的代码,一切都会很好。


只要记住每次在micro上刷新新代码时都要进行重置。

每当您将代码下载到主板时,micro都会保持重置模式,这就是代码无法工作的原因。一旦按下黑色重置按钮,它将从main运行代码,一切都会正常工作


只要记住每次在micro上刷新新代码时都要重置。

如果您使用Keil MDK,请转到您的目标选项->调试->选择您正在使用的调试器,然后单击下载函数中的设置->选中“重置并运行”,这样每次在Nucleo板上刷新代码时代码都会重置并运行


使用my Nucleo-F401RE,您的代码和GPIO设置可以在CubeMX IDE上运行,如果您使用的是Keil IDE,您只需在Keil中启用“重置并运行”即可。

如果您使用Keil MDK,请转到您的目标选项->调试->选择您正在使用的调试器,然后单击下载函数中的设置->检查“重置并运行”,以便代码重置并运行e每次你在你的核子板上闪光的时候

您的代码和GPIO设置在使用my Nucleo-F401RE的CubeMX IDE上工作,如果您使用的是IDE,您只需在Keil中启用“重置并运行”