[STM32F1] 基于stm32f103c8t6的定时器详解

[复制链接]
2514|30
 楼主| 略略u 发表于 2023-2-28 00:38 | 显示全部楼层 |阅读模式
stm32f103系列定时器介绍

先声明:stm32f103c8t6中没有基本定时器、只有TIM1-TIM4:分别是高级定时器和通用定时器(对照下图请自行阅读stm32f103x的datasheet)

4217563fcdc734d501.png


 楼主| 略略u 发表于 2023-2-28 00:38 | 显示全部楼层
定时器功能:定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能。2、定时器分类:
(1)基本定时器:TIM6、7
(2)通用定时器:TIM2345
(3)高级定时器:TIM1、8

7672063fcdc892468f.png
 楼主| 略略u 发表于 2023-2-28 00:38 | 显示全部楼层
定时器总线时钟:

401263fcdc9629e45.png
 楼主| 略略u 发表于 2023-2-28 00:39 | 显示全部楼层
8099963fcdca059247.png

无特殊情况,给到定时器的内部时钟都是72M
 楼主| 略略u 发表于 2023-2-28 00:39 | 显示全部楼层
基本定时器
基本定时器分为三部分讲解:
(1)时钟源
(2)控制器
(3)时基单元

9806963fcdcb996922.png
 楼主| 略略u 发表于 2023-2-28 00:39 | 显示全部楼层
时钟源
时钟源来自RCC的TIMXCLK,就是内部时钟(CK_INT)直接经过控制器传给时基单元充当CK_PSC
 楼主| 略略u 发表于 2023-2-28 00:39 | 显示全部楼层
控制器
控制定时器的复位、使能、计数、DAC触发

182463fcdcd28b500.png
 楼主| 略略u 发表于 2023-2-28 00:40 | 显示全部楼层
时基单元
基本定时器的时基单元包括三个部分
(1)预分频器:分频、得到计时器的时钟,即CNT计数1次所需要的时间,预分频器时16位的寄存器、所以可分频为1-65536
(2)计数器:用来计数、基本定时器的CNT计数器只能向上计数
(3)自动装载寄存器ARR:即CNT加到ARR的值之后,会产生一个事件或中断或DMA请求,中断用得比较多(定时x时间之后、当点灯大师)
9760263fcdce76a193.png
 楼主| 略略u 发表于 2023-2-28 00:40 | 显示全部楼层
(4)其实、时基单元里面还有非常重要的寄存器、叫做影子寄存器,什么是影子寄存器呢?仔细看上面的图会发现PSC和自动重装载寄存器ARR都有阴影,它们就是影子寄存器
影子寄存器的作用:其实,PSC和ARR都是当影子寄存器被写入新的值时,电路才会生效,所以是用户值->寄存器->影子寄存器->生效,影子寄存器可以起到缓冲的作用,一般不会使用影子寄存器
————————————————
版权声明:本文为CSDN博主「妥妥50w」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shun1296/article/details/121147491


————————————————
版权声明:本文为CSDN博主「妥妥50w」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shun1296/article/details/121147491
 楼主| 略略u 发表于 2023-2-28 00:40 | 显示全部楼层
 楼主| 略略u 发表于 2023-2-28 00:40 | 显示全部楼层
如何实现500ms定时
1.分频器PSC设置:72-1(即计数器时钟为1us)
2.ARR设置为1000,即计数一次1ms
3.可通过计数产生中断,中断里面设置全局变量,每次加1,当从0加到500时,就是500ms了
 楼主| 略略u 发表于 2023-2-28 00:41 | 显示全部楼层
基本定时器代码实例
bsp_BasicTim.c
  1. #include "bsp_BasicTim.h"

  2. // 中断优先级配置
  3. static void BASIC_TIM_NVIC_Config(void)
  4. {
  5.     NVIC_InitTypeDef NVIC_InitStructure;
  6.     // 设置中断组为0
  7.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);               
  8.                 // 设置中断来源
  9.     NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;       
  10.                 // 设置主优先级为 0
  11.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         
  12.           // 设置抢占优先级为3
  13.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       
  14.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  15.     NVIC_Init(&NVIC_InitStructure);
  16. }

  17. static void BASIC_TIM_Config(void)
  18. {
  19.                 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  20.                
  21.                 // 开启定时器时钟,即内部时钟CK_INT=72M
  22.     BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
  23.        
  24.                 // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  25.     TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;       

  26.           // 时钟预分频数为
  27.     TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;
  28.        
  29.                 // 时钟分频因子 ,基本定时器没有,不用管
  30.     //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  31.                
  32.                 // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
  33.     //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  34.                
  35.                 // 重复计数器的值,基本定时器没有,不用管
  36.                 //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  37.        
  38.           // 初始化定时器
  39.     TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
  40.                
  41.                 // 清除计数器中断标志位
  42.     TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
  43.           
  44.                 // 开启计数器中断:计数器溢出、产生更新事件、计数器的更新事件能够产生中断、并被使能
  45.     TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
  46.                
  47.                 // 使能计数器
  48.     TIM_Cmd(BASIC_TIM, ENABLE);
  49. }

  50. void BASIC_TIM_Init(void)
  51. {
  52.         BASIC_TIM_NVIC_Config();
  53.         BASIC_TIM_Config();
  54. }

 楼主| 略略u 发表于 2023-2-28 00:41 | 显示全部楼层
bsp_BasicTim.h
  1. #ifndef __BSP_TIMEBASE_H
  2. #define __BSP_TIMEBASE_H

  3. #include "stm32f10x.h"

  4. /********************基本定时器TIM参数定义,只限TIM6、7************/
  5. #define BASIC_TIM6 // 如果使用TIM7,注释掉这个宏即可

  6. #ifdef  BASIC_TIM6 // 使用基本定时器TIM6
  7. #define            BASIC_TIM                   TIM6
  8. #define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
  9. #define            BASIC_TIM_CLK               RCC_APB1Periph_TIM6
  10. #define            BASIC_TIM_Period            (1000-1)
  11. #define            BASIC_TIM_Prescaler         71
  12. #define            BASIC_TIM_IRQ               TIM6_IRQn
  13. #define            BASIC_TIM_IRQHandler        TIM6_IRQHandler

  14. #else  // 使用基本定时器TIM7
  15. #define            BASIC_TIM                   TIM7
  16. #define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
  17. #define            BASIC_TIM_CLK               RCC_APB1Periph_TIM7
  18. #define            BASIC_TIM_Period            1000-1
  19. #define            BASIC_TIM_Prescaler         71
  20. #define            BASIC_TIM_IRQ               TIM7_IRQn
  21. #define            BASIC_TIM_IRQHandler        TIM7_IRQHandler

  22. #endif

  23. void BASIC_TIM_Init(void);

  24. #endif        /* __BSP_TIMEBASE_H */

 楼主| 略略u 发表于 2023-2-28 00:41 | 显示全部楼层
中断服务子程序:BASIC_TIM_IRQHandler
  1. void BASIC_TIM_IRQHandler(void)
  2. {
  3.         if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ) //当更新时间到来、定时器TIM的状态寄存器就不为0,满足条件。
  4.        
  5.         {       
  6.                 time++;
  7.                 TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);                   
  8.         }                        
  9. }

 楼主| 略略u 发表于 2023-2-28 00:41 | 显示全部楼层
高级定时器
高级定时器分为6个部分讲解:
(1)时钟源
(2)控制器
(3)时基单元
(4)输入捕获
(5)输出比较
(6)刹车控制区
 楼主| 略略u 发表于 2023-2-28 00:42 | 显示全部楼层
附上功能框图:
8419363fcdd579bdb2.png
 楼主| 略略u 发表于 2023-2-28 00:42 | 显示全部楼层
时钟源
高级定时器的时钟源有4种:
(1)内部时钟源IN_CLK
(2)外部时钟模式1: TIx(x=1,2,3,4)
(3)外部始终模式2: ETR
(4)内部触发输入: ITRx
 楼主| 略略u 发表于 2023-2-28 00:42 | 显示全部楼层
 楼主| 略略u 发表于 2023-2-28 00:42 | 显示全部楼层
 楼主| 略略u 发表于 2023-2-28 00:42 | 显示全部楼层
二、控制器
触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。

从模式控制器可以控制计数器复位、启动、递增/递减、计数。

三、时基单元
参考基本定时器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

666

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部