TIM.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "TIM.h"
  2. #include "LED.h"
  3. #include "uart.h"
  4. /************************通用定时器2~5初始化************************/
  5. //--TIMx---TIM2~TIM5
  6. //--Tout-定时器溢出时间
  7. #define TIMx_PSC 7199 //分频系数-=7199时,ms级定时;=71时,us级定时
  8. void TIMx_Init(TIM_TypeDef* TIMx,u16 Tout)
  9. {
  10. u16 arr=0;
  11. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
  12. NVIC_InitTypeDef NVIC_InitStructure;
  13. //--使能TIMx外设时钟
  14. if(TIMx==TIM2)
  15. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  16. else if(TIMx==TIM3)
  17. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  18. else if(TIMx==TIM4)
  19. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
  20. else if(TIMx==TIM5)
  21. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
  22. //--定时器初始化
  23. if(TIMx_PSC==7199) arr=Tout*10-1; //ms级定时
  24. else if(TIMx_PSC==71) arr=Tout-1; //us级定时
  25. TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim,
  26. TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数器模式,向上,向下,向上/向下
  27. TIM_TimeBaseInitStrue.TIM_Period=arr; //重装值
  28. TIM_TimeBaseInitStrue.TIM_Prescaler=TIMx_PSC; //预分频系数
  29. TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStrue);
  30. //--使能TIM2中断
  31. TIM_ITConfig(TIMx,TIM_IT_Update,ENABLE);
  32. //--NVIC分配
  33. if(TIMx==TIM2)
  34. {
  35. NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
  36. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  37. }
  38. else if(TIMx==TIM3)
  39. {
  40. NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
  41. NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  42. }
  43. else if(TIMx==TIM4)
  44. {
  45. NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
  46. NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
  47. }
  48. else if(TIMx==TIM5)
  49. {
  50. NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
  51. NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
  52. }
  53. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  54. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  55. NVIC_Init(&NVIC_InitStructure);
  56. //--使能定时器
  57. TIM_Cmd(TIMx,ENABLE);
  58. }
  59. /******定时器2中断服务程序*****/
  60. void TIM2_IRQHandler()
  61. {
  62. if(TIM_GetITStatus(TIM2,TIM_IT_Update))
  63. {
  64. TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清中断
  65. if( Uart_dat.Receive_Byte_Flag )
  66. {
  67. Uart_dat.WaitTime++;
  68. if( Uart_dat.WaitTime > Uart_dat.WaitTime_Max )
  69. Uart_dat.Receive_OK = 1;
  70. }
  71. }
  72. }
  73. /******定时器3中断服务程序*****/
  74. void TIM3_IRQHandler()
  75. {
  76. if(TIM_GetITStatus(TIM3,TIM_IT_Update))
  77. {
  78. LED0=!LED0;
  79. TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清中断
  80. }
  81. }
  82. /******定时器4中断服务程序*****/
  83. void TIM4_IRQHandler()
  84. {
  85. if(TIM_GetITStatus(TIM4,TIM_IT_Update))
  86. {
  87. LED1=!LED1;
  88. TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清中断
  89. }
  90. }
  91. /******定时器5中断服务程序*****/
  92. void TIM5_IRQHandler()
  93. {
  94. if(TIM_GetITStatus(TIM5,TIM_IT_Update))
  95. {
  96. LED1=!LED1;
  97. TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清中断
  98. }
  99. }