can.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file can.c
  5. * @brief This file provides code for the configuration
  6. * of the CAN instances.
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * Copyright (c) 2025 STMicroelectronics.
  11. * All rights reserved.
  12. *
  13. * This software is licensed under terms that can be found in the LICENSE file
  14. * in the root directory of this software component.
  15. * If no LICENSE file comes with this software, it is provided AS-IS.
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "can.h"
  22. /* USER CODE BEGIN 0 */
  23. #include "bsp.h"
  24. /* USER CODE END 0 */
  25. CAN_HandleTypeDef hcan1;
  26. CAN_HandleTypeDef hcan2;
  27. /* CAN1 init function */
  28. void MX_CAN1_Init(void)
  29. {
  30. /* USER CODE BEGIN CAN1_Init 0 */
  31. /* USER CODE END CAN1_Init 0 */
  32. /* USER CODE BEGIN CAN1_Init 1 */
  33. /* USER CODE END CAN1_Init 1 */
  34. hcan1.Instance = CAN1;
  35. hcan1.Init.Prescaler = 12;
  36. hcan1.Init.Mode = CAN_MODE_NORMAL;
  37. hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  38. hcan1.Init.TimeSeg1 = CAN_BS1_4TQ;
  39. hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
  40. hcan1.Init.TimeTriggeredMode = DISABLE;
  41. hcan1.Init.AutoBusOff = DISABLE;
  42. hcan1.Init.AutoWakeUp = DISABLE;
  43. hcan1.Init.AutoRetransmission = DISABLE;
  44. hcan1.Init.ReceiveFifoLocked = DISABLE;
  45. hcan1.Init.TransmitFifoPriority = DISABLE;
  46. if (HAL_CAN_Init(&hcan1) != HAL_OK)
  47. {
  48. Error_Handler();
  49. }
  50. /* USER CODE BEGIN CAN1_Init 2 */
  51. /* USER CODE END CAN1_Init 2 */
  52. }
  53. /* CAN2 init function */
  54. void MX_CAN2_Init(void)
  55. {
  56. /* USER CODE BEGIN CAN2_Init 0 */
  57. /* USER CODE END CAN2_Init 0 */
  58. /* USER CODE BEGIN CAN2_Init 1 */
  59. /* USER CODE END CAN2_Init 1 */
  60. hcan2.Instance = CAN2;
  61. hcan2.Init.Prescaler = 12;
  62. hcan2.Init.Mode = CAN_MODE_NORMAL;
  63. hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
  64. hcan2.Init.TimeSeg1 = CAN_BS1_4TQ;
  65. hcan2.Init.TimeSeg2 = CAN_BS2_2TQ;
  66. hcan2.Init.TimeTriggeredMode = DISABLE;
  67. hcan2.Init.AutoBusOff = DISABLE;
  68. hcan2.Init.AutoWakeUp = DISABLE;
  69. hcan2.Init.AutoRetransmission = DISABLE;
  70. hcan2.Init.ReceiveFifoLocked = DISABLE;
  71. hcan2.Init.TransmitFifoPriority = DISABLE;
  72. if (HAL_CAN_Init(&hcan2) != HAL_OK)
  73. {
  74. Error_Handler();
  75. }
  76. /* USER CODE BEGIN CAN2_Init 2 */
  77. /* USER CODE END CAN2_Init 2 */
  78. }
  79. static uint32_t HAL_RCC_CAN1_CLK_ENABLED=0;
  80. void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
  81. {
  82. GPIO_InitTypeDef GPIO_InitStruct = {0};
  83. if(canHandle->Instance==CAN1)
  84. {
  85. /* USER CODE BEGIN CAN1_MspInit 0 */
  86. /* USER CODE END CAN1_MspInit 0 */
  87. /* CAN1 clock enable */
  88. HAL_RCC_CAN1_CLK_ENABLED++;
  89. if(HAL_RCC_CAN1_CLK_ENABLED==1){
  90. __HAL_RCC_CAN1_CLK_ENABLE();
  91. }
  92. __HAL_RCC_GPIOA_CLK_ENABLE();
  93. /**CAN1 GPIO Configuration
  94. PA11 ------> CAN1_RX
  95. PA12 ------> CAN1_TX
  96. */
  97. GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
  98. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  99. GPIO_InitStruct.Pull = GPIO_NOPULL;
  100. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  101. GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
  102. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  103. /* CAN1 interrupt Init */
  104. HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 5, 0);
  105. HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
  106. /* USER CODE BEGIN CAN1_MspInit 1 */
  107. /* USER CODE END CAN1_MspInit 1 */
  108. }
  109. else if(canHandle->Instance==CAN2)
  110. {
  111. /* USER CODE BEGIN CAN2_MspInit 0 */
  112. /* USER CODE END CAN2_MspInit 0 */
  113. /* CAN2 clock enable */
  114. __HAL_RCC_CAN2_CLK_ENABLE();
  115. HAL_RCC_CAN1_CLK_ENABLED++;
  116. if(HAL_RCC_CAN1_CLK_ENABLED==1){
  117. __HAL_RCC_CAN1_CLK_ENABLE();
  118. }
  119. __HAL_RCC_GPIOB_CLK_ENABLE();
  120. /**CAN2 GPIO Configuration
  121. PB12 ------> CAN2_RX
  122. PB13 ------> CAN2_TX
  123. */
  124. GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
  125. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  126. GPIO_InitStruct.Pull = GPIO_NOPULL;
  127. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  128. GPIO_InitStruct.Alternate = GPIO_AF9_CAN2;
  129. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  130. /* CAN2 interrupt Init */
  131. HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 5, 0);
  132. HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn);
  133. /* USER CODE BEGIN CAN2_MspInit 1 */
  134. /* USER CODE END CAN2_MspInit 1 */
  135. }
  136. }
  137. void HAL_CAN_MspDeInit(CAN_HandleTypeDef* canHandle)
  138. {
  139. if(canHandle->Instance==CAN1)
  140. {
  141. /* USER CODE BEGIN CAN1_MspDeInit 0 */
  142. /* USER CODE END CAN1_MspDeInit 0 */
  143. /* Peripheral clock disable */
  144. HAL_RCC_CAN1_CLK_ENABLED--;
  145. if(HAL_RCC_CAN1_CLK_ENABLED==0){
  146. __HAL_RCC_CAN1_CLK_DISABLE();
  147. }
  148. /**CAN1 GPIO Configuration
  149. PA11 ------> CAN1_RX
  150. PA12 ------> CAN1_TX
  151. */
  152. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);
  153. /* CAN1 interrupt Deinit */
  154. HAL_NVIC_DisableIRQ(CAN1_RX0_IRQn);
  155. /* USER CODE BEGIN CAN1_MspDeInit 1 */
  156. /* USER CODE END CAN1_MspDeInit 1 */
  157. }
  158. else if(canHandle->Instance==CAN2)
  159. {
  160. /* USER CODE BEGIN CAN2_MspDeInit 0 */
  161. /* USER CODE END CAN2_MspDeInit 0 */
  162. /* Peripheral clock disable */
  163. __HAL_RCC_CAN2_CLK_DISABLE();
  164. HAL_RCC_CAN1_CLK_ENABLED--;
  165. if(HAL_RCC_CAN1_CLK_ENABLED==0){
  166. __HAL_RCC_CAN1_CLK_DISABLE();
  167. }
  168. /**CAN2 GPIO Configuration
  169. PB12 ------> CAN2_RX
  170. PB13 ------> CAN2_TX
  171. */
  172. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13);
  173. /* CAN2 interrupt Deinit */
  174. HAL_NVIC_DisableIRQ(CAN2_RX0_IRQn);
  175. /* USER CODE BEGIN CAN2_MspDeInit 1 */
  176. /* USER CODE END CAN2_MspDeInit 1 */
  177. }
  178. }
  179. /* USER CODE BEGIN 1 */
  180. /*
  181. * 函数名 :CAN_ConfigFilter
  182. * 描述 : can 过滤器 配置
  183. * 根据CAN 数量 及配置 改写下方配置函数;
  184. *
  185. */
  186. void CAN_ConfigFilter(void)
  187. {
  188. CAN_FilterTypeDef sFilterConfig;
  189. sFilterConfig.FilterActivation = CAN_FILTER_ENABLE; //筛选器使能
  190. sFilterConfig.FilterBank = 0; //筛选器0
  191. sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  192. sFilterConfig.FilterIdHigh = 0x0000;
  193. sFilterConfig.FilterIdLow = 0x0000;
  194. sFilterConfig.FilterMaskIdHigh = 0x0000;
  195. sFilterConfig.FilterMaskIdLow = 0x0000;
  196. sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//掩码模式
  197. sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//32位
  198. sFilterConfig.SlaveStartFilterBank =14;
  199. if(HAL_CAN_ConfigFilter(&hcan1,&sFilterConfig)!=HAL_OK)
  200. {
  201. Error_Handler();
  202. }
  203. if(HAL_CAN_Start(&hcan1)!=HAL_OK)
  204. {
  205. Error_Handler();
  206. }
  207. if(HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//激活CAN_IT_RX_FIFO0_MSG_PENDING中断
  208. {
  209. Error_Handler();
  210. }
  211. //sFilterConfig.FilterFIFOAssignment = CAN_FilterFIFO1;
  212. sFilterConfig.FilterBank = 14;
  213. if(HAL_CAN_ConfigFilter(&hcan2,&sFilterConfig)!=HAL_OK)
  214. {
  215. Error_Handler();
  216. }
  217. if(HAL_CAN_Start(&hcan2)!=HAL_OK)
  218. {
  219. Error_Handler();
  220. }
  221. if(HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  222. {
  223. Error_Handler();
  224. }
  225. }
  226. void MX_CAN_Init(uint8_t can1_baud,uint8_t can2_baud)
  227. {
  228. static uint32_t CAN_BAUD[2][3]={0};
  229. if(can1_baud==1)
  230. {
  231. CAN_BAUD[0][0]=12;
  232. CAN_BAUD[0][1]=CAN_BS1_7TQ;
  233. CAN_BAUD[0][2]=CAN_BS2_6TQ;
  234. }else if(can1_baud==2)
  235. {
  236. CAN_BAUD[0][0]=12;
  237. CAN_BAUD[0][1]=CAN_BS1_4TQ;
  238. CAN_BAUD[0][2]=CAN_BS2_2TQ;
  239. }else if(can1_baud==3)
  240. {
  241. CAN_BAUD[0][0]=3;
  242. CAN_BAUD[0][1]=CAN_BS1_9TQ;
  243. CAN_BAUD[0][2]=CAN_BS2_4TQ;
  244. }else{
  245. CAN_BAUD[0][0]=12;
  246. CAN_BAUD[0][1]=CAN_BS1_7TQ;
  247. CAN_BAUD[0][2]=CAN_BS2_6TQ;
  248. }
  249. hcan1.Instance = CAN1;// 配置can1
  250. hcan1.Init.Prescaler = CAN_BAUD[0][0];//CAN_BAUD[0][0]; 12//预分频系数
  251. hcan1.Init.Mode = CAN_MODE_NORMAL;// 正常CAN模式
  252. hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;// 重同步跳跃宽度
  253. hcan1.Init.TimeSeg1 =CAN_BAUD[0][1];// CAN_BAUD[0][1];// TimeSeg1
  254. hcan1.Init.TimeSeg2 =CAN_BAUD[0][2];// CAN_BAUD[0][2];// TimeSeg2
  255. hcan1.Init.TimeTriggeredMode = DISABLE;// 非时间触发通信模式
  256. hcan1.Init.AutoBusOff = DISABLE; // 软件自动离线管理
  257. hcan1.Init.AutoWakeUp = DISABLE; // 睡眠模式通过软件唤醒(清除can—>MCR的sleep位)
  258. hcan1.Init.AutoRetransmission = DISABLE;//禁止报文自动重传
  259. hcan1.Init.ReceiveFifoLocked = DISABLE;// fifo报文不锁定 新的覆盖旧的
  260. hcan1.Init.TransmitFifoPriority = DISABLE;//优先级由报文标识符决定
  261. if (HAL_CAN_Init(&hcan1) != HAL_OK)
  262. {
  263. //Error_Handler();
  264. Error_Handler();
  265. }
  266. if(can2_baud==1)
  267. {
  268. CAN_BAUD[1][0]=12;
  269. CAN_BAUD[1][1]=CAN_BS1_7TQ;
  270. CAN_BAUD[1][2]=CAN_BS2_6TQ;
  271. }else if(can2_baud==2)
  272. {
  273. CAN_BAUD[1][0]=12;
  274. CAN_BAUD[1][1]=CAN_BS1_4TQ;
  275. CAN_BAUD[1][2]=CAN_BS2_2TQ;
  276. }else if(can2_baud==3)
  277. {
  278. CAN_BAUD[1][0]=3;
  279. CAN_BAUD[1][1]=CAN_BS1_9TQ;
  280. CAN_BAUD[1][2]=CAN_BS2_4TQ;
  281. }else{
  282. CAN_BAUD[1][0]=12;
  283. CAN_BAUD[1][1]=CAN_BS1_7TQ;
  284. CAN_BAUD[1][2]=CAN_BS2_6TQ;
  285. }
  286. hcan2.Instance = CAN2;
  287. hcan2.Init.Prescaler = CAN_BAUD[1][0];
  288. hcan2.Init.Mode = CAN_MODE_NORMAL;
  289. hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
  290. hcan2.Init.TimeSeg1 = CAN_BAUD[1][1];
  291. hcan2.Init.TimeSeg2 = CAN_BAUD[1][2];
  292. hcan2.Init.TimeTriggeredMode = DISABLE;
  293. hcan2.Init.AutoBusOff = DISABLE;
  294. hcan2.Init.AutoWakeUp = DISABLE;
  295. hcan2.Init.AutoRetransmission = DISABLE;
  296. hcan2.Init.ReceiveFifoLocked = DISABLE;
  297. hcan2.Init.TransmitFifoPriority = DISABLE;
  298. if (HAL_CAN_Init(&hcan2) != HAL_OK)
  299. {
  300. Error_Handler();
  301. }
  302. CAN_ConfigFilter();
  303. }
  304. /*
  305. * 函数名 :CAN_send
  306. * 描述 : CAN 发送重封装 IDE = 0 标准帧 = 1 扩展帧
  307. * 根据CAN 具体配置 改写下方配置函数以及调用;
  308. *
  309. */
  310. uint8_t can_send_msg(CAN_HandleTypeDef *hcan,uint8_t IDE,uint32_t id, uint8_t *msg, uint8_t len )
  311. {
  312. CAN_TxHeaderTypeDef g_canx_txheader;
  313. uint32_t ID_IDE=0;
  314. uint32_t TxMailbox;// = CAN_TX_MAILBOX0;
  315. if(CAN1->TSR&(1<<26))TxMailbox=CAN_TX_MAILBOX0; //邮箱0为空
  316. else if(CAN1->TSR&(1<<27))TxMailbox=CAN_TX_MAILBOX1; //邮箱1为空
  317. else if(CAN1->TSR&(1<<28))TxMailbox=CAN_TX_MAILBOX2; //邮箱2为空
  318. else return 0XFF; //无空邮箱,无法发送
  319. CAN1->sTxMailBox[TxMailbox].TIR=0; //清除之前的设置
  320. if ( IDE == 0)
  321. {
  322. ID_IDE = CAN_ID_STD;
  323. }else if(IDE==1)
  324. {
  325. ID_IDE = CAN_ID_EXT;
  326. }
  327. g_canx_txheader.StdId = id; /* 标准标识符 */
  328. g_canx_txheader.ExtId = id; /* 扩展标识符(29位) */
  329. g_canx_txheader.IDE = ID_IDE; /* 使用标准帧 */
  330. g_canx_txheader.RTR = CAN_RTR_DATA; /* 数据帧 */
  331. g_canx_txheader.DLC = len;
  332. // HAL_CAN_Start(&hcan);
  333. if (HAL_CAN_AddTxMessage(hcan, &g_canx_txheader, msg, &TxMailbox) != HAL_OK) /* 发送消息 */
  334. {
  335. LOG("CAN send test data fail!\n");
  336. return HAL_ERROR;
  337. }
  338. while (HAL_CAN_GetTxMailboxesFreeLevel(hcan) != 3); /* 等待发送完成,所有邮箱为空 */
  339. return HAL_OK;
  340. }
  341. /* USER CODE END 1 */