myTim.c 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "myTim.h"
  2. #include "stm32f10x_tim.h"
  3. TIM_CALLBACK timCallBack;
  4. /**
  5. * tim3定时器初始化
  6. * @period_us:定时器定时周期,以微秒为单位
  7. * @cb:定时器回调函数,定时器计时溢出时调用该函数,
  8. 相当于向外抛出中断,方便主函数调用
  9. */
  10. void myTim3_init(uint32_t period_us, TIM_CALLBACK cb)
  11. {
  12. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  13. NVIC_InitTypeDef NVIC_InitStructure;
  14. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  15. //中断优先级NVIC设置
  16. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
  17. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
  18. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级3级
  19. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  20. NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
  21. //定时器TIM3初始化
  22. TIM_TimeBaseStructure.TIM_Period = period_us; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  23. TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1); //系统主时钟72MHz,TIM_ClockDivision = TIM_CKD_DIV1
  24. //此处再72分频得到1MHz的计数时钟(即1MHz = 1us周期)
  25. //需要多少微妙的周期,只需通过TIM_Period赋值既可得到相应
  26. //的周期定时器
  27. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  28. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  29. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  30. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  31. TIM_Cmd(TIM3, ENABLE); //使能TIMx
  32. timCallBack = cb;
  33. }
  34. // void TIM3_IRQHandler(void) //TIM3中断
  35. // {
  36. // if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
  37. // {
  38. // TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
  39. // if(timCallBack)
  40. // {
  41. // timCallBack();
  42. // }
  43. // }
  44. // }
  45. /**
  46. * tim1定时器初始化
  47. * @period_us:定时器定时周期,以微秒为单位
  48. * @cb:定时器回调函数,定时器计时溢出时调用该函数,
  49. 相当于向外抛出中断,方便主函数调用
  50. */
  51. void myTim1_init(uint32_t period_us, TIM_CALLBACK cb)
  52. {
  53. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  54. NVIC_InitTypeDef NVIC_InitStructure;
  55. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
  56. //中断优先级NVIC设置
  57. NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM3中断
  58. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
  59. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级3级
  60. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  61. NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
  62. //定时器TIM3初始化
  63. TIM_TimeBaseStructure.TIM_Period = period_us; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  64. TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1); //系统主时钟72MHz,TIM_ClockDivision = TIM_CKD_DIV1
  65. //此处再72分频得到1MHz的计数时钟(即1MHz = 1us周期)
  66. //需要多少微妙的周期,只需通过TIM_Period赋值既可得到相应
  67. //的周期定时器
  68. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  69. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  70. TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  71. TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE ); //使能指定的TIM3中断,允许更新中断
  72. TIM_Cmd(TIM1, ENABLE); //使能TIMx
  73. timCallBack = cb;
  74. }
  75. void TIM1_UP_IRQHandler(void) //TIM1中断
  76. {
  77. if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
  78. {
  79. TIM_ClearITPendingBit(TIM1, TIM_IT_Update ); //清除TIMx更新中断标志
  80. if(timCallBack)
  81. {
  82. timCallBack();
  83. }
  84. }
  85. }