【STM32】高级定时器TIM1计数中断配置

这篇博客介绍了如何在STM32中配置高级定时器TIM1来实现计数模式,并通过蜂鸣器进行声音输出。内容包括GPIO初始化、TIM1配置、中断服务函数设置以及在main.c中的应用,使得蜂鸣器每隔100ms电平翻转一次,产生0.2s周期的声音信号。博主还提到了晶振分频的原因和中断处理的细节。
摘要由CSDN通过智能技术生成

记录高级定时器TIM1的配置过程

学习计数模式

通过蜂鸣器鸣叫展示代码

有源蜂鸣器:内部自带震荡体,通电就响

无源蜂鸣器:需要输入PWM

 之前Delay初始化的时候,晶振被8分频了,变成9MHz的频率了吗,why?

为啥要先分频呢?小声BB…… 

给蜂鸣器新建一个Beep.c和Beep.h

Beep.c 

#include "Beep.h"

void Beep_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_10MHz;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOF, GPIO_Pin_0);	//置高,蜂鸣器不响
}

void TIM_UserConfig (uint16_t Period, uint16_t Prescaler)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	TIM_TimeBaseInitTypeDef TIM_InitStructure;
	TIM_InitStructure.TIM_Period = Period;
	TIM_InitStructure.TIM_Prescaler = Prescaler;
	TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	//不分割时钟
	TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//向上计数
	TIM_InitStructure.TIM_RepetitionCounter = 0;	//重复计数次数,就是计数溢出即申请中断
	TIM_TimeBaseInit(TIM1, &TIM_InitStructure);	//初始化定时器
	
	TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除 TIM1 的中断待处理位,先清除,再开启中断
	TIM_ITConfig(TIM1, TIM_IT_Update | TIM_IT_Trigger, ENABLE);//开启计数器中断(定时器1,计数|触发中断源,使能)
	TIM_Cmd(TIM1, ENABLE);//使能计数器
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	//设置中断分组0,主优先级0,抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;//中断入口
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_Init(&NVIC_InitStructure);
	
}

void TIM1_UP_IRQHandler(void)
{
	//获取中断状态
	if( TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET )	//只要不等于0,就代表进来中断了
	{
		GPIO_WriteBit(GPIOF, GPIO_Pin_0, (BitAction)(!GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_0)));
		//进入中断,先把这个TIM_IT_Update清零
		TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
	}
}

Beep.h

#ifndef __BEEP_H__
#define __BEEP_H__

#include "stm32f10x.h"                  // Device header

void Beep_Init(void);
void TIM_UserConfig (uint16_t Period, uint16_t Prescaler);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Beep.h"

int main(void)
{
	Delay_Init(72);
	LED_Init();
	Beep_Init();
	TIM_UserConfig (1000-1, 7200-1);
	/*   72M
	如果7200分频,7200 0000 /7200 = 10000,就是1s计数10000
	1ms计数10个   100us计数1个
	
	写1000,就是计数100ms  */
	
	while(1)
	{
	}
}

蜂鸣器模块接在GPIOF的PIN0上,100ms电平反转一次,0.2s一个周期,鸣叫一次,50%的占空比

这里可以用逻辑分析仪抓取一下PF0引脚的波形……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北国无红豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值