diff --git a/AutonomousDistroBoard/AutonomousDistroBoard.ioc b/AutonomousDistroBoard/AutonomousDistroBoard.ioc index 3e19a10..ab124c9 100644 --- a/AutonomousDistroBoard/AutonomousDistroBoard.ioc +++ b/AutonomousDistroBoard/AutonomousDistroBoard.ioc @@ -2,6 +2,14 @@ CAD.formats= CAD.pinconfig= CAD.provider= +CAN1.BS1=CAN_BS1_12TQ +CAN1.BS2=CAN_BS2_2TQ +CAN1.CalculateBaudRate=499999 +CAN1.CalculateTimeBit=2000 +CAN1.CalculateTimeQuantum=133.33333333333334 +CAN1.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,Mode,Prescaler,BS1,BS2 +CAN1.Mode=CAN_MODE_SILENT +CAN1.Prescaler=4 CAN2.BS1=CAN_BS1_12TQ CAN2.BS2=CAN_BS2_2TQ CAN2.CalculateBaudRate=499999 @@ -26,17 +34,18 @@ GPIO.groupedBy=Group By Peripherals KeepUserPlacement=false Mcu.CPN=STM32F407VGT6 Mcu.Family=STM32F4 -Mcu.IP0=CAN2 -Mcu.IP1=DMA -Mcu.IP2=NVIC -Mcu.IP3=RCC -Mcu.IP4=SYS -Mcu.IP5=TIM1 -Mcu.IP6=TIM11 -Mcu.IP7=UART5 -Mcu.IP8=USART3 -Mcu.IP9=USB_OTG_FS -Mcu.IPNb=10 +Mcu.IP0=CAN1 +Mcu.IP1=CAN2 +Mcu.IP10=USB_OTG_FS +Mcu.IP2=DMA +Mcu.IP3=NVIC +Mcu.IP4=RCC +Mcu.IP5=SYS +Mcu.IP6=TIM1 +Mcu.IP7=TIM11 +Mcu.IP8=UART5 +Mcu.IP9=USART3 +Mcu.IPNb=11 Mcu.Name=STM32F407V(E-G)Tx Mcu.Package=LQFP100 Mcu.Pin0=PE5 @@ -44,14 +53,16 @@ Mcu.Pin1=PE6 Mcu.Pin10=PA13 Mcu.Pin11=PA14 Mcu.Pin12=PC12 -Mcu.Pin13=PD2 -Mcu.Pin14=PB5 -Mcu.Pin15=PB6 -Mcu.Pin16=PB7 -Mcu.Pin17=PB9 -Mcu.Pin18=VP_SYS_VS_Systick -Mcu.Pin19=VP_TIM11_VS_ClockSourceINT +Mcu.Pin13=PD0 +Mcu.Pin14=PD1 +Mcu.Pin15=PD2 +Mcu.Pin16=PB5 +Mcu.Pin17=PB6 +Mcu.Pin18=PB7 +Mcu.Pin19=PB9 Mcu.Pin2=PH0-OSC_IN +Mcu.Pin20=VP_SYS_VS_Systick +Mcu.Pin21=VP_TIM11_VS_ClockSourceINT Mcu.Pin3=PH1-OSC_OUT Mcu.Pin4=PE8 Mcu.Pin5=PE9 @@ -59,7 +70,7 @@ Mcu.Pin6=PB10 Mcu.Pin7=PB11 Mcu.Pin8=PA11 Mcu.Pin9=PA12 -Mcu.PinsNb=20 +Mcu.PinsNb=22 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F407VGTx @@ -109,6 +120,10 @@ PB9.Signal=S_TIM11_CH1 PC12.Locked=true PC12.Mode=Asynchronous PC12.Signal=UART5_TX +PD0.Mode=CAN_Activate +PD0.Signal=CAN1_RX +PD1.Mode=CAN_Activate +PD1.Signal=CAN1_TX PD2.Locked=true PD2.Mode=Asynchronous PD2.Signal=UART5_RX @@ -161,7 +176,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=STM32CubeIDE ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_CAN2_Init-CAN2-false-HAL-true,5-MX_UART5_Init-UART5-false-HAL-true,6-MX_TIM1_Init-TIM1-false-HAL-true,7-MX_TIM11_Init-TIM11-false-HAL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_CAN2_Init-CAN2-false-HAL-true,5-MX_UART5_Init-UART5-false-HAL-true,6-MX_TIM1_Init-TIM1-false-HAL-true,7-MX_TIM11_Init-TIM11-false-HAL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,10-MX_CAN1_Init-CAN1-false-HAL-true RCC.48MHZClocksFreq_Value=48000000 RCC.AHBFreq_Value=120000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 diff --git a/AutonomousDistroBoard/Core/Src/main.c b/AutonomousDistroBoard/Core/Src/main.c index c5d1fd1..ac4183f 100644 --- a/AutonomousDistroBoard/Core/Src/main.c +++ b/AutonomousDistroBoard/Core/Src/main.c @@ -18,7 +18,6 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" -#include /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ @@ -41,6 +40,7 @@ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ +CAN_HandleTypeDef hcan1; CAN_HandleTypeDef hcan2; TIM_HandleTypeDef htim1; @@ -66,6 +66,7 @@ static void MX_TIM1_Init(void); static void MX_TIM11_Init(void); static void MX_USART3_UART_Init(void); static void MX_USB_OTG_FS_PCD_Init(void); +static void MX_CAN1_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -110,6 +111,7 @@ int main(void) MX_TIM11_Init(); MX_USART3_UART_Init(); MX_USB_OTG_FS_PCD_Init(); + MX_CAN1_Init(); /* USER CODE BEGIN 2 */ // Initialize logic state logic_init(&g_logic_state); @@ -136,6 +138,10 @@ int main(void) Error_Handler(); } // Start CAN peripheral + if (HAL_CAN_Start(&hcan1) != HAL_OK) { + // Must start CAN1 even though we only use CAN2 because CAN2 is a slave to CAN1 on F4 + Error_Handler(); + } if (HAL_CAN_Start(&hcan2) != HAL_OK) { Error_Handler(); } @@ -209,6 +215,43 @@ void SystemClock_Config(void) } } +/** + * @brief CAN1 Initialization Function + * @param None + * @retval None + */ +static void MX_CAN1_Init(void) +{ + + /* USER CODE BEGIN CAN1_Init 0 */ + + /* USER CODE END CAN1_Init 0 */ + + /* USER CODE BEGIN CAN1_Init 1 */ + + /* USER CODE END CAN1_Init 1 */ + hcan1.Instance = CAN1; + hcan1.Init.Prescaler = 4; + hcan1.Init.Mode = CAN_MODE_SILENT; + hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; + hcan1.Init.TimeSeg1 = CAN_BS1_12TQ; + hcan1.Init.TimeSeg2 = CAN_BS2_2TQ; + hcan1.Init.TimeTriggeredMode = DISABLE; + hcan1.Init.AutoBusOff = DISABLE; + hcan1.Init.AutoWakeUp = DISABLE; + hcan1.Init.AutoRetransmission = DISABLE; + hcan1.Init.ReceiveFifoLocked = DISABLE; + hcan1.Init.TransmitFifoPriority = DISABLE; + if (HAL_CAN_Init(&hcan1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CAN1_Init 2 */ + + /* USER CODE END CAN1_Init 2 */ + +} + /** * @brief CAN2 Initialization Function * @param None diff --git a/AutonomousDistroBoard/Core/Src/stm32f4xx_hal_msp.c b/AutonomousDistroBoard/Core/Src/stm32f4xx_hal_msp.c index 1c32176..112d52d 100644 --- a/AutonomousDistroBoard/Core/Src/stm32f4xx_hal_msp.c +++ b/AutonomousDistroBoard/Core/Src/stm32f4xx_hal_msp.c @@ -79,6 +79,8 @@ void HAL_MspInit(void) /* USER CODE END MspInit 1 */ } +static uint32_t HAL_RCC_CAN1_CLK_ENABLED=0; + /** * @brief CAN MSP Initialization * This function configures the hardware resources used in this example @@ -88,14 +90,44 @@ void HAL_MspInit(void) void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(hcan->Instance==CAN2) + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspInit 0 */ + + /* USER CODE END CAN1_MspInit 0 */ + /* Peripheral clock enable */ + HAL_RCC_CAN1_CLK_ENABLED++; + if(HAL_RCC_CAN1_CLK_ENABLED==1){ + __HAL_RCC_CAN1_CLK_ENABLE(); + } + + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**CAN1 GPIO Configuration + PD0 ------> CAN1_RX + PD1 ------> CAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN CAN1_MspInit 1 */ + + /* USER CODE END CAN1_MspInit 1 */ + } + else if(hcan->Instance==CAN2) { /* USER CODE BEGIN CAN2_MspInit 0 */ /* USER CODE END CAN2_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_CAN2_CLK_ENABLE(); - __HAL_RCC_CAN1_CLK_ENABLE(); + HAL_RCC_CAN1_CLK_ENABLED++; + if(HAL_RCC_CAN1_CLK_ENABLED==1){ + __HAL_RCC_CAN1_CLK_ENABLE(); + } __HAL_RCC_GPIOB_CLK_ENABLE(); /**CAN2 GPIO Configuration @@ -127,14 +159,38 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) */ void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) { - if(hcan->Instance==CAN2) + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspDeInit 0 */ + + /* USER CODE END CAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_CAN1_CLK_ENABLED--; + if(HAL_RCC_CAN1_CLK_ENABLED==0){ + __HAL_RCC_CAN1_CLK_DISABLE(); + } + + /**CAN1 GPIO Configuration + PD0 ------> CAN1_RX + PD1 ------> CAN1_TX + */ + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_0|GPIO_PIN_1); + + /* USER CODE BEGIN CAN1_MspDeInit 1 */ + + /* USER CODE END CAN1_MspDeInit 1 */ + } + else if(hcan->Instance==CAN2) { /* USER CODE BEGIN CAN2_MspDeInit 0 */ /* USER CODE END CAN2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_CAN2_CLK_DISABLE(); - __HAL_RCC_CAN1_CLK_DISABLE(); + HAL_RCC_CAN1_CLK_ENABLED--; + if(HAL_RCC_CAN1_CLK_ENABLED==0){ + __HAL_RCC_CAN1_CLK_DISABLE(); + } /**CAN2 GPIO Configuration PB5 ------> CAN2_RX