main.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "string.h"
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. #include "hal_key.h"
  6. #include "sys_log.h"
  7. #include "sys_queue.h"
  8. #include "sys_timer.h"
  9. #include "sys_ver.h"
  10. #include "hal_led.h"
  11. #include "hal_spi.h"
  12. #include "hal_can.h"
  13. #include "hal_timer.h"
  14. #include "hal_ble.h"
  15. #include "hal_wdg.h"
  16. #include "hal_adc.h"
  17. #include "mod_candataprocess.h"
  18. #include "mod_spi.h"
  19. #include "mod_atcmd.h"
  20. #include "mod_key.h"
  21. #include "mod_sys.h"
  22. #define RX_HEART_CAN_ID_EN 1
  23. #define OBD_HEART_CAN_ID 0x130
  24. queue_list_t g_s_uart_rx_list;
  25. queue_list_t g_s_spi_rx_list;
  26. queue_list_t g_s_spi_tx_list;
  27. queue_list_t g_s_can_rx_list;
  28. static uint8_t rx_heart_id_cnt = 0;
  29. static void spi_inter_callback(uint8_t type)
  30. {
  31. uint8_t rx_buf[QUEUE_MAX_DATA_LEN];
  32. memset(rx_buf, 0, QUEUE_MAX_DATA_LEN);
  33. HAL_SpiRxData(rx_buf, QUEUE_MAX_DATA_LEN);
  34. queue_in(&g_s_spi_rx_list, rx_buf, QUEUE_MAX_DATA_LEN);
  35. }
  36. static void led_toggle_timer_callback()
  37. {
  38. HAL_LedToggle(LED_BLUE);
  39. }
  40. static void print_log_timer_callback()
  41. {
  42. static uint32_t run_second;
  43. run_second += 5;
  44. DLOG_I("mcu run seconds:%ds", run_second);
  45. if(60*60*24*7 == run_second)
  46. {
  47. run_second = 0;
  48. }
  49. }
  50. void spi_send_callback(uint8_t* data, uint8_t len)
  51. {
  52. queue_in(&g_s_spi_tx_list, data, len);
  53. }
  54. void uart_isr_callback(uint8_t* data, uint8_t len)
  55. {
  56. queue_in(&g_s_uart_rx_list, data, len);
  57. }
  58. //static void key_long_press_callback(void)
  59. //{
  60. // DLOG_I("key_long_pressed");
  61. //}
  62. static void can_rx_callback(uint8_t can_id_type, uint32_t can_id, uint8_t* can_data, uint8_t data_len)
  63. {
  64. //buf格式:can帧id类型,can帧id,can帧长度,can帧数据
  65. //接收到数据以后,将数据放入队列.
  66. uint8_t buf_len = 0;
  67. uint8_t can_buf[32];
  68. // if(CAN_ID_EXT == can_id_type)
  69. // {
  70. // DLOG_E("can_id_type:0x%x", can_id_type);
  71. // return;
  72. // }
  73. #if RX_HEART_CAN_ID_EN
  74. //宝马摩托车的心跳帧为100ms一次,在这做下统计,每3s上报一次.
  75. if(can_id == OBD_HEART_CAN_ID)
  76. {
  77. rx_heart_id_cnt += 1;
  78. if(rx_heart_id_cnt < 30)
  79. {
  80. return;
  81. }
  82. else
  83. {
  84. rx_heart_id_cnt = 0;
  85. }
  86. }
  87. #endif
  88. //帧类型
  89. can_buf[0] = can_id_type;
  90. buf_len += 1;
  91. //帧id
  92. memcpy(&can_buf[1], &can_id, 4);
  93. buf_len += 4;
  94. //帧数据包长度
  95. can_buf[5] = data_len;
  96. buf_len += 1;
  97. //帧数据包内容
  98. memcpy(&can_buf[6], can_data, data_len);
  99. buf_len += data_len;
  100. queue_in(&g_s_can_rx_list, can_buf, buf_len);
  101. }
  102. static void can_tx_callback(void)
  103. {
  104. // DLOG_I("can_tx_cb");
  105. }
  106. static void can_error_callback(uint32_t err_code)
  107. {
  108. DLOG_E("can_error:0x%x",err_code);
  109. }
  110. int main(void)
  111. {
  112. int err_code;
  113. CAN_RxHeaderTypeDef can_rx_header;
  114. memset(&can_rx_header, 0, sizeof(CAN_RxHeaderTypeDef));
  115. HAL_Init();
  116. Stm32_Clock_Init(RCC_PLL_MUL9);
  117. delay_init(72);
  118. uart_init(115200);
  119. HAL_WdgInit(IWDG_PRESCALER_64, 2000);
  120. HAL_WdgFeed();
  121. queue_init(&g_s_uart_rx_list);
  122. queue_init(&g_s_spi_rx_list);
  123. queue_init(&g_s_spi_tx_list);
  124. queue_init(&g_s_can_rx_list);
  125. HAL_AdcInit();
  126. HAL_UartIsrCallbackRegister(uart_isr_callback);
  127. Sys_LogPrintCallbackRegister(HAL_Usart1SendData);
  128. HAL_BleEnGpioInit();
  129. HAL_BleGpioEn(true);
  130. HAL_LedInit();
  131. HAL_LedOff(LED_BLUE);
  132. HAL_Timer3Init(10-1, 7200-1);
  133. MOD_SpiDataSendCallbackRegister(spi_send_callback);
  134. HAL_SpiInit(spi_inter_callback);
  135. HAL_CanCallbackRegister(can_rx_callback, can_tx_callback, can_error_callback);
  136. err_code = HAL_CanInit();
  137. if (0 != err_code)
  138. {
  139. DLOG_E("can_init_error");
  140. while (1) {}
  141. }
  142. err_code = HAL_CanStart();
  143. if (0 != err_code)
  144. {
  145. DLOG_E("can_start_error");
  146. while (1) {}
  147. }
  148. MOD_SysInit();
  149. // MOD_KeyInit(key_long_press_callback);
  150. HAL_TimerRegister(led_toggle_timer_callback, 200);
  151. HAL_TimerRegister(print_log_timer_callback, 5000);
  152. DLOG_I("init finished, ver:0x%x", get_ver());
  153. while (1)
  154. {
  155. QUEUE_MSG_PROCESS(&g_s_can_rx_list, MOD_CanRxDataProcess);
  156. QUEUE_MSG_PROCESS(&g_s_spi_tx_list, HAL_SpiTxData);
  157. QUEUE_MSG_PROCESS(&g_s_spi_rx_list, MOD_SpiDataProcess);
  158. QUEUE_MSG_PROCESS(&g_s_uart_rx_list, MOD_AtCmdDataProcess);
  159. }
  160. }