使用高级定时器进行定时

stm32f10x_it.c

  1. void ADVANCE_TIM_IRQHandler (void)
  2. {
  3. if ( TIM_GetITStatus( ADVANCE_TIM, TIM_IT_Update) != RESET )
  4. {
  5. time++;
  6. TIM_ClearITPendingBit(ADVANCE_TIM , TIM_FLAG_Update);
  7. }
  8. }

bsp_AdvanceTim.h

  1. #ifndef __BSP_ADVANCETIME_H
  2. #define __BSP_ADVANCETIME_H
  3. #include "stm32f10x.h"
  4. /********************高级定时器TIM参数定义,只限TIM1、8************/
  5. #define ADVANCE_TIM1 // 如果使用TIM8,注释掉这个宏即可
  6. #ifdef ADVANCE_TIM1 // 使用高级定时器TIM1
  7. #define ADVANCE_TIM TIM1
  8. #define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd
  9. #define ADVANCE_TIM_CLK RCC_APB2Periph_TIM1
  10. #define ADVANCE_TIM_Period (1000-1)
  11. #define ADVANCE_TIM_Prescaler 71
  12. #define ADVANCE_TIM_IRQ TIM1_UP_IRQn
  13. #define ADVANCE_TIM_IRQHandler TIM1_UP_IRQHandler
  14. #else // 使用高级定时器TIM8
  15. #define ADVANCE_TIM TIM8
  16. #define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd
  17. #define ADVANCE_TIM_CLK RCC_APB2Periph_TIM8
  18. #define ADVANCE_TIM_Period (1000-1)
  19. #define ADVANCE_TIM_Prescaler 71
  20. #define ADVANCE_TIM_IRQ TIM8_UP_IRQn
  21. #define ADVANCE_TIM_IRQHandler TIM8_UP_IRQHandler
  22. #endif
  23. /**************************函数声明********************************/
  24. void ADVANCE_TIM_Init(void);
  25. #endif /* __BSP_ADVANCETIME_H */

bsp_AdvanceTim.c

  1. #include "bsp_AdvanceTim.h"
  2. // 中断优先级配置
  3. static void ADVANCE_TIM_NVIC_Config(void)
  4. {
  5. NVIC_InitTypeDef NVIC_InitStructure;
  6. // 设置中断组为0
  7. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  8. // 设置中断来源
  9. NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_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 ADVANCE_TIM_Mode_Config(void)
  32. {
  33. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  34. // 开启定时器时钟,即内部时钟CK_INT=72M
  35. ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK, ENABLE);
  36. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  37. TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_Period;
  38. // 时钟预分频数
  39. TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_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(ADVANCE_TIM, &TIM_TimeBaseStructure);
  48. // 清除计数器中断标志位
  49. TIM_ClearFlag(ADVANCE_TIM, TIM_FLAG_Update);
  50. // 开启计数器中断
  51. TIM_ITConfig(ADVANCE_TIM,TIM_IT_Update,ENABLE);
  52. // 使能计数器
  53. TIM_Cmd(ADVANCE_TIM, ENABLE);
  54. }
  55. void ADVANCE_TIM_Init(void)
  56. {
  57. ADVANCE_TIM_NVIC_Config();
  58. ADVANCE_TIM_Mode_Config();
  59. }
  60. /*********************************************END OF FILE**********************/

main.c

  1. // 高级定时器TIMx,x[1,8]定时应用
  2. #include "stm32f10x.h"
  3. #include "bsp_led.h"
  4. #include "bsp_AdvanceTim.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. ADVANCE_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**********************/

PWM互补输出带死区时间

bsp_AdvanceTim.h

  1. #ifndef __BSP_ADVANCETIME_H
  2. #define __BSP_ADVANCETIME_H
  3. #include "stm32f10x.h"
  4. /************高级定时器TIM参数定义,只限TIM1和TIM8************/
  5. // 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
  6. // 这里我们使用高级控制定时器TIM1
  7. #define ADVANCE_TIM TIM1
  8. #define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd
  9. #define ADVANCE_TIM_CLK RCC_APB2Periph_TIM1
  10. // PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
  11. #define ADVANCE_TIM_PERIOD (8-1)
  12. #define ADVANCE_TIM_PSC (9-1)
  13. #define ADVANCE_TIM_PULSE 4
  14. #define ADVANCE_TIM_IRQ TIM1_UP_IRQn
  15. #define ADVANCE_TIM_IRQHandler TIM1_UP_IRQHandler
  16. // TIM1 输出比较通道
  17. #define ADVANCE_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
  18. #define ADVANCE_TIM_CH1_PORT GPIOA
  19. #define ADVANCE_TIM_CH1_PIN GPIO_Pin_8
  20. // TIM1 输出比较通道的互补通道
  21. #define ADVANCE_TIM_CH1N_GPIO_CLK RCC_APB2Periph_GPIOB
  22. #define ADVANCE_TIM_CH1N_PORT GPIOB
  23. #define ADVANCE_TIM_CH1N_PIN GPIO_Pin_13
  24. // TIM1 输出比较通道的刹车通道
  25. #define ADVANCE_TIM_BKIN_GPIO_CLK RCC_APB2Periph_GPIOB
  26. #define ADVANCE_TIM_BKIN_PORT GPIOB
  27. #define ADVANCE_TIM_BKIN_PIN GPIO_Pin_12
  28. /**************************函数声明********************************/
  29. void ADVANCE_TIM_Init(void);
  30. #endif /* __BSP_ADVANCETIME_H */

bsp_AdvanceTim.c

  1. #include "bsp_AdvanceTim.h"
  2. static void ADVANCE_TIM_GPIO_Config(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. // 输出比较通道 GPIO 初始化
  6. RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);
  7. GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_CH1_PIN;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);
  11. // 输出比较通道互补通道 GPIO 初始化
  12. RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);
  13. GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_CH1N_PIN;
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16. GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);
  17. // 输出比较通道刹车通道 GPIO 初始化
  18. RCC_APB2PeriphClockCmd(ADVANCE_TIM_BKIN_GPIO_CLK, ENABLE);
  19. GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_BKIN_PIN;
  20. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  21. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22. GPIO_Init(ADVANCE_TIM_BKIN_PORT, &GPIO_InitStructure);
  23. // BKIN引脚默认先输出低电平
  24. GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);
  25. }
  26. ///*
  27. // * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  28. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  29. // * 另外三个成员是通用定时器和高级定时器才有.
  30. // *-----------------------------------------------------------------------------
  31. // *typedef struct
  32. // *{ TIM_Prescaler 都有
  33. // * TIM_CounterMode TIMx,x[6,7]没有,其他都有
  34. // * TIM_Period 都有
  35. // * TIM_ClockDivision TIMx,x[6,7]没有,其他都有
  36. // * TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
  37. // *}TIM_TimeBaseInitTypeDef;
  38. // *-----------------------------------------------------------------------------
  39. // */
  40. /* ---------------- PWM信号 周期和占空比的计算--------------- */
  41. // ARR :自动重装载寄存器的值
  42. // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
  43. // PWM 信号的周期 T = (ARR+1) * (1/CLK_cnt) = (ARR+1)*(PSC+1) / 72M
  44. // 占空比P=CCR/(ARR+1)
  45. static void ADVANCE_TIM_Mode_Config(void)
  46. {
  47. // 开启定时器时钟,即内部时钟CK_INT=72M
  48. ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);
  49. /*--------------------时基结构体初始化-------------------------*/
  50. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  51. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  52. TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;
  53. // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  54. TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC;
  55. // 时钟分频因子 ,配置死区时间时需要用到
  56. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  57. // 计数器计数模式,设置为向上计数
  58. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  59. // 重复计数器的值,没用到不用管
  60. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  61. // 初始化定时器
  62. TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
  63. /*--------------------输出比较结构体初始化-------------------*/
  64. TIM_OCInitTypeDef TIM_OCInitStructure;
  65. // 配置为PWM模式1
  66. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  67. // 输出使能
  68. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  69. // 互补输出使能
  70. TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  71. // 设置占空比大小
  72. TIM_OCInitStructure.TIM_Pulse = ADVANCE_TIM_PULSE;
  73. // 输出通道电平极性配置
  74. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  75. // 互补输出通道电平极性配置
  76. TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  77. // 输出通道空闲电平极性配置
  78. TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  79. // 互补输出通道空闲电平极性配置
  80. TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  81. TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);
  82. TIM_OC1PreloadConfig(ADVANCE_TIM, TIM_OCPreload_Enable);
  83. /*-------------------刹车和死区结构体初始化-------------------*/
  84. // 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述
  85. TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  86. TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  87. TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  88. TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  89. // 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述
  90. // 这里配置的死区时间为152ns
  91. TIM_BDTRInitStructure.TIM_DeadTime = 11;
  92. TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
  93. // 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样
  94. TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  95. TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  96. TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);
  97. // 使能计数器
  98. TIM_Cmd(ADVANCE_TIM, ENABLE);
  99. // 主输出使能,当使用的是通用定时器时,这句不需要
  100. TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
  101. }
  102. void ADVANCE_TIM_Init(void)
  103. {
  104. ADVANCE_TIM_GPIO_Config();
  105. ADVANCE_TIM_Mode_Config();
  106. }
  107. /*********************************************END OF FILE**********************/

main.c

  1. // TIM—高级定时器-PWM互补输出带死区时间应用
  2. #include "stm32f10x.h"
  3. #include "bsp_led.h"
  4. #include "bsp_AdvanceTim.h"
  5. /**
  6. * @brief 主函数
  7. * @param 无
  8. * @retval 无
  9. */
  10. int main(void)
  11. {
  12. /* 高级定时器初始化 */
  13. ADVANCE_TIM_Init();
  14. while(1)
  15. {
  16. }
  17. }
  18. /*********************************************END OF FILE**********************/

PWM输入捕获

bsp_AdvanceTim.h

  1. #ifndef __BSP_ADVANCETIME_H
  2. #define __BSP_ADVANCETIME_H
  3. #include "stm32f10x.h"
  4. /************高级定时器TIM参数定义,只限TIM1和TIM8************/
  5. // 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
  6. // 这里我们使用高级控制定时器TIM1
  7. #define ADVANCE_TIM TIM1
  8. #define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd
  9. #define ADVANCE_TIM_CLK RCC_APB2Periph_TIM1
  10. // 输入捕获能捕获到的最小的频率为 72M/{ (ARR+1)*(PSC+1) }
  11. #define ADVANCE_TIM_PERIOD (1000-1)
  12. #define ADVANCE_TIM_PSC (72-1)
  13. // 中断相关宏定义
  14. #define ADVANCE_TIM_IRQ TIM1_CC_IRQn
  15. #define ADVANCE_TIM_IRQHandler TIM1_CC_IRQHandler
  16. // TIM1 输入捕获通道1
  17. #define ADVANCE_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
  18. #define ADVANCE_TIM_CH1_PORT GPIOA
  19. #define ADVANCE_TIM_CH1_PIN GPIO_Pin_8
  20. #define ADVANCE_TIM_IC1PWM_CHANNEL TIM_Channel_1
  21. #define ADVANCE_TIM_IC2PWM_CHANNEL TIM_Channel_2
  22. /**************************函数声明********************************/
  23. void ADVANCE_TIM_Init(void);
  24. #endif /* __BSP_ADVANCETIME_H */

bsp_AdvanceTim.c

  1. #include "bsp_AdvanceTim.h"
  2. /**
  3. * @brief 高级控制定时器 TIMx,x[1,8]中断优先级配置
  4. * @param 无
  5. * @retval 无
  6. */
  7. static void ADVANCE_TIM_NVIC_Config(void)
  8. {
  9. NVIC_InitTypeDef NVIC_InitStructure;
  10. // 设置中断组为0
  11. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  12. // 设置中断来源
  13. NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_TIM_IRQ;
  14. // 设置抢占优先级
  15. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  16. // 设置子优先级
  17. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  18. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  19. NVIC_Init(&NVIC_InitStructure);
  20. }
  21. /**
  22. * @brief 高级定时器PWM输入用到的GPIO初始化
  23. * @param 无
  24. * @retval 无
  25. */
  26. static void ADVANCE_TIM_GPIO_Config(void)
  27. {
  28. GPIO_InitTypeDef GPIO_InitStructure;
  29. RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);
  30. GPIO_InitStructure.GPIO_Pin = ADVANCE_TIM_CH1_PIN;
  31. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  32. GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);
  33. }
  34. ///*
  35. // * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
  36. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
  37. // * 另外三个成员是通用定时器和高级定时器才有.
  38. // *-----------------------------------------------------------------------------
  39. // *typedef struct
  40. // *{ TIM_Prescaler 都有
  41. // * TIM_CounterMode TIMx,x[6,7]没有,其他都有
  42. // * TIM_Period 都有
  43. // * TIM_ClockDivision TIMx,x[6,7]没有,其他都有
  44. // * TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
  45. // *}TIM_TimeBaseInitTypeDef;
  46. // *-----------------------------------------------------------------------------
  47. // */
  48. /* ---------------- PWM信号 周期和占空比的计算--------------- */
  49. // ARR :自动重装载寄存器的值
  50. // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
  51. // PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
  52. // 占空比P=CCR/(ARR+1)
  53. /**
  54. * @brief 高级定时器PWM输入初始化和用到的GPIO初始化
  55. * @param 无
  56. * @retval 无
  57. */
  58. static void ADVANCE_TIM_Mode_Config(void)
  59. {
  60. // 开启定时器时钟,即内部时钟CK_INT=72M
  61. ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);
  62. /*--------------------时基结构体初始化-------------------------*/
  63. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  64. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  65. TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;
  66. // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  67. TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC;
  68. // 时钟分频因子 ,配置死区时间时需要用到
  69. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  70. // 计数器计数模式,设置为向上计数
  71. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  72. // 重复计数器的值,没用到不用管
  73. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  74. // 初始化定时器
  75. TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
  76. /*--------------------输入捕获结构体初始化-------------------*/
  77. // 使用PWM输入模式时,需要占用两个捕获寄存器,一个测周期,另外一个测占空比
  78. TIM_ICInitTypeDef TIM_ICInitStructure;
  79. // 捕获通道IC1配置
  80. // 选择捕获通道
  81. TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL;
  82. // 设置捕获的边沿
  83. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  84. // 设置捕获通道的信号来自于哪个输入通道,有直连和非直连两种
  85. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  86. // 1分频,即捕获信号的每个有效边沿都捕获
  87. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  88. // 不滤波
  89. TIM_ICInitStructure.TIM_ICFilter = 0x0;
  90. // 初始化PWM输入模式
  91. TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
  92. // 当工作做PWM输入模式时,只需要设置触发信号的那一路即可(用于测量周期)
  93. // 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置
  94. // 捕获通道IC2配置
  95. // TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL;
  96. // TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
  97. // TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
  98. // TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  99. // TIM_ICInitStructure.TIM_ICFilter = 0x0;
  100. // TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
  101. // 选择输入捕获的触发信号
  102. TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1);
  103. // 选择从模式: 复位模式
  104. // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位
  105. TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset);
  106. TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable);
  107. // 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)
  108. TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE);
  109. // 清除中断标志位
  110. TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);
  111. // 使能高级控制定时器,计数器开始计数
  112. TIM_Cmd(ADVANCE_TIM, ENABLE);
  113. }
  114. /**
  115. * @brief 高级定时器PWM输入初始化和用到的GPIO初始化
  116. * @param 无
  117. * @retval 无
  118. */
  119. void ADVANCE_TIM_Init(void)
  120. {
  121. ADVANCE_TIM_GPIO_Config();
  122. ADVANCE_TIM_NVIC_Config();
  123. ADVANCE_TIM_Mode_Config();
  124. }
  125. /*********************************************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. // 我们这里默认使用TIM3
  7. #define GENERAL_TIM TIM3
  8. #define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
  9. #define GENERAL_TIM_CLK RCC_APB1Periph_TIM3
  10. // 输出PWM的频率为 72M/{ (ARR+1)*(PSC+1) }
  11. #define GENERAL_TIM_PERIOD (10-1)
  12. #define GENERAL_TIM_PSC (72-1)
  13. #define GENERAL_TIM_CCR1 5
  14. #define GENERAL_TIM_CCR2 4
  15. #define GENERAL_TIM_CCR3 3
  16. #define GENERAL_TIM_CCR4 2
  17. // TIM3 输出比较通道1
  18. #define GENERAL_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
  19. #define GENERAL_TIM_CH1_PORT GPIOA
  20. #define GENERAL_TIM_CH1_PIN GPIO_Pin_6
  21. // TIM3 输出比较通道2
  22. #define GENERAL_TIM_CH2_GPIO_CLK RCC_APB2Periph_GPIOA
  23. #define GENERAL_TIM_CH2_PORT GPIOA
  24. #define GENERAL_TIM_CH2_PIN GPIO_Pin_7
  25. // TIM3 输出比较通道3
  26. #define GENERAL_TIM_CH3_GPIO_CLK RCC_APB2Periph_GPIOB
  27. #define GENERAL_TIM_CH3_PORT GPIOB
  28. #define GENERAL_TIM_CH3_PIN GPIO_Pin_0
  29. // TIM3 输出比较通道4
  30. #define GENERAL_TIM_CH4_GPIO_CLK RCC_APB2Periph_GPIOB
  31. #define GENERAL_TIM_CH4_PORT GPIOB
  32. #define GENERAL_TIM_CH4_PIN GPIO_Pin_1
  33. /**************************函数声明********************************/
  34. void GENERAL_TIM_Init(void);
  35. #endif /* __BSP_GENERALTIME_H */

bsp_GeneralTim.c

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

main.c

  1. /* TIM—高级定时器-PWM输入捕获应用,通用定时器产生PWM波,
  2. 高级定时器则捕获这个PWM,并测量周期和占空比*/
  3. #include "stm32f10x.h"
  4. #include "bsp_led.h"
  5. #include "bsp_AdvanceTim.h"
  6. #include "bsp_GeneralTim.h"
  7. #include "bsp_usart.h"
  8. /**
  9. * @brief 主函数
  10. * @param 无
  11. * @retval 无
  12. */
  13. int main(void)
  14. {
  15. /* 串口初始化 */
  16. USART_Config();
  17. /* 通用定时器初始化,用于生成PWM信号 */
  18. GENERAL_TIM_Init();
  19. /* 高级定时器初始化 ,用户捕获PWM信号*/
  20. ADVANCE_TIM_Init();
  21. while(1)
  22. {
  23. }
  24. }
  25. /*********************************************END OF FILE**********************/

1-TIM—高级定时器-定时.zip
2-TIM—高级定时器-PWM互补输出带死区时间.zip3-TIM—高级定时器-PWM输入捕获.zip