void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan->Instance==CAN1) { /* USER CODE BEGIN CAN1_MspInit 0 */ /* USER CODE END CAN1_MspInit 0 */ /* Peripheral clock enable */ CAN1_CLK_ENABLED++; if(CAN1_CLK_ENABLED==1){ __CAN1_CLK_ENABLE(); } /**CAN1 GPIO Configuration PB8 ------> CAN1_RX PB9 ------> CAN1_TX */ GPIO_InitStruct.Pin = CANRX1_Pin|CANTX1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; HAL_GPIO_Init(GPIOB, &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 */ __CAN2_CLK_ENABLE(); CAN1_CLK_ENABLED++; if(CAN1_CLK_ENABLED==1){ __CAN1_CLK_ENABLE(); } /**CAN2 GPIO Configuration PB5 ------> CAN2_RX PB6 ------> CAN2_TX */ GPIO_InitStruct.Pin = CANRX2_Pin|CANTX2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF9_CAN2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN CAN2_MspInit 1 */ /* USER CODE END CAN2_MspInit 1 */ } }
// assumes Init parameters have been set up correctly STATIC bool can_init(pyb_can_obj_t *can_obj) { CAN_TypeDef *CANx = NULL; uint32_t sce_irq = 0; const pin_obj_t *pins[2]; switch (can_obj->can_id) { #if defined(MICROPY_HW_CAN1_TX) case PYB_CAN_1: CANx = CAN1; sce_irq = CAN1_SCE_IRQn; pins[0] = MICROPY_HW_CAN1_TX; pins[1] = MICROPY_HW_CAN1_RX; __CAN1_CLK_ENABLE(); break; #endif #if defined(MICROPY_HW_CAN2_TX) case PYB_CAN_2: CANx = CAN2; sce_irq = CAN2_SCE_IRQn; pins[0] = MICROPY_HW_CAN2_TX; pins[1] = MICROPY_HW_CAN2_RX; __CAN1_CLK_ENABLE(); // CAN2 is a "slave" and needs CAN1 enabled as well __CAN2_CLK_ENABLE(); break; #endif default: return false; } // init GPIO uint32_t mode = MP_HAL_PIN_MODE_ALT; uint32_t pull = MP_HAL_PIN_PULL_UP; for (int i = 0; i < 2; i++) { if (!mp_hal_pin_config_alt(pins[i], mode, pull, AF_FN_CAN, can_obj->can_id)) { return false; } } // init CANx can_obj->can.Instance = CANx; HAL_CAN_Init(&can_obj->can); can_obj->is_enabled = true; can_obj->num_error_warning = 0; can_obj->num_error_passive = 0; can_obj->num_bus_off = 0; __HAL_CAN_ENABLE_IT(&can_obj->can, CAN_IT_ERR | CAN_IT_BOF | CAN_IT_EPV | CAN_IT_EWG); HAL_NVIC_SetPriority(sce_irq, IRQ_PRI_CAN, IRQ_SUBPRI_CAN); HAL_NVIC_EnableIRQ(sce_irq); return true; }
// assumes Init parameters have been set up correctly STATIC bool can_init(pyb_can_obj_t *can_obj) { CAN_TypeDef *CANx = NULL; uint32_t GPIO_Pin = 0; uint8_t GPIO_AF_CANx = 0; GPIO_TypeDef* GPIO_Port = NULL; switch (can_obj->can_id) { // CAN1 is on RX,TX = Y3,Y4 = PB9,PB9 case PYB_CAN_1: CANx = CAN1; GPIO_AF_CANx = GPIO_AF9_CAN1; GPIO_Port = GPIOB; GPIO_Pin = GPIO_PIN_8 | GPIO_PIN_9; __CAN1_CLK_ENABLE(); break; // CAN2 is on RX,TX = Y5,Y6 = PB12,PB13 case PYB_CAN_2: CANx = CAN2; GPIO_AF_CANx = GPIO_AF9_CAN2; GPIO_Port = GPIOB; GPIO_Pin = GPIO_PIN_12 | GPIO_PIN_13; __CAN1_CLK_ENABLE(); // CAN2 is a "slave" and needs CAN1 enabled as well __CAN2_CLK_ENABLE(); break; default: return false; } // init GPIO GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pin = GPIO_Pin; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Alternate = GPIO_AF_CANx; HAL_GPIO_Init(GPIO_Port, &GPIO_InitStructure); // init CANx can_obj->can.Instance = CANx; HAL_CAN_Init(&can_obj->can); can_obj->is_enabled = true; return true; }
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan->Instance==CAN2) { /* USER CODE BEGIN CAN2_MspInit 0 */ /* USER CODE END CAN2_MspInit 0 */ /* Peripheral clock enable */ __CAN2_CLK_ENABLE(); __CAN1_CLK_ENABLE(); /**CAN2 GPIO Configuration PB5 ------> CAN2_RX PB6 ------> CAN2_TX */ GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF9_CAN2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN CAN2_MspInit 1 */ /* USER CODE END CAN2_MspInit 1 */ } }
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan->Instance==CAN1) { /* USER CODE BEGIN CAN1_MspInit 0 */ /* USER CODE END CAN1_MspInit 0 */ /* Peripheral clock enable */ __CAN1_CLK_ENABLE(); /**CAN GPIO Configuration PA11 ------> CAN_RX PA12 ------> CAN_TX */ GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN CAN1_MspInit 1 */ /* USER CODE END CAN1_MspInit 1 */ } }
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan->Instance==CAN1) { /* Peripheral clock enable */ __CAN1_CLK_ENABLE(); hcan->pRxMsg = &canRxMsg1; hcan->pTxMsg = &canTxMsg1; hcan->Instance->MCR &= (~(uint32_t)CAN_MCR_DBF); if (RTE_CAN1_RX_PORT==GPIOB || RTE_CAN1_TX_PORT==GPIOB) __GPIOB_CLK_ENABLE(); if (RTE_CAN1_RX_PORT==GPIOD || RTE_CAN1_TX_PORT==GPIOD) __GPIOD_CLK_ENABLE(); GPIO_InitStruct.Pin = 1<<RTE_CAN1_RX_BIT; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; HAL_GPIO_Init(RTE_CAN1_RX_PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = 1<<RTE_CAN1_TX_BIT; HAL_GPIO_Init(RTE_CAN1_TX_PORT, &GPIO_InitStruct); /* System interrupt init*/ HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); HAL_NVIC_SetPriority(CAN1_TX_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN1_TX_IRQn); HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn); } }
/** * @brief Enables the CAN2 interface with the current settings * @param None * @retval None */ static ErrorStatus prvEnableCan2Interface() { /*##-1- Enable peripheral Clocks ###########################################*/ /* CAN2 Peripheral clock enable */ __CAN1_CLK_ENABLE(); /* IMPORTANT!!! As CAN2 is a slave device we need to enable the clock for CAN1 as well */ __CAN2_CLK_ENABLE(); /*##-2- Configure the NVIC #################################################*/ /* NVIC configuration for CAN2 Reception complete interrupt */ HAL_NVIC_SetPriority(CAN2_RX0_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY, 0); HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn); HAL_NVIC_SetPriority(CAN2_TX_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY, 0); HAL_NVIC_EnableIRQ(CAN2_TX_IRQn); /*##-3- Configure the CAN peripheral #######################################*/ if (HAL_CAN_Init(&CAN_Handle) != HAL_OK) { /* Initialization Error */ goto error; } /*##-4- Configure the CAN Filter ###########################################*/ if (HAL_CAN_ConfigFilter(&CAN_Handle, &CAN_Filter) != HAL_OK) { /* Filter configuration Error */ goto error; } /*##-5- Configure Transmission process #####################################*/ CAN_Handle.pTxMsg->StdId = 0x321; CAN_Handle.pTxMsg->ExtId = 0x01; CAN_Handle.pTxMsg->RTR = CAN_RTR_DATA; CAN_Handle.pTxMsg->IDE = CAN_ID_STD; CAN_Handle.pTxMsg->DLC = 2; /*##-6- Start the Reception process and enable reception interrupt #########*/ if (HAL_CAN_Receive_IT(&CAN_Handle, CAN_FIFO1) != HAL_OK) { /* Reception Error */ goto error; } return SUCCESS; error: /* Something went wrong so disable */ prvDisableCan2Interface(); return ERROR; }
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan->Instance==CAN1) { /* USER CODE BEGIN CAN1_MspInit 0 */ /* USER CODE END CAN1_MspInit 0 */ /* Peripheral clock enable */ __CAN1_CLK_ENABLE(); /**CAN1 GPIO Configuration PB8 ------> CAN1_RX PB9 ------> CAN1_TX */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(CAN1_TX_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_TX_IRQn); HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn); /* USER CODE BEGIN CAN1_MspInit 1 */ CAN_FilterConfTypeDef CAN_FilterInitStructure; /* CAN filter init */ CAN_FilterInitStructure.FilterNumber = 0; CAN_FilterInitStructure.FilterMode = CAN_FILTERMODE_IDMASK; CAN_FilterInitStructure.FilterScale = CAN_FILTERSCALE_32BIT; CAN_FilterInitStructure.FilterIdHigh = 0x0000; CAN_FilterInitStructure.FilterIdLow = 0x0000; CAN_FilterInitStructure.FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.FilterFIFOAssignment = 0; CAN_FilterInitStructure.FilterActivation = ENABLE; HAL_CAN_ConfigFilter(hcan, &CAN_FilterInitStructure); /* USER CODE END CAN1_MspInit 1 */ } }
/** * @brief Enables the CAN1 interface with the current settings * @param None * @retval None */ static ErrorStatus prvEnableCan1Interface() { /*##-1- Enable peripheral Clocks ###########################################*/ /* CAN1 Peripheral clock enable */ __CAN1_CLK_ENABLE(); /*##-2- Configure the NVIC #################################################*/ HAL_NVIC_SetPriority(CAN1_RX0_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); HAL_NVIC_SetPriority(CAN1_TX_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY, 0); HAL_NVIC_EnableIRQ(CAN1_TX_IRQn); /*##-3- Configure the CAN peripheral #######################################*/ if (HAL_CAN_Init(&CAN_Handle) != HAL_OK) { /* Initialization Error */ goto error; } /*##-4- Configure the CAN Filter ###########################################*/ if (HAL_CAN_ConfigFilter(&CAN_Handle, &CAN_Filter) != HAL_OK) { /* Filter configuration Error */ goto error; } /*##-6- Start the Reception process and enable reception interrupt #########*/ if (HAL_CAN_Receive_IT(&CAN_Handle, CAN_FIFO0) != HAL_OK) { /* Reception Error */ goto error; } return SUCCESS; error: /* Something went wrong so disable */ prvDisableCan1Interface(); return ERROR; }
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan->Instance==CAN1) { /* USER CODE BEGIN CAN1_MspInit 0 */ /* USER CODE END CAN1_MspInit 0 */ /* Peripheral clock enable */ __CAN1_CLK_ENABLE(); /**CAN1 GPIO Configuration PD0 ------> CAN1_RX PD1 ------> CAN1_TX */ GPIO_InitStruct.Pin = CANRX1_Pin|CANTX1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(CAN1_TX_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_TX_IRQn); HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn); HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn); /* USER CODE BEGIN CAN1_MspInit 1 */ /* USER CODE END CAN1_MspInit 1 */ } }
/** * @brief This function enable the CAN by enabling the peripheral clock * @param hcan select the can handle * @arg hcan_bsp1 * @arg hcan_bsp2 */ static void BSP_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan == &hcan_bsp1) { /* Peripheral clock enable */ __CAN1_CLK_ENABLE(); /**CAN1 GPIO Configuration PD0 ------> CAN1_RX PD1 ------> CAN1_TX */ __GPIOD_CLK_ENABLE(); 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_LOW; GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 2, 0); HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn); HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 2, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); HAL_NVIC_SetPriority(CAN1_TX_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN1_TX_IRQn); HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn); } else if(hcan == &hcan_bsp2) { /* Peripheral clock enable */ __CAN2_CLK_ENABLE(); __CAN1_CLK_ENABLE(); /**CAN2 GPIO Configuration PB12 ------> CAN2_RX PB13 ------> CAN2_TX */ __GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF9_CAN2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 2, 0); HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn); HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 2, 0); HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn); HAL_NVIC_SetPriority(CAN2_TX_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN2_TX_IRQn); HAL_NVIC_SetPriority(CAN2_SCE_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN2_SCE_IRQn); } }