TIM.c文件
#include "TIM.h"
#include "systick.h"
void Delay_TIM(float time)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitTypeDefStruct;
int S = 2000*time;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitTypeDefStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitTypeDefStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitTypeDefStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitTypeDefStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitTypeDefStruct);
//使能定时器的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//时钟一分频,时钟决定了计数一次需要花费的时间,系统时间为72MHz,则计数一次需要花费1/72us
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//周期,即要走1000*(36000-1)
TIM_TimeBaseInitStructure.TIM_Period = S;
//装载值,即花费的时间是36000*1/72us
TIM_TimeBaseInitStructure.TIM_Prescaler = 36000-1;
//向上计数
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
//配置定时器中断类型,并使能
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//清除中断标志位
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//使能TIM4
TIM_Cmd(TIM3, ENABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update))
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
delay_nms(500);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
main.c文件:
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "systick.h"
#include "TIM.h"
int main(void)
{
key_init();
led_init();
Delay_TIM(5);
while(1)
{
// GPIO_SetBits(GPIOB, GPIO_Pin_0);
// GPIO_ResetBits(GPIOB, GPIO_Pin_1);
// delay_nms(500);
// GPIO_SetBits(GPIOB, GPIO_Pin_1);
// GPIO_ResetBits(GPIOB, GPIO_Pin_0);
// delay_nms(500);
}
}
实现的功能是定时器每5秒进入中断服务函数中使led灯隔0.5s闪烁一次。这里的systick定时器没有开启中断,如果开启中断应该注意中断的优先级。