战舰开发板V4——蜂鸣器

战舰开发板V4——蜂鸣器

image-20260729213159699

image-20260729213238156

image-20260729213254277

LED驱动代码:

#include "Led.h"  

/* 蜂鸣器高电平触发 */

/**
  * @brief   初始化LED相关IO口,并使能时钟
	* @param   无
	* @retval  无
	*/
void Led_Init(void)
{
	GPIO_InitTypeDef GPIO_Init_Struct;
	LED0_GPIO_CLK_ENABLE();                             /* LED0 时钟使能 */
	LED1_GPIO_CLK_ENABLE();                             /* LED1 时钟使能 */
		                                                  
	GPIO_Init_Struct.Pin = LED0_GPIO_PIN;               /* LED0 引脚 */
	GPIO_Init_Struct.Mode = GPIO_MODE_OUTPUT_PP;        /* 推挽输出 */
	GPIO_Init_Struct.Pull = GPIO_PULLUP;                /* 上拉 */
	GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH;      /* 高速 */
	HAL_GPIO_Init(LED0_GPIO_PORT, &GPIO_Init_Struct);   /* LED0引脚 初始化 */
	
	GPIO_Init_Struct.Pin = LED1_GPIO_PIN;               /* LED1 引脚 */
	HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_Init_Struct);   /* LED1引脚 初始化 */
	
	LED0(1);                                            /* 关闭 LED0 */
	LED1(1);                                            /* 关闭 LED1 */	
}

#ifndef __LED_H
#define __LED_H

#include "main.h"

/* 定义 引脚 */

#define LED0_GPIO_PORT                  GPIOB
#define LED0_GPIO_PIN                   GPIO_PIN_5
#define LED0_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)   /* PB口时钟使能 */

#define LED1_GPIO_PORT                  GPIOE
#define LED1_GPIO_PIN                   GPIO_PIN_5
#define LED1_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)   /* PE口时钟使能 */

/* LED端口定义 */

#define LED0(x)        do{x ?\
	                         HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET):\
	                         HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET);\
	                         	}while(0);   /* LED0 翻转 */

#define LED1(x)        do{x ?\
	                         HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET):\
	                         HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);\
	                         	}while(0);   /* LED1 翻转 */
/* LED取反定义 */
#define LED0_TOGGLE()  do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0);   /* 翻转LED0 */
#define LED1_TOGGLE()  do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); }while(0);   /* 翻转LED1 */

/* 外部函数接口 */
void Led_Init(void);      /* 初始化 */

#endif

蜂鸣器驱动代码:

#include "Beep.h"

/**
 * @brief  初始化 BEEP 相关 IO 口,并使能时钟
 * @param  无
 * @retval 无
 */

// 蜂鸣器初始化函数 BEEP_Init()

void Beep_Init(void)
{
	GPIO_InitTypeDef GPIO_Init_Struct;                /* 定义 GPIO 结构体名 */
	BEEP_GPIO_CLK_ENABLE();							  /* BEEP 时钟使能 */
	
	GPIO_Init_Struct.Pin = BEEP_GPIO_PIN;             /* 蜂鸣器引脚 */
	GPIO_Init_Struct.Mode = GPIO_MODE_OUTPUT_PP;      /* 推完输出 */
	GPIO_Init_Struct.Pull = GPIO_NOPULL;              /* 悬空 */
	GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH ;   /* 高速 */
	HAL_GPIO_Init(BEEP_GPIO_PORT, &GPIO_Init_Struct); /* 初始化蜂鸣器引脚 */
	
	BEEP(0);                                          /* 关闭蜂鸣器 */
}

#ifndef __BEEP_H
#define __BEEP_H


#include "main.h"

/* 引脚定义 */
#define BEEP_GPIO_PORT            GPIOB
#define BEEP_GPIO_PIN             GPIO_PIN_8

/* PB 口时钟使能 */
#define BEEP_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)  

// do { ... } while(0) 是 C 语言宏定义标准写法,专门解决宏在分支语句下的语法 BUG
// __HAL_RCC_GPIOB_CLK_ENABLE();    __内部私有接口、底层定义,不建议用户直接修改

/* 蜂鸣器控制 */
#define BEEP(x)           do{ x ? \
							HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_SET) : \
							HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_RESET); \
                              }while(0)     

/* BEEP状态翻转 */
#define BEEP_TOGGLE()     do{ HAL_GPIO_TogglePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN);\
							  }while(0)

/* 外部接口函数 */												
void Beep_Init(void);   

#endif

主函数代码:

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"     // 主头文件
#include "gpio.h"     // 引入 GPIO初始化文件
#include "Beep.h"     // 引入 BEEP头文件
#include "Led.h"      // 引入 LED头文件
/* Initialize all configured peripherals */
MX_GPIO_Init();  // 初始化GPIO(CubeMX生成)
/* USER CODE BEGIN 2 */
   // 用户代码区 2
   Beep_Init();     // 蜂鸣器 初始化
   Led_Init();      // LED 初始化
while (1)   //无限主循环,程序主体在这里循环执行
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
  //循环内部,所有业务逻辑写这里
   BEEP(0);
   LED0(0);
   HAL_Delay(500);
   BEEP(1);
   LED0(1);
   HAL_Delay(500);

image-20260729214042038

posted @ 2026-07-29 21:41  Q&25  阅读(3)  评论(0)    收藏  举报