STM32学习-20240817-TIM定时中断

一、TIM简介

二、定时器

基本定时器只支持向上计数

通用寄存器支持向上、向下、双边定时

三、定时中断结构

ARR表示自动装载寄存器的值,PSC表示预分频器的值。

四、TIM库函数

void TIM_DeInit(TIM_TypeDef* TIMx);%恢复默认配置

时基单元

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);%时钟基础单元初始化,TIMX选择某个定时器

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);%初始化一个结构体

运行控制

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);使能计数器,选择定时器,状态

中断输出控制

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);%中断输出

时钟源选择

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);%选择内部时钟

void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);%选择定时器

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);%外部捕获通道

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);%外部模式为1的时钟

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);%外部模式为2 的时钟

void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);%配置外部时钟的预分频器等参数

单独写预分频值

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);%Prescaler要写入的预分频值,PSCReloadMode写入的模式

计数器的计数模式

void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);

自动重装器预装功能配置

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

给计数器写入一个值

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);

给自动重装器写一个值

void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);

获取当前计数器的值

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

获取当前预分频器的值

uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

获取标志位和清除标志位

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

五、初始化函数

1.初始化内部时钟

void Timer_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//激活时钟
    TIM_InternalClockConfig(TIM2);//选择内部时钟
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义一个结构体,用于初始化时基
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//一分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up ;//向上计数
    TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR,分频后计多少个数
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC,对时钟进行多少分频
                                                       //定时频率=Fclk/自动装载寄存器的值/预分频器的值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计时器独有的,不使用时置零
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//定时器时基初始化
     TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除中断标志位
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出控制开启
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//初始化NVIC寄存器,控制中断
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
        TIM_Cmd(TIM2, ENABLE);//运行控制开启

    }

2.初始化外部时钟

函数TIM_ETRClockMode2Config的最后一个参数设置,决定是否使用滤波,即采样频率和采样次数,比如1us采样一次,采样8次值都相同才认为外部时钟稳定。

外部时钟输入时,引脚的输入模式。

void Timer_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//配置IO口
    GPIO_InitTypeDef GPIO_InitStructure; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init (GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, GPIO_Pin_0);//设置端口为高电平
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//激活时钟
    TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);//选择外部是中国模式2,不分频
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义一个结构体,用于初始化时基
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//一分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up ;//向上计数
    TIM_TimeBaseInitStructure.TIM_Period = 10;//ARR,分频后计多少个数
    TIM_TimeBaseInitStructure.TIM_Prescaler = 1;//PSC,对时钟进行多少分频
                                                       //定时频率=Fclk/自动装载寄存器的值/预分频器的值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计时器独有的,不使用时置零
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//定时器时基初始化
    
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);//设置定时器工作模式位向上,上升沿
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出控制开启
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//初始化NVIC寄存器,控制中断
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    TIM_Cmd(TIM2, ENABLE);//运行控制开启

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值