myTim.c 4.2 KB

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