| 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) 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 "fdcan.h"
|
|---|
| 22 |
|
|---|
| 23 | /* USER CODE BEGIN 0 */
|
|---|
| 24 |
|
|---|
| 25 | /* USER CODE END 0 */
|
|---|
| 26 |
|
|---|
| 27 | FDCAN_HandleTypeDef hfdcan2;
|
|---|
| 28 | FDCAN_HandleTypeDef hfdcan3;
|
|---|
| 29 |
|
|---|
| 30 | /* FDCAN2 init function */
|
|---|
| 31 | void MX_FDCAN2_Init(void)
|
|---|
| 32 | {
|
|---|
| 33 |
|
|---|
| 34 | /* USER CODE BEGIN FDCAN2_Init 0 */
|
|---|
| 35 |
|
|---|
| 36 | /* USER CODE END FDCAN2_Init 0 */
|
|---|
| 37 |
|
|---|
| 38 | /* USER CODE BEGIN FDCAN2_Init 1 */
|
|---|
| 39 |
|
|---|
| 40 | /* USER CODE END FDCAN2_Init 1 */
|
|---|
| 41 | hfdcan2.Instance = FDCAN2;
|
|---|
| 42 | hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1;
|
|---|
| 43 | hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
|---|
| 44 | hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
|
|---|
| 45 | hfdcan2.Init.AutoRetransmission = DISABLE;
|
|---|
| 46 | hfdcan2.Init.TransmitPause = DISABLE;
|
|---|
| 47 | hfdcan2.Init.ProtocolException = DISABLE;
|
|---|
| 48 | hfdcan2.Init.NominalPrescaler = 16;
|
|---|
| 49 | hfdcan2.Init.NominalSyncJumpWidth = 1;
|
|---|
| 50 | hfdcan2.Init.NominalTimeSeg1 = 1;
|
|---|
| 51 | hfdcan2.Init.NominalTimeSeg2 = 1;
|
|---|
| 52 | hfdcan2.Init.DataPrescaler = 1;
|
|---|
| 53 | hfdcan2.Init.DataSyncJumpWidth = 1;
|
|---|
| 54 | hfdcan2.Init.DataTimeSeg1 = 1;
|
|---|
| 55 | hfdcan2.Init.DataTimeSeg2 = 1;
|
|---|
| 56 | hfdcan2.Init.StdFiltersNbr = 0;
|
|---|
| 57 | hfdcan2.Init.ExtFiltersNbr = 0;
|
|---|
| 58 | hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
|
|---|
| 59 | if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
|
|---|
| 60 | {
|
|---|
| 61 | Error_Handler();
|
|---|
| 62 | }
|
|---|
| 63 | /* USER CODE BEGIN FDCAN2_Init 2 */
|
|---|
| 64 |
|
|---|
| 65 | /* USER CODE END FDCAN2_Init 2 */
|
|---|
| 66 |
|
|---|
| 67 | }
|
|---|
| 68 | /* FDCAN3 init function */
|
|---|
| 69 | void MX_FDCAN3_Init(void)
|
|---|
| 70 | {
|
|---|
| 71 |
|
|---|
| 72 | /* USER CODE BEGIN FDCAN3_Init 0 */
|
|---|
| 73 |
|
|---|
| 74 | /* USER CODE END FDCAN3_Init 0 */
|
|---|
| 75 |
|
|---|
| 76 | /* USER CODE BEGIN FDCAN3_Init 1 */
|
|---|
| 77 |
|
|---|
| 78 | /* USER CODE END FDCAN3_Init 1 */
|
|---|
| 79 | hfdcan3.Instance = FDCAN3;
|
|---|
| 80 | hfdcan3.Init.ClockDivider = FDCAN_CLOCK_DIV1;
|
|---|
| 81 | hfdcan3.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
|---|
| 82 | hfdcan3.Init.Mode = FDCAN_MODE_NORMAL;
|
|---|
| 83 | hfdcan3.Init.AutoRetransmission = DISABLE;
|
|---|
| 84 | hfdcan3.Init.TransmitPause = DISABLE;
|
|---|
| 85 | hfdcan3.Init.ProtocolException = DISABLE;
|
|---|
| 86 | hfdcan3.Init.NominalPrescaler = 16;
|
|---|
| 87 | hfdcan3.Init.NominalSyncJumpWidth = 1;
|
|---|
| 88 | hfdcan3.Init.NominalTimeSeg1 = 1;
|
|---|
| 89 | hfdcan3.Init.NominalTimeSeg2 = 1;
|
|---|
| 90 | hfdcan3.Init.DataPrescaler = 1;
|
|---|
| 91 | hfdcan3.Init.DataSyncJumpWidth = 1;
|
|---|
| 92 | hfdcan3.Init.DataTimeSeg1 = 1;
|
|---|
| 93 | hfdcan3.Init.DataTimeSeg2 = 1;
|
|---|
| 94 | hfdcan3.Init.StdFiltersNbr = 0;
|
|---|
| 95 | hfdcan3.Init.ExtFiltersNbr = 0;
|
|---|
| 96 | hfdcan3.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
|
|---|
| 97 | if (HAL_FDCAN_Init(&hfdcan3) != HAL_OK)
|
|---|
| 98 | {
|
|---|
| 99 | Error_Handler();
|
|---|
| 100 | }
|
|---|
| 101 | /* USER CODE BEGIN FDCAN3_Init 2 */
|
|---|
| 102 |
|
|---|
| 103 | /* USER CODE END FDCAN3_Init 2 */
|
|---|
| 104 |
|
|---|
| 105 | }
|
|---|
| 106 |
|
|---|
| 107 | static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0;
|
|---|
| 108 |
|
|---|
| 109 | void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
|
|---|
| 110 | {
|
|---|
| 111 |
|
|---|
| 112 | GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|---|
| 113 | RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
|
|---|
| 114 | if(fdcanHandle->Instance==FDCAN2)
|
|---|
| 115 | {
|
|---|
| 116 | /* USER CODE BEGIN FDCAN2_MspInit 0 */
|
|---|
| 117 |
|
|---|
| 118 | /* USER CODE END FDCAN2_MspInit 0 */
|
|---|
| 119 |
|
|---|
| 120 | /** Initializes the peripherals clocks
|
|---|
| 121 | */
|
|---|
| 122 | PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
|
|---|
| 123 | PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PCLK1;
|
|---|
| 124 | if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
|
|---|
| 125 | {
|
|---|
| 126 | Error_Handler();
|
|---|
| 127 | }
|
|---|
| 128 |
|
|---|
| 129 | /* FDCAN2 clock enable */
|
|---|
| 130 | HAL_RCC_FDCAN_CLK_ENABLED++;
|
|---|
| 131 | if(HAL_RCC_FDCAN_CLK_ENABLED==1){
|
|---|
| 132 | __HAL_RCC_FDCAN_CLK_ENABLE();
|
|---|
| 133 | }
|
|---|
| 134 |
|
|---|
| 135 | __HAL_RCC_GPIOB_CLK_ENABLE();
|
|---|
| 136 | /**FDCAN2 GPIO Configuration
|
|---|
| 137 | PB5 ------> FDCAN2_RX
|
|---|
| 138 | PB6 ------> FDCAN2_TX
|
|---|
| 139 | */
|
|---|
| 140 | GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
|
|---|
| 141 | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|---|
| 142 | GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|---|
| 143 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|---|
| 144 | GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2;
|
|---|
| 145 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|---|
| 146 |
|
|---|
| 147 | /* USER CODE BEGIN FDCAN2_MspInit 1 */
|
|---|
| 148 |
|
|---|
| 149 | /* USER CODE END FDCAN2_MspInit 1 */
|
|---|
| 150 | }
|
|---|
| 151 | else if(fdcanHandle->Instance==FDCAN3)
|
|---|
| 152 | {
|
|---|
| 153 | /* USER CODE BEGIN FDCAN3_MspInit 0 */
|
|---|
| 154 |
|
|---|
| 155 | /* USER CODE END FDCAN3_MspInit 0 */
|
|---|
| 156 |
|
|---|
| 157 | /** Initializes the peripherals clocks
|
|---|
| 158 | */
|
|---|
| 159 | PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
|
|---|
| 160 | PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PCLK1;
|
|---|
| 161 | if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
|
|---|
| 162 | {
|
|---|
| 163 | Error_Handler();
|
|---|
| 164 | }
|
|---|
| 165 |
|
|---|
| 166 | /* FDCAN3 clock enable */
|
|---|
| 167 | HAL_RCC_FDCAN_CLK_ENABLED++;
|
|---|
| 168 | if(HAL_RCC_FDCAN_CLK_ENABLED==1){
|
|---|
| 169 | __HAL_RCC_FDCAN_CLK_ENABLE();
|
|---|
| 170 | }
|
|---|
| 171 |
|
|---|
| 172 | __HAL_RCC_GPIOB_CLK_ENABLE();
|
|---|
| 173 | /**FDCAN3 GPIO Configuration
|
|---|
| 174 | PB3 ------> FDCAN3_RX
|
|---|
| 175 | PB4 ------> FDCAN3_TX
|
|---|
| 176 | */
|
|---|
| 177 | GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
|
|---|
| 178 | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|---|
| 179 | GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|---|
| 180 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|---|
| 181 | GPIO_InitStruct.Alternate = GPIO_AF11_FDCAN3;
|
|---|
| 182 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|---|
| 183 |
|
|---|
| 184 | /* USER CODE BEGIN FDCAN3_MspInit 1 */
|
|---|
| 185 |
|
|---|
| 186 | /* USER CODE END FDCAN3_MspInit 1 */
|
|---|
| 187 | }
|
|---|
| 188 | }
|
|---|
| 189 |
|
|---|
| 190 | void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
|
|---|
| 191 | {
|
|---|
| 192 |
|
|---|
| 193 | if(fdcanHandle->Instance==FDCAN2)
|
|---|
| 194 | {
|
|---|
| 195 | /* USER CODE BEGIN FDCAN2_MspDeInit 0 */
|
|---|
| 196 |
|
|---|
| 197 | /* USER CODE END FDCAN2_MspDeInit 0 */
|
|---|
| 198 | /* Peripheral clock disable */
|
|---|
| 199 | HAL_RCC_FDCAN_CLK_ENABLED--;
|
|---|
| 200 | if(HAL_RCC_FDCAN_CLK_ENABLED==0){
|
|---|
| 201 | __HAL_RCC_FDCAN_CLK_DISABLE();
|
|---|
| 202 | }
|
|---|
| 203 |
|
|---|
| 204 | /**FDCAN2 GPIO Configuration
|
|---|
| 205 | PB5 ------> FDCAN2_RX
|
|---|
| 206 | PB6 ------> FDCAN2_TX
|
|---|
| 207 | */
|
|---|
| 208 | HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5|GPIO_PIN_6);
|
|---|
| 209 |
|
|---|
| 210 | /* USER CODE BEGIN FDCAN2_MspDeInit 1 */
|
|---|
| 211 |
|
|---|
| 212 | /* USER CODE END FDCAN2_MspDeInit 1 */
|
|---|
| 213 | }
|
|---|
| 214 | else if(fdcanHandle->Instance==FDCAN3)
|
|---|
| 215 | {
|
|---|
| 216 | /* USER CODE BEGIN FDCAN3_MspDeInit 0 */
|
|---|
| 217 |
|
|---|
| 218 | /* USER CODE END FDCAN3_MspDeInit 0 */
|
|---|
| 219 | /* Peripheral clock disable */
|
|---|
| 220 | HAL_RCC_FDCAN_CLK_ENABLED--;
|
|---|
| 221 | if(HAL_RCC_FDCAN_CLK_ENABLED==0){
|
|---|
| 222 | __HAL_RCC_FDCAN_CLK_DISABLE();
|
|---|
| 223 | }
|
|---|
| 224 |
|
|---|
| 225 | /**FDCAN3 GPIO Configuration
|
|---|
| 226 | PB3 ------> FDCAN3_RX
|
|---|
| 227 | PB4 ------> FDCAN3_TX
|
|---|
| 228 | */
|
|---|
| 229 | HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_4);
|
|---|
| 230 |
|
|---|
| 231 | /* USER CODE BEGIN FDCAN3_MspDeInit 1 */
|
|---|
| 232 |
|
|---|
| 233 | /* USER CODE END FDCAN3_MspDeInit 1 */
|
|---|
| 234 | }
|
|---|
| 235 | }
|
|---|
| 236 |
|
|---|
| 237 | /* USER CODE BEGIN 1 */
|
|---|
| 238 |
|
|---|
| 239 | /* USER CODE END 1 */
|
|---|