通用定时器定时

bsp_GeneralTim.h

  1. #ifndef __BSP_GENERALTIME_H
  2. #define __BSP_GENERALTIME_H
  3. #include "stm32f10x.h"
  4. /**************通用定时器TIM参数定义,只限TIM2、3、4、5************/
  5. // 当需要哪个定时器的时候,只需要把下面的宏定义改成1即可
  6. #define GENERAL_TIM2 1
  7. #define GENERAL_TIM3 0
  8. #define GENERAL_TIM4 0
  9. #define GENERAL_TIM5 0
  10. #if GENERAL_TIM2
  11. #define GENERAL_TIM TIM2
  12. #define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
  13. #define GENERAL_TIM_CLK RCC_APB1Periph_TIM2
  14. #define GENERAL_TIM_Period (1000-1)
  15. #define GENERAL_TIM_Prescaler 71
  16. #define GENERAL_TIM_IRQ TIM2_IRQn
  17. #define GENERAL_TIM_IRQHandler TIM2_IRQHandler
  18. #elif GENERAL_TIM3
  19. #define GENERAL_TIM TIM3
  20. #define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
  21. #define GENERAL_TIM_CLK RCC_APB1Periph_TIM3
  22. #define GENERAL_TIM_Period (1000-1)
  23. #define GENERAL_TIM_Prescaler 71
  24. #define GENERAL_TIM_IRQ TIM3_IRQn
  25. #define GENERAL_TIM_IRQHandler TIM3_IRQHandler
  26. #elif GENERAL_TIM4
  27. #define GENERAL_TIM TIM4
  28. #define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
  29. #define GENERAL_TIM_CLK RCC_APB1Periph_TIM4
  30. #define GENERAL_TIM_Period (1000-1)
  31. #define GENERAL_TIM_Prescaler 71
  32. #define GENERAL_TIM_IRQ TIM4_IRQn
  33. #define GENERAL_TIM_IRQHandler TIM4_IRQHandler
  34. #elif GENERAL_TIM5
  35. #define GENERAL_TIM TIM5
  36. #define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
  37. #define GENERAL_TIM_CLK RCC_APB1Periph_TIM5
  38. #define GENERAL_TIM_Period (1000-1)
  39. #define GENERAL_TIM_Prescaler 71
  40. #define GENERAL_TIM_IRQ TIM5_IRQn
  41. #define GENERAL_TIM_IRQHandler TIM5_IRQHandler
  42. #endif
  43. /**************************函数声明********************************/
  44. void GENERAL_TIM_Init(void);
  45. #endif /* __BSP_GENERALTIME_H */

bsp_GeneralTim.c

  1. #include "bsp_GeneralTim.h"
  2. // 中断优先级配置
  3. static void GENERAL_TIM_NVIC_Config(void)
  4. {
  5. NVIC_InitTypeDef NVIC_InitStructure;
  6. // 设置中断组为0
  7. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  8. // 设置中断来源
  9. NVIC_InitStructure.NVIC_IRQChannel = GENERAL_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. ///*
  18. // * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  19. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  20. // * 另外三个成员是通用定时器和高级定时器才有.
  21. // *-----------------------------------------------------------------------------
  22. // *typedef struct
  23. // *{ TIM_Prescaler 都有
  24. // * TIM_CounterMode TIMx,x[6,7]没有,其他都有
  25. // * TIM_Period 都有
  26. // * TIM_ClockDivision TIMx,x[6,7]没有,其他都有
  27. // * TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
  28. // *}TIM_TimeBaseInitTypeDef;
  29. // *-----------------------------------------------------------------------------
  30. // */
  31. static void GENERAL_TIM_Mode_Config(void)
  32. {
  33. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  34. // 开启定时器时钟,即内部时钟CK_INT=72M
  35. GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK, ENABLE);
  36. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  37. TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;
  38. // 时钟预分频数
  39. TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;
  40. // 时钟分频因子 ,没用到不用管
  41. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  42. // 计数器计数模式,设置为向上计数
  43. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  44. // 重复计数器的值,没用到不用管
  45. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  46. // 初始化定时器
  47. TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
  48. // 清除计数器中断标志位
  49. TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update);
  50. // 开启计数器中断
  51. TIM_ITConfig(GENERAL_TIM,TIM_IT_Update,ENABLE);
  52. // 使能计数器
  53. TIM_Cmd(GENERAL_TIM, ENABLE);
  54. }
  55. void GENERAL_TIM_Init(void)
  56. {
  57. GENERAL_TIM_NVIC_Config();
  58. GENERAL_TIM_Mode_Config();
  59. }
  60. /*********************************************END OF FILE**********************/

main.c

  1. // 高级定时器TIMx,x[2,3,4,5]定时应用
  2. #include "stm32f10x.h"
  3. #include "bsp_led.h"
  4. #include "bsp_GENERALTim.h"
  5. uint32_t time = 0; // ms 计时变量
  6. /**
  7. * @brief 主函数
  8. * @param 无
  9. * @retval 无
  10. */
  11. int main(void)
  12. {
  13. /* led 端口配置 */
  14. LED_GPIO_Config();
  15. GENERAL_TIM_Init();
  16. while(1)
  17. {
  18. if ( time == 1000 ) /* 1000 * 1 ms = 1s 时间到 */
  19. {
  20. time = 0;
  21. /* LED1 取反 */
  22. LED1_TOGGLE;
  23. }
  24. }
  25. }
  26. /*********************************************END OF FILE**********************/

4路PWM输出

bsp_GeneralTim.h

  1. #ifndef __BSP_GENERALTIME_H
  2. #define __BSP_GENERALTIME_H
  3. #include "stm32f10x.h"
  4. /************通用定时器TIM参数定义,只限TIM2、3、4、5************/
  5. // 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
  6. // 我们这里默认使用TIM3
  7. #define GENERAL_TIM TIM3
  8. #define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
  9. #define GENERAL_TIM_CLK RCC_APB1Periph_TIM3
  10. #define GENERAL_TIM_Period 9
  11. #define GENERAL_TIM_Prescaler 71
  12. // TIM3 输出比较通道1
  13. #define GENERAL_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
  14. #define GENERAL_TIM_CH1_PORT GPIOA
  15. #define GENERAL_TIM_CH1_PIN GPIO_Pin_6
  16. // TIM3 输出比较通道2
  17. #define GENERAL_TIM_CH2_GPIO_CLK RCC_APB2Periph_GPIOA
  18. #define GENERAL_TIM_CH2_PORT GPIOA
  19. #define GENERAL_TIM_CH2_PIN GPIO_Pin_7
  20. // TIM3 输出比较通道3
  21. #define GENERAL_TIM_CH3_GPIO_CLK RCC_APB2Periph_GPIOB
  22. #define GENERAL_TIM_CH3_PORT GPIOB
  23. #define GENERAL_TIM_CH3_PIN GPIO_Pin_0
  24. // TIM3 输出比较通道4
  25. #define GENERAL_TIM_CH4_GPIO_CLK RCC_APB2Periph_GPIOB
  26. #define GENERAL_TIM_CH4_PORT GPIOB
  27. #define GENERAL_TIM_CH4_PIN GPIO_Pin_1
  28. /**************************函数声明********************************/
  29. void GENERAL_TIM_Init(void);
  30. #endif /* __BSP_GENERALTIME_H */

bsp_GeneralTim.c

  1. #include "bsp_GeneralTim.h"
  2. static void GENERAL_TIM_GPIO_Config(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. // 输出比较通道1 GPIO 初始化
  6. RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);
  7. GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH1_PIN;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);
  11. // 输出比较通道2 GPIO 初始化
  12. RCC_APB2PeriphClockCmd(GENERAL_TIM_CH2_GPIO_CLK, ENABLE);
  13. GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH2_PIN;
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16. GPIO_Init(GENERAL_TIM_CH2_PORT, &GPIO_InitStructure);
  17. // 输出比较通道3 GPIO 初始化
  18. RCC_APB2PeriphClockCmd(GENERAL_TIM_CH3_GPIO_CLK, ENABLE);
  19. GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH3_PIN;
  20. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  21. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22. GPIO_Init(GENERAL_TIM_CH3_PORT, &GPIO_InitStructure);
  23. // 输出比较通道4 GPIO 初始化
  24. RCC_APB2PeriphClockCmd(GENERAL_TIM_CH4_GPIO_CLK, ENABLE);
  25. GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH4_PIN;
  26. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  27. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28. GPIO_Init(GENERAL_TIM_CH4_PORT, &GPIO_InitStructure);
  29. }
  30. ///*
  31. // * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  32. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  33. // * 另外三个成员是通用定时器和高级定时器才有.
  34. // *-----------------------------------------------------------------------------
  35. // *typedef struct
  36. // *{ TIM_Prescaler 都有
  37. // * TIM_CounterMode TIMx,x[6,7]没有,其他都有
  38. // * TIM_Period 都有
  39. // * TIM_ClockDivision TIMx,x[6,7]没有,其他都有
  40. // * TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
  41. // *}TIM_TimeBaseInitTypeDef;
  42. // *-----------------------------------------------------------------------------
  43. // */
  44. /* ---------------- PWM信号 周期和占空比的计算--------------- */
  45. // ARR :自动重装载寄存器的值
  46. // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
  47. // PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
  48. // 占空比P=CCR/(ARR+1)
  49. static void GENERAL_TIM_Mode_Config(void)
  50. {
  51. // 开启定时器时钟,即内部时钟CK_INT=72M
  52. GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);
  53. /*--------------------时基结构体初始化-------------------------*/
  54. // 配置周期,这里配置为100K
  55. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  56. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  57. TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;
  58. // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  59. TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;
  60. // 时钟分频因子 ,配置死区时间时需要用到
  61. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  62. // 计数器计数模式,设置为向上计数
  63. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  64. // 重复计数器的值,没用到不用管
  65. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  66. // 初始化定时器
  67. TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
  68. /*--------------------输出比较结构体初始化-------------------*/
  69. // 占空比配置
  70. uint16_t CCR1_Val = 5;
  71. uint16_t CCR2_Val = 4;
  72. uint16_t CCR3_Val = 3;
  73. uint16_t CCR4_Val = 2;
  74. TIM_OCInitTypeDef TIM_OCInitStructure;
  75. // 配置为PWM模式1
  76. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  77. // 输出使能
  78. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  79. // 输出通道电平极性配置
  80. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  81. // 输出比较通道 1
  82. TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  83. TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
  84. TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
  85. // 输出比较通道 2
  86. TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
  87. TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
  88. TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
  89. // 输出比较通道 3
  90. TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
  91. TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);
  92. TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
  93. // 输出比较通道 4
  94. TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
  95. TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);
  96. TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
  97. // 使能计数器
  98. TIM_Cmd(GENERAL_TIM, ENABLE);
  99. }
  100. void GENERAL_TIM_Init(void)
  101. {
  102. GENERAL_TIM_GPIO_Config();
  103. GENERAL_TIM_Mode_Config();
  104. }
  105. /*********************************************END OF FILE**********************/

main.c

  1. // TIM—通用定时器-4路PWM输出应用
  2. #include "stm32f10x.h"
  3. #include "bsp_led.h"
  4. #include "bsp_GeneralTim.h"
  5. /**
  6. * @brief 主函数
  7. * @param 无
  8. * @retval 无
  9. */
  10. int main(void)
  11. {
  12. /* led 端口配置 */
  13. LED_GPIO_Config();
  14. /* 定时器初始化 */
  15. GENERAL_TIM_Init();
  16. while(1)
  17. {
  18. }
  19. }
  20. /*********************************************END OF FILE**********************/

输入捕获-测量脉冲宽度

bsp_GeneralTim.h

  1. #ifndef __BSP_GENERALTIME_H
  2. #define __BSP_GENERALTIME_H
  3. #include "stm32f10x.h"
  4. /************通用定时器TIM参数定义,只限TIM2、3、4、5************/
  5. // 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
  6. // 我们这里默认使用TIM5
  7. #define GENERAL_TIM TIM5
  8. #define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
  9. #define GENERAL_TIM_CLK RCC_APB1Periph_TIM5
  10. #define GENERAL_TIM_PERIOD 0XFFFF
  11. #define GENERAL_TIM_PSC (72-1)
  12. // TIM 输入捕获通道GPIO相关宏定义
  13. #define GENERAL_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
  14. #define GENERAL_TIM_CH1_PORT GPIOA
  15. #define GENERAL_TIM_CH1_PIN GPIO_Pin_0
  16. #define GENERAL_TIM_CHANNEL_x TIM_Channel_1
  17. // 中断相关宏定义
  18. #define GENERAL_TIM_IT_CCx TIM_IT_CC1
  19. #define GENERAL_TIM_IRQ TIM5_IRQn
  20. #define GENERAL_TIM_INT_FUN TIM5_IRQHandler
  21. // 获取捕获寄存器值函数宏定义
  22. #define GENERAL_TIM_GetCapturex_FUN TIM_GetCapture1
  23. // 捕获信号极性函数宏定义
  24. #define GENERAL_TIM_OCxPolarityConfig_FUN TIM_OC1PolarityConfig
  25. // 测量的起始边沿
  26. #define GENERAL_TIM_STRAT_ICPolarity TIM_ICPolarity_Rising
  27. // 测量的结束边沿
  28. #define GENERAL_TIM_END_ICPolarity TIM_ICPolarity_Falling
  29. // 定时器输入捕获用户自定义变量结构体声明
  30. typedef struct
  31. {
  32. uint8_t Capture_FinishFlag; // 捕获结束标志位
  33. uint8_t Capture_StartFlag; // 捕获开始标志位
  34. uint16_t Capture_CcrValue; // 捕获寄存器的值
  35. uint16_t Capture_Period; // 自动重装载寄存器更新标志
  36. }TIM_ICUserValueTypeDef;
  37. extern TIM_ICUserValueTypeDef TIM_ICUserValueStructure;
  38. /**************************函数声明********************************/
  39. void GENERAL_TIM_Init(void);
  40. #endif /* __BSP_GENERALTIME_H */

bsp_GeneralTim.h

  1. #include "bsp_GeneralTim.h"
  2. // 定时器输入捕获用户自定义变量结构体定义
  3. TIM_ICUserValueTypeDef TIM_ICUserValueStructure = {0,0,0,0};
  4. // 中断优先级配置
  5. static void GENERAL_TIM_NVIC_Config(void)
  6. {
  7. NVIC_InitTypeDef NVIC_InitStructure;
  8. // 设置中断组为0
  9. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  10. // 设置中断来源
  11. NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIM_IRQ ;
  12. // 设置主优先级为 0
  13. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  14. // 设置抢占优先级为3
  15. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  16. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  17. NVIC_Init(&NVIC_InitStructure);
  18. }
  19. static void GENERAL_TIM_GPIO_Config(void)
  20. {
  21. GPIO_InitTypeDef GPIO_InitStructure;
  22. // 输入捕获通道 GPIO 初始化
  23. RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);
  24. GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH1_PIN;
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  26. GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);
  27. }
  28. ///*
  29. // * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  30. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  31. // * 另外三个成员是通用定时器和高级定时器才有.
  32. // *-----------------------------------------------------------------------------
  33. // *typedef struct
  34. // *{ TIM_Prescaler 都有
  35. // * TIM_CounterMode TIMx,x[6,7]没有,其他都有
  36. // * TIM_Period 都有
  37. // * TIM_ClockDivision TIMx,x[6,7]没有,其他都有
  38. // * TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
  39. // *}TIM_TimeBaseInitTypeDef;
  40. // *-----------------------------------------------------------------------------
  41. // */
  42. /* ---------------- PWM信号 周期和占空比的计算--------------- */
  43. // ARR :自动重装载寄存器的值
  44. // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
  45. // PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
  46. // 占空比P=CCR/(ARR+1)
  47. static void GENERAL_TIM_Mode_Config(void)
  48. {
  49. // 开启定时器时钟,即内部时钟CK_INT=72M
  50. GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);
  51. /*--------------------时基结构体初始化-------------------------*/
  52. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  53. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  54. TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_PERIOD;
  55. // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  56. TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_PSC;
  57. // 时钟分频因子 ,配置死区时间时需要用到
  58. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  59. // 计数器计数模式,设置为向上计数
  60. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  61. // 重复计数器的值,没用到不用管
  62. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  63. // 初始化定时器
  64. TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
  65. /*--------------------输入捕获结构体初始化-------------------*/
  66. TIM_ICInitTypeDef TIM_ICInitStructure;
  67. // 配置输入捕获的通道,需要根据具体的GPIO来配置
  68. TIM_ICInitStructure.TIM_Channel = GENERAL_TIM_CHANNEL_x;
  69. // 输入捕获信号的极性配置
  70. TIM_ICInitStructure.TIM_ICPolarity = GENERAL_TIM_STRAT_ICPolarity;
  71. // 输入通道和捕获通道的映射关系,有直连和非直连两种
  72. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  73. // 输入的需要被捕获的信号的分频系数
  74. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  75. // 输入的需要被捕获的信号的滤波系数
  76. TIM_ICInitStructure.TIM_ICFilter = 0;
  77. // 定时器输入捕获初始化
  78. TIM_ICInit(GENERAL_TIM, &TIM_ICInitStructure);
  79. // 清除更新和捕获中断标志位
  80. TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update|GENERAL_TIM_IT_CCx);
  81. // 开启更新和捕获中断
  82. TIM_ITConfig (GENERAL_TIM, TIM_IT_Update | GENERAL_TIM_IT_CCx, ENABLE );
  83. // 使能计数器
  84. TIM_Cmd(GENERAL_TIM, ENABLE);
  85. }
  86. void GENERAL_TIM_Init(void)
  87. {
  88. GENERAL_TIM_GPIO_Config();
  89. GENERAL_TIM_NVIC_Config();
  90. GENERAL_TIM_Mode_Config();
  91. }
  92. /*********************************************END OF FILE**********************/

main.c

  1. // TIM—通用-捕获-测量脉宽 应用
  2. #include "stm32f10x.h"
  3. #include "bsp_led.h"
  4. #include "bsp_usart.h"
  5. #include "bsp_GeneralTim.h"
  6. /**
  7. * @brief 主函数
  8. * @param 无
  9. * @retval 无
  10. */
  11. int main(void)
  12. {
  13. uint32_t time;
  14. // TIM 计数器的驱动时钟
  15. uint32_t TIM_PscCLK = 72000000 / (GENERAL_TIM_PSC+1);
  16. /* 串口初始化 */
  17. USART_Config();
  18. /* 定时器初始化 */
  19. GENERAL_TIM_Init();
  20. printf ( "\r\n野火 STM32 输入捕获实验\r\n" );
  21. printf ( "\r\n按下K1,测试K1按下的时间\r\n" );
  22. while ( 1 )
  23. {
  24. if(TIM_ICUserValueStructure.Capture_FinishFlag == 1)
  25. {
  26. // 计算高电平时间的计数器的值
  27. time = TIM_ICUserValueStructure.Capture_Period * (GENERAL_TIM_PERIOD+1) +
  28. (TIM_ICUserValueStructure.Capture_CcrValue+1);
  29. // 打印高电平脉宽时间
  30. printf ( "\r\n测得高电平脉宽时间:%d.%d s\r\n",time/TIM_PscCLK,time%TIM_PscCLK );
  31. TIM_ICUserValueStructure.Capture_FinishFlag = 0;
  32. }
  33. }
  34. }
  35. /*********************************************END OF FILE**********************/

1-TIM—通用定时器-定时.zip
2-TIM—通用定时器-4路PWM输出.zip
3-TIM—通用定时器-输入捕获-测量脉冲宽度.zip