• STM32(TIM定时器中断)


     理论知识

     

     

    定时器定时中断

    接线图

    定时器工作配置步骤

     定时中断和内外时钟源选择

     

     

     

     定时器中需要使用的函数

    程序实现效果:

    1. void TIM_DeInit(TIM_TypeDef* TIMx); **// 恢复定时器的缺省配置**
    2. void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct); // 时基单元初始化配置时基单元------>第一个参数表示的是选择某个定时器,第二个结构体包含配置时基单元的一些参数**
    3. void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);**// 给结构体变量赋一个默认的值**
    4. void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); **// 使能计数器,第一个参数表示选择计数器,第二个参数表示新的状态,也就是使能还是失能**
    5. void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); **// 使能中断输出信号,中断输出控制,参数第一个为选择定时器,第二个选择要配置哪一个中断输出,第三个新的状态表示使能还是失能**
    6. 以下的6个函数分别对应时基单元的时钟选择部分,可以选择RCC内部时钟,ETR外部时钟,TRX,其它定时器,TIX捕获通道,
    7. void TIM_InternalClockConfig(TIM_TypeDef* TIMx); **// 选择内部时钟**
    8. void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); **// 选择其它定时器的时钟,第一个参数表示要配置的定时器,第二个参数为选择要接入那个其它的定时器**
    9. void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
    10. uint16_t TIM_ICPolarity, uint16_t ICFilter);**// 选择TIX捕获通道的时钟,选择需要配置的定时器,第二个参数选择TIX具体需要配置的引脚,最后的两个参数表示的是输入的级性和滤波器**
    11. void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);**//选择ETR通过外部模式1输入的函数,第一个参数表示外部触发预蜂鸣器,级性和滤**波器
    12. void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);// 选择ETR通过外部时钟模式2输入的时钟,第一个参数和上面的一个函数是一样的
    13. void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
    14. uint16_t ExtTRGFilter);// 这个函数是用于单独配置ETR引脚的预分频器,极性,滤波器这些参数
    15. void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);//
    16. void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
    17. uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); // 获取当前计数器的值
    18. uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); //获取当前预分频器的值
    19. // 以下的4个函数是用来获取标志位和清除标志位的函数
    20. FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
    21. void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
    22. ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    23. void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

    定时器配置

    1. #include "stm32f10x.h" // Device header
    2. /*
    3. 定时器中断的初始化代码
    4. */
    5. void Timer_Init(void)
    6. {
    7. // 开启时钟,这里TIM2是通用寄存器
    8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    9. // 选择时基单元的时钟,选择内部时钟的模式,定时器默认使用的是内部单元的时钟
    10. TIM_InternalClockConfig(TIM2);
    11. // 配置时基单元,初始化结构体
    12. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    13. // 将结构体成员都引用出来放置在这个位置
    14. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 配置参数是否分屏
    15. TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; // 选择计数的模式选择向上计数
    16. TIM_TimeBaseInitStructure.TIM_Period = 10000 -1; // 表示ARR自动重装器的值,这两个参数的取值都要在0-65535之间
    17. TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1; // PSC预分频器的值
    18. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器的值
    19. // 初始化结构体并将结构体的地址放置在init函数中
    20. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    21. // TIM_ClearFlag(TIM2,TIM_FLAG_Update);手动清除更新中断标志位避免刚初始化玩就进中断标志位的问题
    22. TIM_ClearFlag(TIM2,TIM_FLAG_Update);
    23. // 选择中断模式为更新中断,配置使能,开启更新中断到nvic的通路
    24. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    25. // 配置nvic,配置nvic优先级分组,选择分组2的方式
    26. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    27. //初始化nvic的结构体
    28. NVIC_InitTypeDef NVIC_InitStruct;
    29. // 配置nvic结构体模式
    30. NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; // 表示中断通道,表示定时器2在nvic中的通道
    31. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 编写为使能ENABLE
    32. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; // 抢占式优先级
    33. NVIC_InitStruct.NVIC_IRQChannelSubPriority =1 ; // 响应式优先级
    34. NVIC_Init(&NVIC_InitStruct);
    35. // 启动定时器
    36. TIM_Cmd(TIM2, ENABLE);
    37. }
    38. /*
    39. // 编写定时器2的初始化函数
    40. void TIM2_IRQHandler(void){
    41. // 当定时器产生更新中断时这个函数会被执行TIM_GetITStatus
    42. if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){ // 判断中断标志位,如果中断的标志位等于SET就执行用户代码
    43. // 清除中断标志位
    44. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    45. }
    46. }
    47. */

    定时器头文件

    主函数文件

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. #include "OLED.h"
    4. #include "Timer.h"
    5. uint16_t Num;
    6. int main(void)
    7. {
    8. // 初始化oled
    9. OLED_Init();
    10. // 初始化定时器
    11. Timer_Init();
    12. // 使用OLED显示字符串
    13. OLED_ShowString(1,1,"Num:");
    14. while (1)
    15. {
    16. OLED_ShowNum(1, 5, Num, 5);
    17. OLED_ShowNum(2, 5, TIM_GetCounter(TIM2), 5);
    18. }
    19. }
    20. void TIM2_IRQHandler(void)
    21. {
    22. if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    23. {
    24. Num++;
    25. TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    26. }
    27. }

    接线图2:

     第二个程序效果展示:

  • 相关阅读:
    Spring注解开发(十)
    【无标题】CTreeCtrl更改-/+展开按钮颜色
    Deepin常用环境配置
    数据结构与算法 | 图(Graph)
    11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装
    Excel自学三部曲_Part3:Excel工作场景分析实战
    基于ssm的人力资源管理系统
    用Python和TensorFlow实现图像分类:从零开始
    pnpm 升级
    [附源码]SSM计算机毕业设计旅游管理系统JAVA
  • 原文地址:https://blog.csdn.net/qq_45973003/article/details/136629676