os.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "os.h"
  2. #include "libs/task.h"
  3. #include "bsp/bsp.h"
  4. //one while will use 4 ins
  5. /* below function is dumy here, will overide by xxx_rtc.c */
  6. __weak void rtc_set_time_with_utc_second(uint32_t s){
  7. }
  8. __weak uint32_t rtc_get_timestamp(void){
  9. return 0;
  10. }
  11. void task_delay(int ms) {
  12. os_udelay(ms*1000);
  13. }
  14. void os_ticks_enable(void)
  15. {
  16. CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
  17. DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
  18. }
  19. u32 os_ticks_abs(void)
  20. {
  21. return DWT->CYCCNT;
  22. }
  23. u32 os_ticks_rel(u32 start)
  24. {
  25. u32 ticks = DWT->CYCCNT;
  26. if (ticks >= start) {
  27. return ticks - start;
  28. }
  29. return 0xFFFFFFFF - start + ticks + 1;
  30. }
  31. void os_ticks_delay(u32 ticks)
  32. {
  33. volatile u32 start = os_ticks_abs();
  34. while (os_ticks_rel(start) < ticks);
  35. }
  36. void os_udelay(u32 delay)
  37. {
  38. os_ticks_delay(delay * (SystemCoreClock / 1000000));
  39. }
  40. /* set rtc time, used utc timestamp, can not include time zone*/
  41. uint32_t calendar_to_utc(time_val *time){
  42. struct tm utc_time;
  43. struct tm my_time;
  44. memset(&utc_time, 0, sizeof (struct tm));
  45. memset(&my_time, 0, sizeof (struct tm));
  46. my_time.tm_mday = time->day;
  47. my_time.tm_mon = time->month- 1;
  48. my_time.tm_year = time->year - 1900;
  49. my_time.tm_hour = time->hour;
  50. my_time.tm_min = time->minute;
  51. my_time.tm_sec = time->second;
  52. utc_time.tm_mday = 1;
  53. utc_time.tm_mon = 1 - 1;
  54. utc_time.tm_year = 1970 - 1900;
  55. utc_time.tm_hour = 0;
  56. utc_time.tm_min = 0;
  57. utc_time.tm_sec = 0;
  58. return mktime(&my_time) - mktime(&utc_time);
  59. }
  60. void set_utc_time(time_val *time){
  61. uint32_t second = calendar_to_utc(time);
  62. rtc_set_time_with_utc_second(second);
  63. }
  64. /* get the utc readable time */
  65. void utc_to_calendar(uint32_t second, time_val *out){
  66. struct tm *tm;
  67. tm = localtime((time_t *)&second);
  68. out->year = tm->tm_year + 1900;
  69. out->month = tm->tm_mon + 1;
  70. out->day = tm->tm_mday;
  71. out->hour = tm->tm_hour;
  72. out->minute = tm->tm_min;
  73. out->second = tm->tm_sec;
  74. }
  75. /*tz quarter-hour ,15min ,-48~+48*/
  76. uint32_t get_timestamp_with_time_zone(int8_t tz){
  77. return (rtc_get_timestamp()+ tz*15*60);
  78. }
  79. uint32_t get_timestamp(void){
  80. return rtc_get_timestamp();
  81. }
  82. void get_local_time(time_val *out, int8_t tz){
  83. utc_to_calendar(get_timestamp_with_time_zone(tz), out);
  84. }