在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"生成初始化代码。

生成代码后,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、实际点亮效果:

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