STM32学习---基本定时器(定时中断)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XUCHEN1230/article/details/84449985

//STM32定时器实验:
/*
STM32一共有8个都为16位的定时器。
其中:
TIM6,TIM7是基本定时器;
TIM2,TIM3,TIM4,TIM5是通用定时器;
TIM1 和 TIM8 是高级定时器。
这是定时器的综合运用使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相六部电机控制及编码器接口等功能,都是专门为工控领域量身定做的。
*/

/*
一:定时器工作分析:
1.基本定时器:
基本定时器TIM6 和 TIM7 只具备最基本的定时功能,就是累加的时钟脉冲数超过预定值时,能 触发中断 或 触发DMA请求。
由于在芯片内部与DAC外设相连,可通过触发输出驱动DAC,也可作为其他通用定时器的时钟基准。

这两个基本定时器使用的时钟源都是TIMxCLK,时钟源经过PSC预分频器输入至脉冲计数器TIMx_CNT,基本定时器只能工作在向上技术模式,在
重载寄存器TIMx_ARR的计数器中保存的是定时器的溢出值。

工作时,脉冲计数器TIMx_CNT由时钟触发进行计数,当TIMx_CNT的计数值X等于重载寄存器TIMx_ARR中保存的数值N时,产生溢出时间,可触发中断或DMA请求。
然后TIMx_CNT的值重新被置为0,重新向上计数。
*/

对于基本定时器TIM6 和 TIM7 定义的步骤是:
1)对TIM外设首先进行时基定义:

void BaseTIM_CfgInit(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStu;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); 

    TIM_TimeBaseInitStu.TIM_Prescaler = 1000;           //预分频系数
    TIM_TimeBaseInitStu.TIM_Period = 72 - 1;            //重装载值  
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStu);

    //注意要开启定时器中断,这里使用更新事件中断
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

    //开启计数器
    TIM_Cmd(TIM6, ENABLE);
}

//如何算的预分频系数?72Mhz/(.TIM_Prescaler+1)*(.TIM_Period+1)=1/中断产生的间隔;
//其实在定义完.TIM_Period之后,还要定义一个.TIM_ClockDivision,这个结构体成员的定义影响的是:ETRP数字滤波器。而我们使用的是内部时钟,所以这个变量的定义对实验结果无影响。

2)随后定义NVIC:

void NVIC_CfgInit(void)
{
    NVIC_InitTypeDef NVIC_InitStu;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);     //设置中断分组寄存器
    NVIC_InitStu.NVIC_IRQChannel = TIM6_IRQn;           //外部中断线,定时器6
    NVIC_InitStu.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStu.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
    NVIC_InitStu.NVIC_IRQChannelSubPriority = 1;        //子优先级
    NVIC_Init(&NVIC_InitStu);
}

3)在stm32f10x_it.c中实现定时器超时的中断处理函数:

void TIM6_IRQHandler(void)
{
	static int i =0;
    if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
    {
			  i++;
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
    }
	if(i==1000){
		GPIO_WriteBit(GPIOD, GPIO_Pin_2,  
                (BitAction)((1-GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2))));
		i=0;
		}
}

//可以在其中设置if判断具体要中断的时间。

因为定时器的周期是 1ms,此时我设定的条件是及时1000次,即1s,灯的状态会取反。

猜你喜欢

转载自blog.csdn.net/XUCHEN1230/article/details/84449985