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

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

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

  基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。

TIM6和TIM7定时器的主要功能包括:

16位自动重装载累加计数器
16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频
触发DAC的同步电路
在更新事件(计数器溢出)时产生中断/DMA请求
  这个可编程定时器的主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一个预分频器得到。软件可以读写计数器、自动重装载寄存器和预分频寄存器,即使计数器运行时也可以操作。

  通过上面的介绍可以看出,基本定时器的功能很简单,就只是提供一个简单的定时功能。下面通过代码演示基本定时器的定时功能:
  1. // 中断优先级配置
  2. static void TIM6_NVIC_Config(void)
  3. {
  4.     NVIC_InitTypeDef NVIC_InitStructure;

  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                          // 设置中断组为0               
  6.     NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn ;                // 设置中断来源               
  7.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         // 设置主优先级为 0         
  8.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                // 设置抢占优先级为3
  9.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  10.     NVIC_Init(&NVIC_InitStructure);
  11. }
  12. /*
  13. * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  14. * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  15. * 另外三个成员是通用定时器和高级定时器才有.
  16. *-----------------------------------------------------------------------------
  17. *typedef struct
  18. *{ TIM_Prescaler            都有
  19. *        TIM_CounterMode                             TIMx,x[6,7]没有,其他都有
  20. *  TIM_Period               都有
  21. *  TIM_ClockDivision        TIMx,x[6,7]没有,其他都有
  22. *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有
  23. *}TIM_TimeBaseInitTypeDef;
  24. *-----------------------------------------------------------------------------
  25. */
  26. static void TIM6_Mode_Config(u16 arr, u16 psc)
  27. {
  28.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  29.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 开启定时器时钟,即内部时钟CK_INT=72M               
  30.     TIM_TimeBaseStructure.TIM_Period = arr;        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断         
  31.     TIM_TimeBaseStructure.TIM_Prescaler= psc;   // 时钟预分频数为               
  32.       //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                // 时钟分频因子 ,基本定时器没有,不用管               
  33.       //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置               
  34.      //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        // 重复计数器的值,基本定时器没有,不用管         
  35.     TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);        // 初始化定时器               
  36.     TIM_ClearFlag(TIM6, TIM_FLAG_Update);                // 清除计数器中断标志位               
  37.     TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);     // 开启计数器中断               
  38.     TIM_Cmd(TIM6, ENABLE);                                       // 使能计数器
  39. }

  40. void TIM6_Init(void)
  41. {
  42.         TIM6_NVIC_Config();
  43.         TIM6_Mode_Config(10-1,72-1);
  44. }

  45. void  TIM6_IRQHandler ( void )
  46. {
  47.     if ( TIM_GetITStatus( TIM6, TIM_IT_Update ) != RESET )
  48.     {
  49.         LED0=!LED0;
  50.         TIM_ClearITPendingBit( TIM6, TIM_FLAG_Update );
  51.     }
  52. }
复制代码

  基本定时器的初始化高级定时器和通用定时器简单很多,只需要设置定时器的周期值和时钟分频系数就可以了。如果要使用中断功能时,需要设置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.     TIM6_Init();                  
  9.     while(1)
  10.     {      
  11.     }
  12. }
复制代码

  在主函数中调用定时器初始化函数后,定时器就开始工作了。定时器时间计算公式为(arr+1)*(psc+1)/72MHz,将参数9、71带入公式后,计算出定时器的定时周期值为10us。



收藏 评论0 发布时间:2022-3-18 22:24

举报

0个回答

所属标签

相似分享

官网相关资源

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