fdcan.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file fdcan.c
  5. * @brief This file provides code for the configuration
  6. * of the FDCAN instances.
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * Copyright (c) 2026 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 "fdcan.h"
  22. /* USER CODE BEGIN 0 */
  23. /* USER CODE END 0 */
  24. FDCAN_HandleTypeDef hfdcan1;
  25. FDCAN_HandleTypeDef hfdcan2;
  26. /* FDCAN1 init function */
  27. void MX_FDCAN1_Init(void)
  28. {
  29. /* USER CODE BEGIN FDCAN1_Init 0 */
  30. /* USER CODE END FDCAN1_Init 0 */
  31. /* USER CODE BEGIN FDCAN1_Init 1 */
  32. /* USER CODE END FDCAN1_Init 1 */
  33. hfdcan1.Instance = FDCAN1;
  34. hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
  35. hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  36. hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  37. hfdcan1.Init.AutoRetransmission = DISABLE;
  38. hfdcan1.Init.TransmitPause = DISABLE;
  39. hfdcan1.Init.ProtocolException = ENABLE;
  40. hfdcan1.Init.NominalPrescaler = 1;
  41. hfdcan1.Init.NominalSyncJumpWidth = 1;
  42. hfdcan1.Init.NominalTimeSeg1 = 21;
  43. hfdcan1.Init.NominalTimeSeg2 = 3;
  44. hfdcan1.Init.DataPrescaler = 1;
  45. hfdcan1.Init.DataSyncJumpWidth = 1;
  46. hfdcan1.Init.DataTimeSeg1 = 21;
  47. hfdcan1.Init.DataTimeSeg2 = 3;
  48. hfdcan1.Init.StdFiltersNbr = 1;
  49. hfdcan1.Init.ExtFiltersNbr = 1;
  50. hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  51. if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  52. {
  53. Error_Handler();
  54. }
  55. /* USER CODE BEGIN FDCAN1_Init 2 */
  56. /* USER CODE END FDCAN1_Init 2 */
  57. }
  58. /* FDCAN2 init function */
  59. void MX_FDCAN2_Init(void)
  60. {
  61. /* USER CODE BEGIN FDCAN2_Init 0 */
  62. /* USER CODE END FDCAN2_Init 0 */
  63. /* USER CODE BEGIN FDCAN2_Init 1 */
  64. /* USER CODE END FDCAN2_Init 1 */
  65. hfdcan2.Instance = FDCAN2;
  66. hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1;
  67. hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  68. hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
  69. hfdcan2.Init.AutoRetransmission = DISABLE;
  70. hfdcan2.Init.TransmitPause = DISABLE;
  71. hfdcan2.Init.ProtocolException = ENABLE;
  72. hfdcan2.Init.NominalPrescaler = 1;
  73. hfdcan2.Init.NominalSyncJumpWidth = 1;
  74. hfdcan2.Init.NominalTimeSeg1 = 21;
  75. hfdcan2.Init.NominalTimeSeg2 = 3;
  76. hfdcan2.Init.DataPrescaler = 1;
  77. hfdcan2.Init.DataSyncJumpWidth = 1;
  78. hfdcan2.Init.DataTimeSeg1 = 21;
  79. hfdcan2.Init.DataTimeSeg2 = 3;
  80. hfdcan2.Init.StdFiltersNbr = 1;
  81. hfdcan2.Init.ExtFiltersNbr = 1;
  82. hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  83. if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
  84. {
  85. Error_Handler();
  86. }
  87. /* USER CODE BEGIN FDCAN2_Init 2 */
  88. /* USER CODE END FDCAN2_Init 2 */
  89. }
  90. static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0;
  91. void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
  92. {
  93. GPIO_InitTypeDef GPIO_InitStruct = {0};
  94. RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  95. if(fdcanHandle->Instance==FDCAN1)
  96. {
  97. /* USER CODE BEGIN FDCAN1_MspInit 0 */
  98. /* USER CODE END FDCAN1_MspInit 0 */
  99. /** Initializes the peripherals clock
  100. */
  101. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
  102. PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_HSE;
  103. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  104. {
  105. Error_Handler();
  106. }
  107. /* FDCAN1 clock enable */
  108. HAL_RCC_FDCAN_CLK_ENABLED++;
  109. if(HAL_RCC_FDCAN_CLK_ENABLED==1){
  110. __HAL_RCC_FDCAN_CLK_ENABLE();
  111. }
  112. __HAL_RCC_GPIOA_CLK_ENABLE();
  113. /**FDCAN1 GPIO Configuration
  114. PA11 ------> FDCAN1_RX
  115. PA12 ------> FDCAN1_TX
  116. */
  117. GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
  118. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  119. GPIO_InitStruct.Pull = GPIO_NOPULL;
  120. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  121. GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
  122. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  123. /* FDCAN1 interrupt Init */
  124. HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);
  125. HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
  126. /* USER CODE BEGIN FDCAN1_MspInit 1 */
  127. /* USER CODE END FDCAN1_MspInit 1 */
  128. }
  129. else if(fdcanHandle->Instance==FDCAN2)
  130. {
  131. /* USER CODE BEGIN FDCAN2_MspInit 0 */
  132. /* USER CODE END FDCAN2_MspInit 0 */
  133. /** Initializes the peripherals clock
  134. */
  135. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
  136. PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_HSE;
  137. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  138. {
  139. Error_Handler();
  140. }
  141. /* FDCAN2 clock enable */
  142. HAL_RCC_FDCAN_CLK_ENABLED++;
  143. if(HAL_RCC_FDCAN_CLK_ENABLED==1){
  144. __HAL_RCC_FDCAN_CLK_ENABLE();
  145. }
  146. __HAL_RCC_GPIOB_CLK_ENABLE();
  147. /**FDCAN2 GPIO Configuration
  148. PB12 ------> FDCAN2_RX
  149. PB13 ------> FDCAN2_TX
  150. */
  151. GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
  152. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  153. GPIO_InitStruct.Pull = GPIO_NOPULL;
  154. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  155. GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2;
  156. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  157. /* FDCAN2 interrupt Init */
  158. HAL_NVIC_SetPriority(FDCAN2_IT0_IRQn, 0, 0);
  159. HAL_NVIC_EnableIRQ(FDCAN2_IT0_IRQn);
  160. /* USER CODE BEGIN FDCAN2_MspInit 1 */
  161. /* USER CODE END FDCAN2_MspInit 1 */
  162. }
  163. }
  164. void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
  165. {
  166. if(fdcanHandle->Instance==FDCAN1)
  167. {
  168. /* USER CODE BEGIN FDCAN1_MspDeInit 0 */
  169. /* USER CODE END FDCAN1_MspDeInit 0 */
  170. /* Peripheral clock disable */
  171. HAL_RCC_FDCAN_CLK_ENABLED--;
  172. if(HAL_RCC_FDCAN_CLK_ENABLED==0){
  173. __HAL_RCC_FDCAN_CLK_DISABLE();
  174. }
  175. /**FDCAN1 GPIO Configuration
  176. PA11 ------> FDCAN1_RX
  177. PA12 ------> FDCAN1_TX
  178. */
  179. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);
  180. /* FDCAN1 interrupt Deinit */
  181. HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
  182. /* USER CODE BEGIN FDCAN1_MspDeInit 1 */
  183. /* USER CODE END FDCAN1_MspDeInit 1 */
  184. }
  185. else if(fdcanHandle->Instance==FDCAN2)
  186. {
  187. /* USER CODE BEGIN FDCAN2_MspDeInit 0 */
  188. /* USER CODE END FDCAN2_MspDeInit 0 */
  189. /* Peripheral clock disable */
  190. HAL_RCC_FDCAN_CLK_ENABLED--;
  191. if(HAL_RCC_FDCAN_CLK_ENABLED==0){
  192. __HAL_RCC_FDCAN_CLK_DISABLE();
  193. }
  194. /**FDCAN2 GPIO Configuration
  195. PB12 ------> FDCAN2_RX
  196. PB13 ------> FDCAN2_TX
  197. */
  198. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13);
  199. /* FDCAN2 interrupt Deinit */
  200. HAL_NVIC_DisableIRQ(FDCAN2_IT0_IRQn);
  201. /* USER CODE BEGIN FDCAN2_MspDeInit 1 */
  202. /* USER CODE END FDCAN2_MspDeInit 1 */
  203. }
  204. }
  205. /* USER CODE BEGIN 1 */
  206. void MYADD_FDCAN1_InitFilter(void)
  207. {
  208. FDCAN_FilterTypeDef sFilterConfig = {0};
  209. //标准帧不设置过滤
  210. sFilterConfig.IdType = FDCAN_STANDARD_ID;
  211. sFilterConfig.FilterIndex = 0;
  212. sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  213. sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  214. sFilterConfig.FilterID1 = 0;
  215. sFilterConfig.FilterID2 = 0;
  216. if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  217. {
  218. Error_Handler();
  219. }
  220. //拓展帧不设置过滤
  221. sFilterConfig.IdType = FDCAN_EXTENDED_ID;
  222. sFilterConfig.FilterIndex = 0;
  223. sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  224. sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  225. sFilterConfig.FilterID1 = 0;
  226. sFilterConfig.FilterID2 = 0;
  227. if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  228. {
  229. Error_Handler();
  230. }
  231. HAL_FDCAN_ConfigGlobalFilter(&hfdcan1,FDCAN_REJECT,FDCAN_REJECT, DISABLE, DISABLE);
  232. HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
  233. HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_BUS_OFF, 0);
  234. HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_MESSAGE_LOST, 0);
  235. HAL_FDCAN_Start(&hfdcan1);
  236. }
  237. void MYADD_FDCAN2_InitFilter(void)
  238. {
  239. FDCAN_FilterTypeDef sFilterConfig = {0};
  240. //标准帧不设置过滤
  241. sFilterConfig.IdType = FDCAN_STANDARD_ID;
  242. sFilterConfig.FilterIndex = 0;
  243. sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  244. sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
  245. sFilterConfig.FilterID1 = 0;
  246. sFilterConfig.FilterID2 = 0;
  247. if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
  248. {
  249. Error_Handler();
  250. }
  251. //拓展帧不设置过滤
  252. sFilterConfig.IdType = FDCAN_EXTENDED_ID;
  253. sFilterConfig.FilterIndex = 0;
  254. sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  255. sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
  256. sFilterConfig.FilterID1 = 0;
  257. sFilterConfig.FilterID2 = 0;
  258. if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
  259. {
  260. Error_Handler();
  261. }
  262. HAL_FDCAN_ConfigGlobalFilter(&hfdcan2,FDCAN_REJECT,FDCAN_REJECT, DISABLE, DISABLE);
  263. HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
  264. HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_BUS_OFF, 0);
  265. HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO1_MESSAGE_LOST, 0);
  266. HAL_FDCAN_Start(&hfdcan2);
  267. }
  268. /* USER CODE END 1 */