实验8:定时器中断实验(通用定时器)

一、通用定时器功能框图

实验8:定时器中断实验(通用定时器)_第1张图片

    (1)时钟选择

          计数器时钟可以由下列时钟源提供:

          1》内部时钟(CK_INT)

实验8:定时器中断实验(通用定时器)_第2张图片

          SYSCLK = 168M;

          AHB时钟 = 168M;

          APB1时钟 = 42M;

          所以,APB1的分频系数 = AHB / APB1时钟 = 4;

          所以,通用定时器时钟CK_INT = CK_PSC = 2 * 42M = 84M。

          2》外部时钟模式1:外部输入脚(TIx)

          4》外部时钟模式2:外部触发输入(ETR)(仅适用TIM2,3,4)

          5》内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。

    (2)计数器模式

          通用定时器可以向上计数、向下计数、向上向下双向计数模式。

          1》向上计数模式

              计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

实验8:定时器中断实验(通用定时器)_第3张图片

          2》向下计数模式

              计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

实验8:定时器中断实验(通用定时器)_第4张图片

          3》中央对齐模式(向上/向下计数)

              计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

实验8:定时器中断实验(通用定时器)_第5张图片

二、中断实验相关寄存器

    (1) 计数器当前值寄存器CNT

实验8:定时器中断实验(通用定时器)_第6张图片

    (2) 预分频寄存器TIMx_PSC

实验8:定时器中断实验(通用定时器)_第7张图片

    (3) 自动重装载寄存器(TIMx_ARR)

实验8:定时器中断实验(通用定时器)_第8张图片

    (4) 控制寄存器1(TIMx_CR1)

实验8:定时器中断实验(通用定时器)_第9张图片

    (5) 中断使能寄存器(TIMx_DIER)

实验8:定时器中断实验(通用定时器)_第10张图片

三、结构体

    typedef struct

    {

        uint16_t   TIM_Prescaler;                  //设置预分频系数,取值范围:0x0000 ~ 0xFFFF。

        uint16_t   TIM_CounterMode;           //设置计数方式。

                                                                    TIM_CounterMode_Up (向上计数)       
                                                                    TIM_CounterMode_Down (向下计数)         
                                                                    TIM_CounterMode_CenterAligned1
                                                                    TIM_CounterMode_CenterAligned2
                                                                    TIM_CounterMode_CenterAligned3

        uint32_t   TIM_Period;                      //设置自动重装载计数周期,取值范围:0x0000 ~ 0xFFFF。

        uint16_t   TIM_ClockDivision;           //设置时钟分频因子。

                                                                    TIM_CKD_DIV1(1分频)
                                                                    TIM_CKD_DIV2(2分频)
                                                                    TIM_CKD_DIV4(4分频)

        uint8_t     TIM_RepetitionCounter;   //高级定时器才会用到。

    } TIM_TimeBaseInitTypeDef; 

四、常用固件库函数

    (1)初始化函数

          void   TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

    (2)定时器使能函数

          void   TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

    (3)定时器中断使能函数

          void   TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

    (4)获取状态标志位

          FlagStatus   TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

    (5)清除状态标识位

          void   TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

    (6)获取中断标志位

          ITStatus   TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);

    (7)清除中断标志位

          void   TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

五、程序

timer.h文件

#ifndef __TIMER_H__
#define __TIMER_H__

#include "stm32f4xx_conf.h"

void TIM3_Config(uint16_t arr,uint16_t psc);

#endif
 

timer.c文件

#include "./TIMER/timer.h"
#include "./LED/led.h"

/*****************************
    功能:配置定时器
    参数:
            arr--->自动重装载值
            psc--->预分频系数
    返回值:无
******************************/
void TIM3_Config(uint16_t arr,uint16_t psc)
{
    TIM_TimeBaseInitTypeDef timeInitValue;
    NVIC_InitTypeDef nvicInitValue;
    
    /*1、打开定时器时钟*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    
    /*2、初始化定时器*/
    timeInitValue.TIM_ClockDivision = TIM_CKD_DIV1;
    timeInitValue.TIM_CounterMode = TIM_CounterMode_Up;
    timeInitValue.TIM_Period = arr;
    timeInitValue.TIM_Prescaler = psc;
    TIM_TimeBaseInit(TIM3,&timeInitValue);
    
    /*3、配置NVIC*/
    nvicInitValue.NVIC_IRQChannel = TIM3_IRQn;
    nvicInitValue.NVIC_IRQChannelCmd = ENABLE;
    nvicInitValue.NVIC_IRQChannelPreemptionPriority = 1;
    nvicInitValue.NVIC_IRQChannelSubPriority = 3;
    NVIC_Init(&nvicInitValue);
    
    /*4、打开定时器更新中断*/
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
    
    /*5、使能定时器*/
    TIM_Cmd(TIM3,ENABLE);
    
}

/*****************************
    功能:定时器3的中断服务函数
    参数:无
    返回值:无
******************************/
void TIM3_IRQHandler(void)
{
    /*1、判断是否由于更新而产生的中断*/
    if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)//更新产生的中断
    {
        /*2、LED翻转*/
        LED1 = !LED1;
        
        /*3、清除中断标志位*/
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    }
}

main.c文件

#include "delay.h"
#include "stdio.h"
#include "./LED/led.h"
#include "./BEEP/beep.h"
#include "./KEY/key.h"
#include "./USART/usart.h"
#include "./EXTI/exti.h"
#include "./IWDG/iwdg.h"
#include "./TIMER/timer.h"

int main(void)
{
    //优先级分组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //配置LED
    LED_Config();
    //配置定时器
    TIM3_Config(4999,8399);
    
    while(1)
    {
    
    }
    
}

你可能感兴趣的:(STM32)