你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103通用定时器使用

[复制链接]
STMCU小助手 发布时间:2022-3-19 20:18
STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。

通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:

16位向上、向下、向上/向下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值
4个独立通道:
      输入捕获
      输出比较
      PWM生成(边缘或中间对齐模式)
      单脉冲模式输出
使用外部信号控制定时器和定时器互连的同步电路
如下事件发生时产生中断/DMA:
      更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
      触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
      输入捕获
      输出比较
支持针对定位的增量(正交)编码器和霍尔传感器电路
触发输入作为外部时钟或者按周期的电流管理
可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。

  1. void TIMER3_Init(u16 arr, u16 psc)
  2. {
  3.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.         
  6.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  7.     TIM_TimeBaseStructure.TIM_Period = arr;
  8.     TIM_TimeBaseStructure.TIM_Prescaler = psc;
  9.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  10.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  11.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  12.         
  13.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);        //允许更新中断
  14.         
  15.     NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
  16.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
  17.     NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
  18.     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  19.     NVIC_Init(&NVIC_InitStructure);
  20.         
  21.     TIM_Cmd(TIM3,ENABLE);
  22. }
  23. void TIM3_IRQHandler(void)
  24. {
  25.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
  26.         {
  27.                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  28.                 LED0=!LED0;
  29.         }
  30. }
复制代码

这里使用的是定时器3,在初始化时传递了两个参数,其中arr用来设置定时器的周期,PSC设置时钟的分频系数。默认定时器的时钟频率为72MHz,所以带入这两个参数后,定时器的周期计算公式为:
(arr+1)*(psc+1)/72MHz,设置定时器的计数模式为向上计数。这里开启了定时器的中断功能,所以还需要设置NVIC寄存器,也就是设置定时器的中断优先级。定时器初始化完成之后,还需要提供一个定时器的中断函数,当定时器定时时间到了以后,就会自动跳转到定时器中断函数中。

  1. int main(void)
  2. {
  3.     u8 key = 0;
  4.     delay_init();       //延时函数初始化
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  6.     LED_Init();
  7.     KEY_Init();  
  8.     TIMER3_Init(9,71);                 //50Khz  10us   
  9.     while(1)
  10.     {      
  11.     }
  12. }
复制代码

  在主函数中初始化定时器,设置定时器分频数为71,默认的晶振频率为72MHz,进行71+1分频后的频率值为1Mhz,然后设置定时器的周期值为9+1,所以定时器的定时频率为1Mhz/(9+1)=100KHz,定时周期为10us。通过示波器观察LED管脚的电平,就可以看到LED管脚的电平每10us就会翻转一次。



收藏 评论0 发布时间:2022-3-19 20:18

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版