soft_timer.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #include "soft_timer.h"
  2. #include "main.h"
  3. #include "stdbool.h"
  4. #include "soft_can.h"
  5. #include "usart_data_handle.h"
  6. #include "main_task.h"
  7. #include "string.h"
  8. extern uint32_t user_timer_cnt;
  9. /**
  10. * @file timer_function
  11. * @brief 发送给控制的定时器
  12. * @param
  13. * @details
  14. * @author Zhang Sir
  15. **/
  16. bool vol_flag = false, devtype_flag = false, engine_flag = false,
  17. can_debug_flag = false, dev_version_flag = false,mimo360_radar_flag = false,
  18. pmu_heart_flag = false;
  19. Dev_timer send_devinfo_time;
  20. void timer_function()
  21. {
  22. static uint32_t time_1hz = 0;
  23. static uint32_t time_2hz = 0;
  24. static uint32_t time_5hz = 0;
  25. static uint32_t time_10hz = 0;
  26. static uint32_t time_20hz = 0;
  27. static uint32_t time_50hz = 0;
  28. static uint32_t time_100hz = 0;
  29. static uint32_t time_500hz = 0;
  30. if ( Check_Timer_Ready(&time_1hz,_1_HZ_) )
  31. {
  32. send_devinfo_time.arm = true;
  33. }
  34. if ( Check_Timer_Ready(&time_2hz,_2_HZ_) )
  35. {
  36. send_devinfo_time.nozzle = true;
  37. send_devinfo_time.seed = true;
  38. send_devinfo_time.checklow = true;
  39. dev_version_flag = true;
  40. }
  41. if ( Check_Timer_Ready(&time_5hz,_5_HZ_))
  42. {
  43. engine_flag = true;
  44. send_devinfo_time.bms = true;
  45. if(planep.Candebug_flag == true)
  46. {
  47. can_debug_flag = true;
  48. }
  49. else
  50. {
  51. can_debug_flag = false;
  52. }
  53. }
  54. if ( Check_Timer_Ready(&time_10hz,_10_HZ_) )
  55. {
  56. }
  57. if ( Check_Timer_Ready(&time_20hz,_20_HZ_) )
  58. {
  59. vol_flag = true;
  60. mimo360_radar_flag = true;
  61. send_devinfo_time.weight = true;
  62. send_devinfo_time.radar = true;
  63. send_devinfo_time.flow = true;
  64. send_devinfo_time.L_pump1 = true;
  65. send_devinfo_time.L_pump2 = true;
  66. send_devinfo_time.pump = true;
  67. }
  68. if ( Check_Timer_Ready(&time_50hz,_50_HZ_) )
  69. {
  70. // 数据量包太多,超过了200hz极限,导致丢数据。
  71. send_devinfo_time.part_radar = true;
  72. send_devinfo_time.part_Fradar = true;
  73. send_devinfo_time.part_Bradar = true;
  74. devtype_flag = true;
  75. }
  76. if(Check_Timer_Ready(&time_100hz,_100_HZ_))
  77. {
  78. }
  79. if(Check_Timer_Ready(&time_500hz,_200_HZ_))
  80. {
  81. }
  82. }
  83. /**
  84. * @file Get_Systimer_Us
  85. * @brief 获取系统当前时间us
  86. * @param
  87. * @details
  88. * @author Zhang Sir
  89. **/
  90. uint32_t Get_Systimer_Us(void)
  91. {
  92. uint32_t time = 0;
  93. rt_enter_critical(); // 进入临界 不允许调度器执行
  94. time = htim4.Instance->CNT + user_timer_cnt * 20000;
  95. rt_exit_critical(); //退出临界
  96. return time;
  97. }
  98. uint32_t test_time[10] = {0};
  99. uint32_t test_priod = 0;
  100. uint32_t check_period_func(uint32_t *time)
  101. {
  102. uint32_t time_err = 0;
  103. time_err = HAL_GetTick() - *time;
  104. *time = HAL_GetTick();
  105. return time_err;
  106. }
  107. uint8_t isLeapYear(uint16_t year)
  108. {
  109. uint8_t res=0;
  110. if(year%4 == 0) // 能够被4整除
  111. {
  112. if(year%100 != 0 || year%400 == 0) //能被4整除不能被100整除或者能够被400整除
  113. {
  114. res = 1;
  115. }
  116. else
  117. {
  118. res =0;
  119. }
  120. }
  121. return res;
  122. }
  123. // 将Unix时间戳转换为北京时间
  124. // unixTime: 需要判断的Unix时间戳
  125. // *tempBeijing:返回的北京时间
  126. // return:none
  127. // note:没对输入参数正确性做判断
  128. rtc_time_t beijing_time;
  129. uint8_t utc_send_time = 10;
  130. uint32_t utc_time = 0;
  131. void covUnixTimeStp2Beijing( uint32_t unixTime, rtc_time_t *tempBeijing )
  132. {
  133. uint32_t totleDayNum = 0, totleSecNum = 0;
  134. uint16_t remainDayofYear = 0, tempYear = 0;
  135. uint8_t *pr = NULL;
  136. static uint8_t month_day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年
  137. static uint8_t Leap_month_day[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年
  138. totleDayNum = unixTime / ( 24 * 60 * 60 ); //总天数(注意加括号)
  139. totleSecNum = unixTime % ( 24 * 60 * 60 ); //当天剩余的秒速
  140. memset( tempBeijing, 0x00, sizeof( rtc_time_t ) );
  141. // 1.先计算时间 HH:MM:SS
  142. tempBeijing->ui8Hour = totleSecNum / 3600;
  143. tempBeijing->ui8Minute = ( totleSecNum % 3600 ) / 60; //error:变量搞错
  144. tempBeijing->ui8Second = ( totleSecNum % 3600 ) % 60;
  145. // 2.对时间进行时区调整(注意:这里可能造成日期 +1)
  146. tempBeijing->ui8Hour += TIMEZONE;
  147. if ( tempBeijing->ui8Hour > 23 )
  148. {
  149. //printf("modify day..\n");
  150. tempBeijing->ui8Hour -= 24;
  151. remainDayofYear++; // 日期+1
  152. }
  153. // 3.计算哪一年
  154. tempBeijing->ui8Year = 1970 + ( totleDayNum / FOURYEARDAY ) * 4; // 4年为一个周期
  155. remainDayofYear += totleDayNum % FOURYEARDAY;
  156. //printf("year:%d, day:%d.\n", tempBeijing->ui8Year, remainDayofYear);
  157. tempYear = isLeapYear( tempBeijing->ui8Year ) ? 366 : 365;
  158. while ( remainDayofYear >= tempYear ) // 计算4年整数倍外的年。
  159. {
  160. tempBeijing->ui8Year++;
  161. remainDayofYear -= tempYear;
  162. tempYear = isLeapYear( tempBeijing->ui8Year ) ? 366 : 365;
  163. }
  164. // 4.计算哪一月的哪一天
  165. pr = isLeapYear( tempBeijing->ui8Year ) ? Leap_month_day : month_day;
  166. remainDayofYear++; // 这里开始计算具体日期。remainDayofYear为 0 时其实是 1 号,所以这里要 +1
  167. while ( remainDayofYear > *( pr + tempBeijing->ui8Month ) )
  168. {
  169. remainDayofYear -= *( pr + tempBeijing->ui8Month );
  170. tempBeijing->ui8Month++;
  171. }
  172. //printf("year:%d, day:%d.\n", tempBeijing->ui8Year, remainDayofYear);
  173. tempBeijing->ui8Month++; //month
  174. tempBeijing->ui8DayOfMonth = remainDayofYear; //day
  175. //printf("year:%d, day:%d.\n", tempBeijing->ui8Year, tempBeijing->ui8DayOfMonth);
  176. }