1. 编译心得:
① 在 ISO C标准中强制要求一个C源代码文件的最后一行必须是一个换行符(即必须以一个新行结束),否则会有警告。
② 杜邦线如图所示:
PS:在做该实验的时候,记得要把杜邦线连到 ST-Link 下面一排,不然会无法驱动!
2. LED 闪烁工程
① 常见的函数声明:
// 时钟控制 (RCC)
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); // ★ 使能GPIO端口时钟(必须调用)
// GPIO初始化和配置
void GPIO_DeInit(GPIO_TypeDef* GPIOx); // 复位指定的GPIO端口
void GPIO_AFIODeInit(void); // 复位AFIO外设(用于复用/重映射)
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); // ★ 核心配置函数
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); // 初始化结构体为默认值
// GPIO读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 读取指定输入引脚状态
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); // 读取整个端口的输入数据
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 读取指定输出引脚状态
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); // 读取整个端口的输出数据
// GPIO输出控制函数 ★常用
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 置位指定引脚(输出高电平)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // 复位指定引脚(输出低电平)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); // 写入单个引脚状态
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); // 写入整个端口的输出状态
② LED 流水灯
(1) 如何“同时控制” 16个引脚?
- 初始化配置:通过 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All 一次性配置了 PA0 ~ PA15 全部引脚为输出模式,使能了整组端口的控制能力。
- 批量写入数据:GPIO_Write(GPIOA,data) 函数会向 GPIOA 寄存器一次性写入 16 位数据,每条指令都能同时设置全部 16 个引脚的电平状态。
(2) 为什么要按位取反(使用了 ~ 符号)
① 实际运算顺序:
- 先计算 0x0001 → 结果:0000 0000 0000 0001(这个是16进制)
- 再执行取反 ~ → 结果:1111 1111 1111 1110
- 最后写入寄存器:PA0=0(低电平),其他=1(高电平)
② LED 物理连接方式
- 假设您的 LED 是 阴极接地(更常见的接法)
- 此时 GPIO 输出低电平(0)时导通点亮
- GPIO输出高电平(1)时截止熄灭
3. 蜂鸣器
① 电平控制原理
- GPIO_ResetBits(GPIOB, GPIO_Pin_12):将 PB12 设为低电平(0) → 蜂鸣器响
- GPIO_SetBits(GPIOB, GPIO_Pin_12):将 PB12 设为高电平(1) → 蜂鸣器停