当前位置:   article > 正文

STM32定时与计数器总结 第一部分_stm32计数器

stm32计数器

        STM32F103系列MCU提供定时器有SysTick定时器(系统滴答定时器)、基本定时器、通用定时器和高级定时器。

1.SysTick定时器

        该定时器是一个 24 位的倒计数定时器。当计到 0 时该定时器就会从 LOAD 寄存器中自动重装载定时初值。只 要不把 CTRL 寄存器中的 ENABLE 位清 0,SysTick 定时器就一直工作下去。

  1. void SysTick_Init(void)
  2. {
  3. /* SysTick_Config会选择SysTick定时器时钟是HCLK,打开SysTick定时器并开启中断 */
  4. SysTick_Config(72000); //需要减一,重装值设为71999
  5. // SysTick_Config(72000/8); //重装值设为8999
  6. // SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; //选择SysTick定时器时钟是HCLK/8
  7. }
  8. /**************************************************************************************
  9. * 描 述 : SysTick中断服务函数
  10. * 入 参 : 无
  11. * 返回值 : 无
  12. **************************************************************************************/
  13. void SysTick_Handler(void)
  14. {
  15. if(timecount>1000)
  16. {
  17. timecount=0; //变量timecount清零
  18. led_toggle(LED_1); //1s执行一次翻转指示灯D1的操作
  19. }
  20. else
  21. {
  22. timecount++; //变量timecount累加1
  23. }
  24. }

 

2.基本定时器(TIM6和TIM7)

        STM32F103 系列 MCU 基本定时器用计数器只可向上计数,向上计数最大到 65535。 计数器从 0 累加计数到自动重装载数值(TIMx_ARR 寄存器)后重新从 0 开始计数并产生 一个计数器溢出事件。

        基本定时器用计数器的时钟频率计算公式:

        基本定时器溢出时间计算公式:

         

 TIM_TimeBaseInitTypeDef 结构体是针对基本定时器、通用定时器和高级定时器声明的。

 

TIM_ITConfig 库函数是 TIM 中断使能函数,作用是使能或禁止指定的 TIM 中断。 

基本定时器的配置步骤

 

 

  1. /**************************************************************************************
  2. * 描 述 : 初始化TIM6并配置TIM6中断优先级
  3. * 入 参 : 无
  4. * 返回值 : 无
  5. **************************************************************************************/
  6. void TIM6_Init(void)
  7. {//TIM_TimeBaseInitTypeDef 结构体是针对基本定时器、通用定
  8. //时器和高级定时器声明的
  9. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  10. NVIC_InitTypeDef NVIC_InitStructure;
  11. RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM6 , ENABLE); //打开外设TIM6时钟
  12. TIM_DeInit(TIM6); //将外设TIM6寄存器重设为缺省值
  13. //TIM6是基本定时器,只需配置TIM_Period和TIM_Prescaler即可
  14. TIM_TimeBaseInitStruct.TIM_Period = 9999 ; //设置计数器自动重装载值,取值范围0x0000~0xFFFF
  15. TIM_TimeBaseInitStruct.TIM_Prescaler = 7199 ; //设置预分频器数值,取值范围0x0000~0xFFFF
  16. TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct ) ;
  17. TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除TIM6的待处理标志位
  18. TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE); //使能TIM6中断
  19. TIM_Cmd(TIM6, ENABLE); //使能TIM6外设
  20. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC_Group:先占优先级2位,从优先级2位
  21. NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //配置为TIM6中断
  22. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级为1
  23. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级为2
  24. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
  25. NVIC_Init(&NVIC_InitStructure);
  26. }
  27. /**************************************************************************************
  28. * 描 述 : TIM6中断服务函数
  29. * 入 参 : 无
  30. * 返回值 : 无
  31. **************************************************************************************/
  32. void TIM6_IRQHandler(void)
  33. {
  34. led_toggle(LED_1); //1s执行一次翻转指示灯D1的操作
  35. TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除中断标志位
  36. }

 

        文中的代码来自艾克姆的开发板,由于我比较懒,不想对相关代码进行重新编辑,如果觉得我侵犯了权益,请联系我。 

        我是初学者,欢迎对我的文章提出您的意见和建议。非常期待您与我交流。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/233390
推荐阅读
相关标签
  

闽ICP备14008679号