在STM32F103系列微控制器上使用HAL库驱动GPIO来点亮LED是一个常见的例子。以下是一个简单的步骤和示例代码,演示如何使用STM32CubeMX配置并使用HAL库来控制GPIO,以点亮连接在STM32开发板上的LED。
下面开始用HAL库实现GPIO的使用,点亮LED。
1. 使用STM32CubeMX配置工程首先,确保你已经使用STM32CubeMX软件创建了一个新的工程,并正确配置了芯片和引脚。假设我们将使用PA4引脚来连接LED。打开STM32CubeMX,选择你的STM32F103型号。
配置时钟和引脚:在"Pinout & Configuration"选项卡中,找到PA4引脚,将其配置为GPIO输出。
生成代码:点击"Prject"菜单 -> "Generate Code"生成初始化代码。
2. 修改生成的HAL库代码生成代码后,STM32CubeMX会生成初始化HAL库的代码。我们需要在生成的代码基础上添加LED控制的功能。
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应该随着代码的运行而周期性地亮灭。
4、实际点亮效果:
总结以上代码演示了如何使用STM32CubeMX生成的初始化代码结合HAL库来控制STM32F103微控制器上的GPIO引脚,从而实现LED的点亮和熄灭。确保在使用之前,已经正确配置LED PA5引脚,并且STM32F103的硬件和时钟配置是正确的。总的来班次,与寄存器相比,这个HAL要省事很多。