soft_timer.c 5.8 KB

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