- 注:我采用的是STM32F103RC芯片、相应的电路图和STM32CubeIDE软件
- 这是在STM32CubeIDE软件定义芯片后,所给的必要的代码逻辑,加上了注释
#include "main.h"
void SystemClock_Config(void);
##关键词解释
句柄 :对硬件资源或系统资源的抽象,通常用于标识和管理这些资源。通常是一个包含配置参数、状态信息和相关寄存器地址的结构体。定义句柄后,可以通过该句柄对相应的硬件外设进行配置、操作和管理。
int main(void)
{
HAL_Init();
HAL 库提供了一套统一的 API 来抽象硬件外设(如GPIO、ADC、UART、I2C、SPI等)的操作。
SystemClock_Config();
MX_ 前缀通常表示由 STM32CubeMX 工具生成的初始化代码,而不是开发者手动编写的函数。
while (1)
{
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {
0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {
0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
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_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
一、GPIO
- 在STM32中,GPIO(General Purpose Input/Output,通用输入/输出)是一个非常重要的外设,用于与外部设备进行交互。
- GPIO引脚可以通过软件配置为输入或输出,用于读取或控制外部设备的状态,如开关、LED、传感器等。
- STM32的GPIO引脚支持复用功能,可以与微控制器内部的外设(如USART、I2C、SPI、PWM等)直接连接,不需要外部额外连接线。通过这种模式,GPIO引脚可以与多种外设共同使用。
- GPIO引脚可以配置为模拟模式,用于模拟信号的输入或输出。例如,当使用ADC(模数转换器)或DAC(数模转换器)时,GPIO会被配置为模拟模式来读取或输出模拟电压信号。
- GPIO模块将管脚分组为PA PB PC PD,每一组为16个。
- 使用
- 由于我的电路图是PC6,PC7,PC8为LED灯连接。故配置它们为GPIO_Output,因此在代码中多了static void MX_GPIO_Init(void);
函数,进行串口的配置,故也要在main函数中GPIO初始化。 MX_GPIO_Init();
- 又因为PC2控制着LED的亮灭,故将PC2设置为GPIO_Intput,并将其上拉。
- 为什么上拉:芯片的管脚浮在空中,电平是不确定的.为了使之稳定,我们可以需要对其进行 上拉和下拉。
- 上拉(Pull-up)和下拉(Pull-down)是为了稳定输入引脚的电平状态,防止输入引脚悬空时产生不确定的电平。
- 上拉是

- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8, GPIO_PIN_SET);
用于将6,7,8管脚设置为输出状态。GPIO_PIN_RESET
可以将指定的 GPIO 引脚输出设为逻辑低电平(0V),通常表示逻辑0。
- HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8);
对输入输出取反操作,即设置一定的延时可以一闪一闪的。
- 利用PC2开关LED灯
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_RESET) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8, GPIO_PIN_RESET);
}
- GPIO输出的推挽和开漏
- 推挽输出(Push-pull output):引脚可以输出高电平或低电平,直接驱动负载。用于常见的数字信号输出。有一定的驱动能力
- 开漏输出(Open-drain output):引脚只能拉低(输出低电平),高电平需要外部上拉电阻实现。常用于I2C等总线通信。没有驱动能力

- 代码
#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int