main.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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 0
  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. #else
  88. if(can_id == OBD_HEART_CAN_ID)
  89. {
  90. return;
  91. }
  92. #endif
  93. //帧类型
  94. can_buf[0] = can_id_type;
  95. buf_len += 1;
  96. //帧id
  97. memcpy(&can_buf[1], &can_id, 4);
  98. buf_len += 4;
  99. //帧数据包长度
  100. can_buf[5] = data_len;
  101. buf_len += 1;
  102. //帧数据包内容
  103. memcpy(&can_buf[6], can_data, data_len);
  104. buf_len += data_len;
  105. queue_in(&g_s_can_rx_list, can_buf, buf_len);
  106. }
  107. static void can_tx_callback(void)
  108. {
  109. // DLOG_I("can_tx_cb");
  110. }
  111. static void can_error_callback(uint32_t err_code)
  112. {
  113. DLOG_E("can_error:0x%x",err_code);
  114. }
  115. int main(void)
  116. {
  117. int err_code;
  118. CAN_RxHeaderTypeDef can_rx_header;
  119. memset(&can_rx_header, 0, sizeof(CAN_RxHeaderTypeDef));
  120. HAL_Init();
  121. Stm32_Clock_Init(RCC_PLL_MUL9);
  122. delay_init(72);
  123. uart_init(115200);
  124. HAL_WdgInit(IWDG_PRESCALER_64, 2000);
  125. HAL_WdgFeed();
  126. queue_init(&g_s_uart_rx_list);
  127. queue_init(&g_s_spi_rx_list);
  128. queue_init(&g_s_spi_tx_list);
  129. queue_init(&g_s_can_rx_list);
  130. HAL_AdcInit();
  131. HAL_UartIsrCallbackRegister(uart_isr_callback);
  132. Sys_LogPrintCallbackRegister(HAL_Usart1SendData);
  133. HAL_BleEnGpioInit();
  134. HAL_BleGpioEn(true);
  135. HAL_LedInit();
  136. HAL_LedOff(LED_BLUE);
  137. HAL_Timer3Init(10-1, 7200-1);
  138. MOD_SpiDataSendCallbackRegister(spi_send_callback);
  139. HAL_SpiInit(spi_inter_callback);
  140. HAL_CanCallbackRegister(can_rx_callback, can_tx_callback, can_error_callback);
  141. err_code = HAL_CanInit();
  142. if (0 != err_code)
  143. {
  144. DLOG_E("can_init_error");
  145. while (1) {}
  146. }
  147. err_code = HAL_CanStart();
  148. if (0 != err_code)
  149. {
  150. DLOG_E("can_start_error");
  151. while (1) {}
  152. }
  153. MOD_SysInit();
  154. // MOD_KeyInit(key_long_press_callback);
  155. HAL_TimerRegister(led_toggle_timer_callback, 200);
  156. HAL_TimerRegister(print_log_timer_callback, 5000);
  157. DLOG_I("init finished, ver:0x%x", get_ver());
  158. while (1)
  159. {
  160. QUEUE_MSG_PROCESS(&g_s_can_rx_list, MOD_CanRxDataProcess);
  161. QUEUE_MSG_PROCESS(&g_s_spi_tx_list, HAL_SpiTxData);
  162. QUEUE_MSG_PROCESS(&g_s_spi_rx_list, MOD_SpiDataProcess);
  163. QUEUE_MSG_PROCESS(&g_s_uart_rx_list, MOD_AtCmdDataProcess);
  164. }
  165. }