搜档网
当前位置:搜档网 › 基于STM32F103VET6定时器中断

基于STM32F103VET6定时器中断

这个程序演示了一个简单的定时器中断,对于初学者很实用,本人亲测过,定时器设置了五秒的定时,
当PD口的两个灯闪亮的时间超过了五秒就会进入中断程序,会闪亮的更快,延时时间短了一点
#include "stm32f10x.h"
void RCC_Configuration(void);
void GPIO_Config(void);
void TIM4_IRQHandler(void);
void NVIC_Configuration(void);
void TIM_Tim4Config(void);
int main(void)
{


RCC_Configuration();
GPIO_Config();
TIM_Tim4Config();
NVIC_Configuration();

while(1)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_3);//PD6,PD3端口的灯交替闪亮
delay_ns(3);
GPIO_SetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_3);
delay_ns(3);

TIM4_IRQHandler();//进入中断服务程序
}
}
void TIM4_IRQHandler(void) 中断处理函数
{
u8 i=0;
if(TIM_GetITStatus(TIM4,TIM_IT_Update )!=RESET) 判断中断标志位是否有更新事件,即定时5秒时间到了
{
TIM_ClearITPendingBit(TIM4,TIM_IT_Update ); 清除中断挂起位,等待产生下一次中断,否则无法继续产生中断
for(;i<5;i++) 执行下面的程序5次,这里只改变了延时的时间,演示一下进入中断服务程序
{
GPIO_ResetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_3);
delay_ns(1);
GPIO_SetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_3);
delay_ns(1);
}
}
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_1); 中断分组
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; 中断请求通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 使能中断请求通道
NVIC_Init(&NVIC_InitStructure); 初始化
}

void GPIO_Config(void) GPIO配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
}
void TIM_Tim4Config(void)//定时了5秒,因为,周期为6000个数,一秒计数1200个
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period =5999; 计满6000为一个周期,更新一次,即产生一次中断
TIM_TimeBaseStructure.TIM_Prescaler = 59999; 72M/60000=1200,一秒可计数1200个
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 向上计数
//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; 通常设置为0
T

IM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure); 初始化
TIM_ARRPreloadConfig(TIM4, ENABLE); 重载ARR寄存器的值,否则只计数一个周期
TIM_ClearFlag(TIM4,TIM_FLAG_Update); 清除中断标志位,可能之前使用过它的中断,所以每次使用中断都要清空
TIM_ITConfig(TIM4,TIM_IT_Update ,ENABLE); 使能中断标志位更新
TIM_Cmd(TIM4,ENABLE); 使能定时器
}






相关主题