• STM32学习笔记(四)--TIM定时器中断详解


    (1)配置步骤
    1.配置RCC外设时钟
    2.配置时基单元的时钟
    3.配置初始化时基单元
    4.使能更新中断
    5.配置NVIC 选择一个合适的优先级
    6.启动定时器
    其中涉及外设有 RCC内部时钟(EIR外部时钟 ITR其他定时器 TIx捕获通道)、TIM、NVIC

    高级定时器:

    通用定时器:

    基本定时器:

    定时器中断基本结构:

    (2)代码示例
    案例1(设置内部时钟通用定时器2为1秒的定时中断)

    1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    2. //驱动内部时钟
    3. TIM_InternalClockConfig(TIM2);
    4. //72MHZ=72000000HZ
    5. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    6. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    7. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    8. TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//自动重装值65535max
    9. TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//预分频65535max
    10. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//计数器65535max
    11. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    12. //清除定时器标志位
    13. TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    14. //定时器更新中断源
    15. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    16. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    17. NVIC_InitTypeDef NVIC_InitStructure;
    18. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    19. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    20. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    21. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    22. NVIC_Init(&NVIC_InitStructure);
    23. //启动定时器
    24. TIM_Cmd(TIM2, ENABLE);

    案例2(设置外部时钟通用定时器2 其实也就是计数模式 理解下)

    1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    3. GPIO_InitTypeDef GPIO_InitStructure;
    4. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    6. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    7. GPIO_Init(GPIOA, &GPIO_InitStructure);
    8. //使用外部时钟 不分频 高电平上升沿有效 最后一个滤波器参数可以查手册
    9. TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 0x0F);
    10. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    11. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    12. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    13. TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;
    14. TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;
    15. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    16. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    17. //清除定时器标志位
    18. TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    19. //定时器更新中断源
    20. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    21. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    22. NVIC_InitTypeDef NVIC_InitStructure;
    23. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    24. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    25. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    26. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    27. NVIC_Init(&NVIC_InitStructure);
    28. //启动定时器
    29. TIM_Cmd(TIM2, ENABLE);

    (3)函数分析
    函数1:void TIM_InternalClockConfig(TIM_TypeDef* TIMx)(stm32f10x_tim.h)

    该函数用来驱动TIM的时基单元的内部时钟。

    序号

    名称

    参数解释

    示例

    参数1

    TIMx

    选择TIMx定时器

    TIM2、TIM3

    函数2:void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)(stm32f10x_tim.h)

    该函数结构体TIM_TimeBaseInitTypeDef的成员变量如下所示。

    序号

    名称

    参数解释

    示例

    参数1

    TIM_ClockDivision

    指定时钟分频

    TIM_CKD_DIV1

    参数2

    TIM_CounterMode

    计数器模式(向上 向下 中央对齐等)

    TIM_CounterMode_Up

    参数3

    TIM_Period

    ARR自动重装器的值

    10000-1

    参数4

    TIM_Prescaler

    PSC预分频器的值

    7200-1

    参数5

    TIM_RepetitionCounter

    重复计数的值

    0(高级定时器改)

    函数3:void TIM_InternalClockConfig(TIM_TypeDef* TIMx)(stm32f10x_tim.h)

    该函数用来驱动TIM的时基单元的内部时钟。

    序号

    名称

    参数解释

    示例

    参数1

    TIMx

    选择TIMx定时器

    TIM2、TIM3

    函数4:ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)(stm32f10x_tim.h)

    该函数用来驱动TIM的时基单元的内部时钟。

    序号

    名称

    参数解释

    示例

    参数1

    TIMx

    选择TIMx定时器

    TIM2、TIM3

    参数2

    TIM_IT

    指定要检查的定时器(TIM)中断源

    TIM_IT_Update(更新中断)

    同理void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)用法一致,该函数为清除中断标志位函数,每次进入中断都要手动清除;如下为示例:

    1. //位于启动文件中startup_stm32f10x_md.s 参数名根据定时中断标志位选择 否则无法进入
    2. void TIM2_IRQHandler(void)
    3. {
    4. if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    5. {
    6. //事件
    7. TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    8. }
    9. }
  • 相关阅读:
    Spring Bean 作用域与生命周期
    茴香豆的“茴”有四种写法,Python的格式化字符串也有
    常见排序算法(Java代码实现)
    vscode中配置python环境
    <HarmonyOS第一课>ArkTS开发语言介绍——闯关习题及答案
    小米汽车,能否在新能源汽车江湖站稳脚跟?
    RTC 技术的试金石:火山引擎视频会议场景技术实践
    【788. 旋转数字】
    【初阶数据结构】带头双向循环链表(C语言实现)
    基于Java毕业设计迎新管理系统演示录像2020源码+系统+mysql+lw文档+部署软件
  • 原文地址:https://blog.csdn.net/weixin_64593595/article/details/139669701