注意
有一些端口主功能是调试或者其他的选择时要注意
例如:PA14 是 STM32 微控制器上的一个引脚,通常用于 JTCK/SWCLK,这是一种调试和编程的信号线。
如果你的 STM32 微控制器的 PA15 引脚主功能是 JTDI(JTAG 调试接口的一部分),而你需要使用该引脚控制蜂鸣器,你可能会面临以下几个问题和解决方法:
问题与解决方法:
-
JTAG 调试接口冲突:
- 问题:如果 PA15 被配置为 JTDI,这意味着该引脚用于 JTAG 调试,这可能与 GPIO 功能发生冲突。
- 解决方法:检查是否可以在 STM32 的配置中禁用 JTAG 接口并将 PA15 配置为普通 GPIO。如果你不需要 JTAG 调试功能,可以使用 STM32 的配置工具(如 STM32CubeMX)来禁用 JTAG 接口或将其改为 SWD(Serial Wire Debug)模式。
-
引脚功能复用:
- 问题:STM32 的引脚通常可以配置为多种功能。PA15 可能被设置为 JTAG 功能。
- 解决方法:使用 STM32CubeMX 或手动修改寄存器配置,设置 PA15 为 GPIO 模式而不是 JTAG 模式。确保在代码中正确配置引脚功能。
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 启用 GPIOA 时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* 配置 PA15 为普通 GPIO 输出 */
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
代码和调试:
- 问题:代码中可能没有正确初始化 PA15 或没有正确设置其状态。
- 解决方法:确保你的代码中初始化了 PA15 引脚,并使用正确的逻辑来控制蜂鸣器。
-
使用其他引脚:
- 问题:如果无法禁用 JTAG 接口,可能需要寻找其他引脚来控制蜂鸣器。
- 解决方法:选择一个没有被占用的 GPIO 引脚,并将其配置为控制蜂鸣器。检查 STM32 的引脚复用表,选择合适的替代引脚。
-
硬件连接:
- 问题:确保蜂鸣器的电源和接地连接正确。
- 解决方法:确认蜂鸣器的连接线和电源连接是否稳固。
蜂鸣器
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
蜂鸣器电路结构是三极管,本代码用的是图1的原理图
Buzzer.c
#include "stm32f10x.h" // Device header
/**
* 函 数:蜂鸣器初始化
* 参 数:无
* 返 回 值:无
*/
void Buzzer_Init(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //将PB12引脚初始化为推挽输出
/*设置GPIO初始化后的默认电平*/
GPIO_SetBits(GPIOB, GPIO_Pin_12); //设置PB12引脚为高电平(作者的元器件蜂鸣器为低电平触发)
}
/**
* 函 数:蜂鸣器开启
* 参 数:无
* 返 回 值:无
*/
void Buzzer_Open(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //设置PB12引脚为低电平
}
/**
* 函 数:蜂鸣器关闭
* 参 数:无
* 返 回 值:无
*/
void Buzzer_OFF(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_12); //设置PB12引脚为高电平
}
Buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_H
void Buzzer_Init(void);
void Buzzer_Open(void);
void Buzzer_OFF(void);
#endif
传感器模块
传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

LIghtSensor.c
#include "stm32f10x.h" // Device header
/**
* 函 数:光敏传感器初始化
* 参 数:无
* 返 回 值:无
*/
void LightSensor_Init(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**
* 函 数:获取当前光敏传感器输出的高低电平
* 参 数: GPIO_ReadInputDataBit 读取io输入管脚的值
* 返 回 值:光敏传感器输出的高低电平,范围:0/1
*/
uint8_t LightSensor_Get(void)
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13); //返回PB13输入寄存器的状态
}
LightSensor.h
#ifndef __LIGHTSENSOR_H
#define __LIGHTSENSOR_H
void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LightSensor.h"
#include "Buzzer.h"
int main(void)
{
/*模块初始化*/
Buzzer_Init(); //蜂鸣器初始化
LightSensor_Init(); //光敏传感器初始化
while(1)
{
if (LightSensor_Get() == 1) //如果当前光敏输出1
{
Buzzer_Open(); //蜂鸣器开启
}
else //否则
{
Buzzer_OFF(); //蜂鸣器关闭
}
}
}