基于stm32f407蜂鸣器闹铃编程代码,不要#include "stm32f4xx_hal.h"库
时间: 2024-12-13 21:16:49 浏览: 8
Keil.STM32F4xx_DFP.2.16.0
在STM32F407单片机上编写基于定时器控制蜂鸣器作为闹钟的基本代码,通常会使用硬件中断来触发声音。由于你要求不使用HAL库,我们将直接使用寄存器操作和中断服务函数。这里是一个简化版的示例:
```c
#include "stm32f4xx.h"
// 定义蜂鸣器引脚
#define Buzzer_Pin GPIO_PIN_5
#define Buzzer_GPIO_PORT GPIOB
void init_buzzer(void) {
// 配置GPIO
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = Buzzer_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Buzzer_GPIO_PORT, &GPIO_InitStructure);
// 设置Buzzer_Pin为输入模式,方便设置状态
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(Buzzer_GPIO_PORT, &GPIO_InitStructure);
}
void interrupt_service Routine_TIM4_IRQHandler(void) {
static uint8_t state = 0;
if (TIM4->SR & TIM_SR_UIF) { // 如果有溢出标志
TIM4->SR |= TIM_ISR_UIE; // 清除溢出标志并允许再次中断
TIM4->CR1 &= ~TIM_CR1_CEN; // 关闭计数器
if (state == 0) { // 当前状态是低电平
GPIO_SetBits(Buzzer_GPIO_PORT, Buzzer_Pin); // 开始响铃
state = 1;
} else { // 当前状态是高电平
GPIO_ResetBits(Buzzer_GPIO_PORT, Buzzer_Pin); // 停止响铃
state = 0;
}
}
}
int main(void) {
init_buzzer();
// 初始化定时器 TIM4 用于1秒周期
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.TIM_Period = 9999; // 10ms周期,4通道计数,9999表示10000减去1
TIM_InitStruct.TIM_Prescaler = 768; // 根据系统时钟调整
TIM_InitStruct.TIM_ClockDivision = 0;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_InitStruct);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM4_IRQn); // 启动TIM4中断
while (1) {}
}
阅读全文