TIMER.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /**
  2. * @copyright None
  3. * @file TIMER.c
  4. * @author Comment Vivre
  5. * @date 2024-08-27
  6. * @brief None
  7. */
  8. #include <MyProject.h>
  9. void Timer2_Init(void)
  10. {
  11. ClrBit(TIM2_CR1, T2CEN); // TIM2使能 0-->Disable 1-->Enable
  12. ClrBit(PH_SEL, T2SEL); // P10复用作为 Timer2 的输入输出
  13. ClrBit(PH_SEL, T2SSEL); // P07复用作为 Timer2 的输入输出
  14. ClrBit(TIM2_CR0, T2PSC2); // 计数器时钟分频选择
  15. SetBit(TIM2_CR0, T2PSC1); // 000-->24M 001-->12M 010-->6M 011-->3M
  16. SetBit(TIM2_CR0, T2PSC0); // 100-->1.5M 101-->750K 110-->375K 111-->187.5K
  17. ClrBit(TIM2_CR0, T2MOD1); // 00-->输入Timer模式 01-->输出模式
  18. SetBit(TIM2_CR0, T2MOD0); // 10-->输入Counter模式 11-->QEP&ISD&步进模式
  19. ClrBit(TIM2_CR0, T2OCM); // 0: TIM2__CNTR < TIM2__DR,输出 0;TIM2__CNTR ≥ TIM2__DR,输出 1
  20. // 1: TIM2__CNTR < TIM2__DR,输出 1;TIM2__CNTR ≥ TIM2__DR,输出 0
  21. ClrBit(TIM2_CR0, T2CES); // 清零脉冲计数器不使能
  22. SetBit(TIM2_CR0, T2IRE); // 比较匹配中断/脉宽检测中断0-->Disable 1-->Enable
  23. SetBit(TIM2_CR1, T2IFE); // 计数器上溢中断使能 0-->Disable 1-->Enable
  24. ClrBit(TIM2_CR1, T2IR | T2IF | T2IP); // 清零中断标志位
  25. ClrBit(TIM2_CR1, T2IPE); // 输入Timer PWM周期检测中断使能 0-->Disable 1-->Enable
  26. ClrBit(TIM2_CR1, T2FE); // 输入噪声滤波使能,小于4个时钟周期脉宽滤除
  27. ClrBit(TIM2_CR1, T2DIR); // QEP&ISD&步进模式专用:当前的方向 0-->正向 1-->反向
  28. SetBit(IP1, PTIM21);
  29. SetBit(IP1, PTIM20); // 中断优先级别为2
  30. TIM2__ARR = 30000; // //3M分频,1/3us,30000对应延迟10ms
  31. TIM2__DR = 0;
  32. TIM2__CNTR = 0;
  33. SetBit(TIM2_CR1, T2CEN); // TIM2使能 0-->Disable 1-->Enable
  34. }
  35. /* -------------------------------------------------------------------------------------------------
  36. Function Name : Timer3_Init
  37. Description : 定时器3初始化
  38. Date : 2021-11-08
  39. Parameter : None
  40. ------------------------------------------------------------------------------------------------- */
  41. void Timer3_Init(void)
  42. {
  43. SetBit(PH_SEL, T3SEL); // Timer3端口使能
  44. ClrBit(PH_SEL1, T3CT0);
  45. SetBit(PH_SEL1, T3CT1); // 00:P11 X1:P01 10:P47
  46. SetBit(TIM3_CR0, T3PSC2); // 计数器时钟分频选择
  47. SetBit(TIM3_CR0, T3PSC1); // 000-->24M 001-->12M 010-->6M 011-->3M
  48. ClrBit(TIM3_CR0, T3PSC0); // 100-->1.5M 101-->750K 110-->375K 111-->187.5K
  49. ClrBit(TIM3_CR0, T3OCM);
  50. ClrBit(TIM3_CR0, T3IRE); // 比较匹配中断/脉宽检测中断0-->Disable 1-->Enable
  51. ClrBit(TIM3_CR0, T3OPM); // 0-->计数器不停止 1-->单次模式
  52. SetBit(TIM3_CR1, T3IPE); // 输入Timer PWM周期检测中断使能 0-->Disable 1-->Enable
  53. SetBit(TIM3_CR1, T3IFE); // 计数器上溢中断使能 0-->Disable 1-->Enable
  54. ClrBit(TIM3_CR1, T3NM1); // 输入噪声脉宽选择
  55. ClrBit(TIM3_CR1, T3NM0); // 00-->不滤波 01-->4cycles 10-->8cycles 11-->16cycles
  56. // /* 定时器配置 */
  57. // SetBit(IP2, PTIM31); //1ms定时中断优先级别为1
  58. // SetBit(IP2, PTIM30);
  59. // TIM3__DR = 1200;
  60. // TIM3__ARR = 2400;
  61. ClrBit(TIM3_CR0, T3MOD); // 0-->Timer模式 1-->输出模式
  62. SetBit(TIM3_CR1, T3EN); // TIM3使能 0-->Disable 1-->Enable
  63. }
  64. /**
  65. * @function TIM4_Init
  66. * @brief TIM4初始化配置 用于FG
  67. * @param[in] None
  68. * @return None
  69. * @date 2024-01-20
  70. */
  71. void TIM4_Init(void)
  72. {
  73. // 先停止计数,配置完寄存器后,最后启动计数
  74. ClrBit(TIM4_CR1, T4EN); // 0 - 停止计数;1 - 使能计数
  75. SetBit(PH_SEL, T4SEL); // 1 - P0.1作为Time4的输入输出
  76. // 配置P12为定时器输入输出
  77. SetReg(PH_SEL1,T4CT1|T4CT0,T4CT1);
  78. // 时钟分频设置(T4PSC)
  79. // 000:cpuclk(24MHz) 001:cpuclk/2^1(12MHz) 010:cpuclk/2^2(6MHz) 011:cpuclk/2^3(3MHz)
  80. // 100:cpuclk/2^4(1.5MHz) 101:cpuclk/2^5(750KHz) 110:cpuclk/2^6(375KHz) 111:cpuclk/2^7(187.5KHz)
  81. SetReg(TIM4_CR0, T4PSC0 | T4PSC1 | T4PSC2, T4PSC0);
  82. // 输入输出模式选择
  83. // T4MOD = 0 输入Timer模式
  84. // T4MOD = 1 输出模式
  85. SetBit(TIM4_CR0, T4MOD);
  86. // ClrBit(TIM4_CR0, T4MOD);
  87. // 输出模式:比较模式选择
  88. // T4OCM = 0 TIM4__CNTR <= TIM4__DR 输出 “0” TIM4__CNTR > TIM4__DR 输出 “1”
  89. // T4OCM = 1 TIM4__CNTR <= TIM4__DR 输出 “1” TIM4__CNTR > TIM4__DR 输出 “0”
  90. // 输入Timer模式 :周期沿选择
  91. // T4OCM = 0 相邻两个上升沿为1个周期,上升沿到下降沿为高电平脉宽
  92. // T4OCM = 1 相邻两个下降沿为1个周期,下降沿到上升沿为低电平脉宽
  93. // SetBit(TIM4_CR0, T4OCM); //输出比较器匹配模式,TIM3_CNTR≤TIM3_DR: 0;
  94. ClrBit(TIM4_CR0, T4OCM);
  95. // 滤波时间
  96. // 00 - 不滤波; 01 - 8个时钟周期
  97. // 10 - 16个时钟周期; 11 - 32个时钟周期
  98. SetReg(TIM4_CR1, T4NM1 | T4NM0, T4NM1 | T4NM0);
  99. // 清除中断标志位
  100. // 禁止PWM周期检测中断使能
  101. // 使能计数器上溢中断使能
  102. ClrBit(TIM4_CR1, T4IR | T4IP | T4IF); // 清除中断标志位
  103. ClrBit(TIM4_CR1, T4IFE | T4IPE); // 输入有效边沿变化中断使能和基本计数器上溢使能
  104. ClrBit(TIM4_CR0, T4IRE); // 輸出模式:比較匹配中斷使能 輸入模式:脈寬檢測中斷使能
  105. // 单次模式配置
  106. // 输出模式:计数器上溢事件
  107. // 输入模式:PWM周期检测或计数器上溢事件
  108. // T4OPM = 0 发生上述事件时,计数器不停止
  109. // T4OPM = 1 发生上述事件时,计数器停止(清除T4EN)
  110. ClrBit(TIM4_CR0, T4OPM);
  111. // 定时器4中断优先级配置及芯片中断总使能
  112. // 中断优先级控制值从0-3依次表示优先级从最低到最高,共4级优化级控制
  113. ClrBit(IP2, PTIM41);
  114. ClrBit(IP2, PTIM40);
  115. // 配置周期值、比较值、计数值
  116. TIM4__DR = 12000; // 输入模式,DR和ARR的值由硬件写;
  117. TIM4__ARR = 24000.;
  118. TIM4__CNTR = 0;
  119. // 启动计数
  120. SetBit(TIM4_CR1, T4EN); // 使能计数器,启动计数
  121. }