这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 换逻辑分析仪_STM32F103_(HAL库)驱动GPIO操作,点亮LED

共1条 1/1 1 跳转至

换逻辑分析仪_STM32F103_(HAL库)驱动GPIO操作,点亮LED

工程师
2024-06-20 19:12:54   被打赏 13 分(兑奖)     打赏

在STM32F103系列微控制器上使用HAL库驱动GPIO来点亮LED是一个常见的例子。以下是一个简单的步骤和示例代码,演示如何使用STM32CubeMX配置并使用HAL库来控制GPIO,以点亮连接在STM32开发板上的LED。

下面开始用HAL库实现GPIO的使用,点亮LED。

1. 使用STM32CubeMX配置工程首先,确保你已经使用STM32CubeMX软件创建了一个新的工程,并正确配置了芯片和引脚。假设我们将使用PA4引脚来连接LED。

打开STM32CubeMX,选择你的STM32F103型号。

image.png

配置时钟和引脚:

在"Pinout & Configuration"选项卡中,找到PA4引脚,将其配置为GPIO输出。

image.png

生成代码:

点击"Prject"菜单 -> "Generate Code"生成初始化代码。

image.png

2. 修改生成的HAL库代码

生成代码后,STM32CubeMX会生成初始化HAL库的代码。我们需要在生成的代码基础上添加LED控制的功能。


示例代码以下是一个简单的示例代码,PA4用于连接LED。这段代码将点亮LED,并使用HAL库的函数来控制GPIO。
int main(void)
{
  /* MCU Configuration--------------------------------------------------------*/

  /* 初始化所有外设,初始化Flash接口和Systick */
  HAL_Init();

  /* 配置系统时钟 */
  SystemClock_Config();

  /* 初始化所有配置好的外设 */
  MX_GPIO_Init();

 /* 无限循环 */
  while (1)
  {
    /* 点亮LED */
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
    
    /* 延时500毫秒 */
    HAL_Delay(500);
    
    /* 熄灭LED */
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    
    /* 延时500毫秒 */
    HAL_Delay(500);
  }
}
HAL_Init(): 初始化HAL库。这个函数初始化了微控制器的系统时钟和一些基本的系统定时器。SystemClock_Config(): 配置系统时钟。这个函数设置了微控制器的主时钟源(HSE晶振),并配置了PLL(锁相环)使得主时钟频率为72MHz。MX_GPIO_Init(): 初始化GPIO。这个函数配置了GPIOA的引脚4(PA4)为推挽输出模式,初始状态为低电平(LED熄灭)。while(1): 无限循环,程序会不断地执行循环体内的操作。HAL_GPIO_WritePin(): 这个函数用来控制GPIO引脚的电平。HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)将PA5引脚的电平设置为高电平(3.3V),从而点亮LED。HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)将PA4引脚的电平设置为低电平(0V),从而熄灭LED。HAL_Delay(): 这个函数提供了毫秒级别的延时。在点亮LED后,程序会延时500毫秒,然后熄灭LED并再次延时500毫秒,实现LED的周期性闪烁效果。GPIO 初始化 (MX_GPIO_Init 函数):
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* 使能GPIOA时钟 */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* 配置GPIO引脚的输出电平 */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

  /* 配置GPIO引脚 PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出模式
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
__HAL_RCC_GPIOA_CLK_ENABLE(): 使能GPIOA的时钟。GPIO时钟必须在配置GPIO引脚之前被启用。HAL_GPIO_WritePin(): 在配置完成之后,将PA5引脚的输出电平初始化为低电平,确保LED初始状态为熄灭状态。GPIO_InitStruct 结构体: 这是一个GPIO初始化结构体,包括了引脚号、模式(输出推挽)、速度等配置。系统时钟配置 (SystemClock_Config 函数):
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /* 初始化CPU、AHB和APB总线的时钟 */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 使用外部晶振
  RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 启动外部晶振
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 启用PLL
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // PLL时钟源选择外部晶振
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // PLL倍频系数为9,得到72MHz的系统时钟
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /* 初始化CPU、AHB和APB总线的时钟 */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟源选择PLL
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟不分频,即为SYSCLK
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟分频为SYSCLK的二分之一,即36MHz
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟不分频,即为SYSCLK
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}
RCC_OscInitTypeDef 和 RCC_ClkInitTypeDef 结构体: 这些结构体包含了初始化时钟的配置信息,包括时钟源、分频因子等。HAL_RCC_OscConfig() 和 HAL_RCC_ClockConfig(): 这些函数分别用于配置外部晶振、PLL和系统时钟,确保系统时钟配置正确。3. 编译和下载将修改后的代码编译并下载到STM32F103开发板上。确认PA4引脚的LED应该随着代码的运行而周期性地亮灭。

image.png

4、实际点亮效果:

8f617c666c7e4bc8bacee9e75bf324a.jpg

总结以上代码演示了如何使用STM32CubeMX生成的初始化代码结合HAL库来控制STM32F103微控制器上的GPIO引脚,从而实现LED的点亮和熄灭。确保在使用之前,已经正确配置LED PA5引脚,并且STM32F103的硬件和时钟配置是正确的。

总的来班次,与寄存器相比,这个HAL要省事很多。














共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]