STM32系列课程总结2---基本定时器+通用定时器

----------------案列一:基本定时器TIM6实现点灯----------------


#ifndef __TIM_H
#define __TIM_H

//头文件
#include "stm32f4xx.h"   //这个头文件一定要留
#include "led.h"

//宏定义
                    
//函数声明
void TIM6_Init(uint32_t Period,uint16_t Prescaler);

#endif 


#include "tim.h"

/*
 *  TIM6         --->APB1 定时器时钟  = 84MHz
 */

/*
 * 功  能:初始化 TIM6 口
 * 参  数:无
 * 返回值:无
 */
void TIM6_Init(uint32_t Period,uint16_t Prescaler)
{
    //时基结构体
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructrue;
    NVIC_InitTypeDef         NVIC_InitStructrue;
    
    //1、开启 TIM 时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

    //2、配置以及初始化 TIM
    //TIM_TimeBaseInitStructrue.TIM_ClockDivision
    TIM_TimeBaseInitStructrue.TIM_CounterMode = TIM_CounterMode_Up; //递增(默认从0开始计数)      //计数模式(递增还是递减)
    TIM_TimeBaseInitStructrue.TIM_Period      = Period;           //计数周期(计数次数)
    TIM_TimeBaseInitStructrue.TIM_Prescaler   = (Prescaler - 1);   //预分频(每隔多久计数一次) 
                                                   //Prescaler = 84 ,计数频率 = 84MHz/(84-1+1) = 1MHz  -->每隔1us计数一次
    //TIM_TimeBaseInitStructrue.TIM_RepetitionCounter
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStructrue);

    //3、开启更新(计数器上溢)中断
    TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE);
    
    //4、初始化 NVIC
    NVIC_InitStructrue.NVIC_IRQChannel = TIM6_DAC_IRQn;
    NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructrue.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructrue.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructrue);
    
    
    //TIM_Cmd(TIM6,DISABLE);   //执行这句话之后 计数器停止计数
    TIM_Cmd(TIM6,ENABLE);     //执行这句话之后 计数器开始计数
}    

uint16_t cnt = 0;
uint8_t  count = LED_OFF;

//TIM6_Init(1000,84);  //每隔 1us 计数一次,总计 1000 次 ,每隔 1ms 中断产生一次
//定时器计数溢出时触发更新中断,就会执行此中断函数
void TIM6_DAC_IRQHandler(void)
{
    //检测溢出中断是否发生
    if(TIM_GetFlagStatus(TIM6,TIM_FLAG_Update) != RESET)
    {
             //清除中断标志位
        TIM_ClearITPendingBit(TIM6,TIM_IT_Update); 
        cnt++;
        if(cnt == 1000)
        {
            cnt = 0;
            count = !count;
            LED0(count);
        }
    }
    
}
 
#include "stm32f4xx.h"   //类似于51单片机  #include <reg52.h>
#include "led.h" 
#include "systick.h"
#include "tim.h"

int main(void)
{
    //1、硬件初始化
    Systick_Init();
    GPIO_LED_Init();
    TIM6_Init(1000,84);
    
    while(1)  //这个位置不能少!!!
    { 
    }  
}


---------------案列二:通用定时器TIM3实现点灯-----------------
#ifndef __TIM_H
#define __TIM_H

//头文件
#include "stm32f4xx.h"   //这个头文件一定要留
#include "led.h"

//宏定义
                    
//函数声明
void TIM3_Init(uint32_t Period,uint16_t Prescaler);

#endif 


#include "tim.h"

/*
 *  TIM3         --->APB1 定时器时钟  = 84MHz
 */

/*
 * 功  能:初始化 TIM6 口
 * 参  数:无
 * 返回值:无
 */
void TIM3_Init(uint32_t Period,uint16_t Prescaler)
{
    //时基结构体
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructrue;
    NVIC_InitTypeDef         NVIC_InitStructrue;
    
    //1、开启 TIM 时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    //2、配置以及初始化 TIM
    TIM_TimeBaseInitStructrue.TIM_ClockDivision = TIM_CKD_DIV1;   //跟数字滤波器有关,我们用不上
    TIM_TimeBaseInitStructrue.TIM_CounterMode = TIM_CounterMode_Up; //递增(默认从0开始计数)      //计数模式(递增还是递减)
    TIM_TimeBaseInitStructrue.TIM_Period      = Period;           //计数周期(计数次数)
    TIM_TimeBaseInitStructrue.TIM_Prescaler   = (Prescaler - 1);   //预分频(每隔多久计数一次) 
                                                   //Prescaler = 84 ,计数频率 = 84MHz/(84-1+1) = 1MHz  -->每隔1us计数一次
    //TIM_TimeBaseInitStructrue.TIM_RepetitionCounter               //跟高级定时器有关,我们用不上
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructrue);

    //3、开启更新(计数器上溢)中断
    TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);
    
    //4、初始化 NVIC
    NVIC_InitStructrue.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructrue.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructrue.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructrue);
    
    
    //TIM_Cmd(TIM3,DISABLE);   //执行这句话之后 计数器停止计数
    TIM_Cmd(TIM3,ENABLE);     //执行这句话之后 计数器开始计数
}    

uint16_t cnt = 0;
uint8_t  count = LED_OFF;

//TIM3_Init(1000,84);  //每隔 1us 计数一次,总计 1000 次 ,每隔 1ms 中断产生一次
//定时器计数溢出时触发更新中断,就会执行此中断函数
void TIM3_IRQHandler(void)
{
    //检测溢出中断是否发生
    if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) != RESET)
    {
             //清除中断标志位
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 
        cnt++;
        if(cnt == 5000)
        {
            cnt = 0;
            count = !count;
            LED0(count);
        }
    }
    
}
 
 
#include "stm32f4xx.h"   //类似于51单片机  #include <reg52.h>
#include "led.h" 
#include "systick.h"
#include "tim.h"

int main(void)
{
    //1、硬件初始化
    Systick_Init();
    GPIO_LED_Init();
    TIM3_Init(1000,84);
    
    while(1)  //这个位置不能少!!!
    { 
    }  
}

猜你喜欢

转载自blog.csdn.net/wghkemo123/article/details/85127601