1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【STM32】高级定时器TIM1计数中断配置

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

时间:2020-11-23 17:55:10

相关推荐

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

记录高级定时器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,抢占优先级3NVIC_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 headervoid 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计数100001ms计数10个 100us计数1个写1000,就是计数100ms */while(1){}}

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。