STM32 定时器

STM32F10X系列有高级控制定时器(TIM1和TIM8)>通用定时器(TIMx)>基本定时器(TIM6和TIM7)TIM6 和 TIM7,没有有输入捕获功能

主要有三个用途:普通的定时器中断产生PWM波输入捕获

Detials:

  • CNT计数器
    • 向上计数:从0开始加加,加到ARR(重装载值)时产生UEV事件,然后被赋值为0,继续慢慢加
    • 向下计数:从ARR开始减减,减到0时产生UEV事件,然后被赋值为ARR,继续慢慢减
    • 向上/向下:从0开始加加,加到ARR(重装载值)时产生UEV事件,接着就从ARR开始减减,减到0时产生UEV事件

    //“产生UEV事件”有待商榷,还关系到下面要说的“屏蔽”、“重复计数器RCR”

  • UIF标志位(UEV事件发生时UIF应该置1)//‘应该’的例外在置位来源里的2,3处
    • 置位来源:
      • 计数器上下溢出
      • 软件设置UG位(前提:URS = 0)//若URS = 1,则只有UEV事件,而UIF没反应//设置UG位时相当于加速了本次递加/减,瞬间到达0或ARR
      • 从模式控制器产生的更新(前提:URS = 0)//若URS = 1,则只有UEV事件,而UIF没反应
    • 屏蔽:UDIS=1时.UEV事件被屏蔽,即UIF无反应
  • 中断/DMA:UIF为1且UIE(更新中断使能)为1时,触发更新中断/DMA请求
  • 重复计数器RCR:每次计数器溢出时会对RCR减1,只有发现RCR为0,才产生UEV事件
  • 影子寄存器:(ARR、PSC、CCRx图中带阴影)
    • ARPE = 1:影子作用使能,用户写入ARR的值将被缓存,当UEV事件发生时,该值正式生效(当UEV事件发生时,所有寄存器被更新,如RCR[重复计数],PSC[分频])
    • ARPE = 0:用户写入ARR的值直接生效    //PSC、CCRx等影子寄存器有各自的缓存使能位
    • 作用:避免在计数工作过程中突然改变参数而引发混乱

 

  • 时钟选择:
    • 一般使用内部时钟APB2作为源输入

Go

一、打开时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

二、初值、分频、变化模式

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

第一个参数用于选择TIM外设,可以是TIM3、TIM4、TIM5。

第二个参数是一个指向TIM_TimeBaseInitTypeDef的结构体指针,他包含了时间基数的配置信息。

typedef struct 

    u16 TIM_Period; 
    u16 TIM_Prescaler; 
    u8 TIM_ClockDivision; 
    u16 TIM_CounterMode; 
} TIM_TimeBaseInitTypeDef;

TIM_Period:设置自动重装载寄存器ARR的值,0×0000到0xFFFF;

TIM_Prescaler: 设置定时器的预分频系数, 0×0000到0xFFFF;

TIM_ClockDivision:设置时钟分频系数,TIM_CKD_DIVx (x = 1、2、4);??不知??目测和采样滤波有关

TIM_CounterMode:定时器计数方式,因人而异,我一般使用向上计数,取值如下

TIM_CounterMode_Up                    TIM 向上计数模式
TIM_CounterMode_Down                TIM 向下计数模式
TIM_CounterMode_CenterAligned1   TIM 中央对齐模式 1 计数模式
TIM_CounterMode_CenterAligned2   TIM 中央对齐模式 2 计数模式
TIM_CounterMode_CenterAligned3   TIM 中央对齐模式 3 计数模式

三、TIM中断

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

第一个参数用于选择TIM外设,可以是TIM3、TIM4、TIM5。发现3.5库只有TIM1-4的中断通道???

第二个参数用于指定TIM中断源,这里我们指定整个中断源(TIM_IT_Update )

TIM_IT_Update   TIM 中断源   //计数溢出时
TIM_IT_CC1       TIM 捕获/ 比较 1 中断源
TIM_IT_CC2       TIM 捕获/ 比较 2 中断源
TIM_IT_CC3       TIM 捕获/ 比较 3 中断源
TIM_IT_CC4       TIM 捕获/ 比较 4 中断源
TIM_IT_Trigger   TIM 触发中断源

第三个参数用于指定的中断使失能,取值ENABLEDISABLE

四、使能TIM定时器( 使能前最好清除TIM3更新中断标志 TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

第一个参数用于选择TIM外设,同上。

第二个参数ENABLE或DISABLE。

五、设置NVIC

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                     //TIM3中断 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    //先占优先级0级 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                  //从优先级3级 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //IRQ 通道被使能 
    NVIC_Init(&NVIC_InitStructure);                                                     //初始化NVIC寄存器

六、编写中断函数

void TIM3_IRQHandler(void)      //TIM3中断 

  if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
    { 
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update    ); //清除TIM3更新中断标志   
        //add your code 
    } 
}

七、额外

TIM_DeInit(TIM4);//最好在设置开始处调用
TIM_InternalClockConfig(TIM4);//使用内部时钟:【规则:若APB1分频为1则直接采用APB时钟,否则使用APB时钟X2

上面的TIM_Prescaler是定时器内部的再分频

 

 

 

常用寄存器:

  CCxIE: 通道x中断使能位

  CCxIF:通道x捕获/比较标志位

  CCxOF:通道x捕获/比较重复标志位,当发生至少2个连续的捕获时,而CCxIF未曾被清除,CCxOF也被置1。

  CCxP:上升沿/下降沿选择

  CCxE:  输入/输出使能位

  CCxS:TIM_ICSelection_DirectTI|TIM_ICSelection_IndirectTI ,用于把CCR1映射到CCR2的引脚,用于PWM捕获(还有SMS,MMS,TS等)

  TIMxARR:TIM_Period,预装载值

  TIMxPSC:TIM_Prescaler,分频值

  TIMxCNT:计数器值

 

 

 

转载于:https://www.cnblogs.com/2cats/p/3579185.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32定时器STM32微控制器中的一个非常重要的模块,它可以用来生成精确的时钟信号,并且可以实现很多不同的功能。 STM32定时器主要分为两种类型:基本定时器和通用定时器。基本定时器只有一个计数器,而通用定时器则有多个计数器,并且支持更多的功能。具体可以根据实际需要选择使用哪种类型的定时器。 在STM32中使用定时器可以通过以下步骤完成: 1. 配置定时器的时钟源和分频系数; 2. 设置定时器计数器的初始值和自动重载值; 3. 开启定时器中断(可选); 4. 启动定时器。 例如,以下是使用STM32的基本定时器TIM6进行定时中断的代码: ```c #include "stm32f10x.h" void TIM6_IRQHandler(void) { // 定时器中断处理函数 } int main(void) { // 使能TIM6的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 配置TIM6的时钟源为内部时钟,分频系数为72 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct); // 开启TIM6的更新中断 TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); // 启动TIM6 TIM_Cmd(TIM6, ENABLE); while (1) { // 程序主循环 } } ``` 在上面的代码中,我们使用了STM32的库函数来配置和控制定时器,首先通过RCC_APB1PeriphClockCmd函数使能了TIM6的时钟,然后使用了TIM_TimeBaseInit函数来配置了定时器的时钟源、分频系数、计数器自动重载值等参数,然后开启了定时器的更新中断,并且最后启动了定时器。在定时器中断处理函数中可以编写需要定时执行的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值