情况如下:通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)[其中,我们可以在里面创新一下,我创新的是蜂鸣器200ms响一次,然后500ms,LED1取反]
一般步骤就是:
①:使能定时器时钟
RCC_APB1PeriphClockCmd();
②:初始化定时器,配置ARR,PSC
TIM_TimeBaseInit();
③:开启定时器中断,配置NVIC
void TIM_ITConfig();
NVIC_Init();
④:使能定时器
TIM_Cmd();
⑥:编写中断服务函数
TIMx_IRQHandler();
我们先写.h文件
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM3_Init_Init(u16 arr,u16 psc);
#endif
然后我们按着步骤一步步写.c文件
#include "timer.h"
#include "led.h"
void TIM3_Init_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStruct.TIM_Period=arr;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
PBout(5)=!PBout(5);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
最后,我们写主函数
#include "beep.h"
#include "led.h"
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "exti.h"
#include "iwdg.h"
#include "timer.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
LED_Init();
BEEP_Init();
TIM3_Init_Init(4999,7199);
while(1){
PBout(8)=!PBout(8);
delay_ms(200);
}
}
最后,效果展示图,大家脑补一下蜂鸣器滴滴响,LED一直闪烁(这动态的我也不好拍)