Fix CAN Interrupts and avoid GPIO Port B
This commit is contained in:
@ -19,6 +19,7 @@
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
@ -28,7 +29,7 @@
|
||||
// BITFIELDS ARE LSB FIRST!
|
||||
|
||||
typedef union {
|
||||
uint8_t raw[8];
|
||||
uint8_t raw[1];
|
||||
struct {
|
||||
bool as_driving_mode : 1;
|
||||
bool as_close_sdc : 1;
|
||||
@ -120,15 +121,38 @@ int main(void)
|
||||
MX_CAN_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
// Init data as LOW
|
||||
memset(&RxData, 0, sizeof(rx_data_t));
|
||||
|
||||
if (HAL_CAN_Start(&hcan) != HAL_OK)
|
||||
Error_Handler();
|
||||
|
||||
CAN_FilterTypeDef canfilterconfig;
|
||||
|
||||
canfilterconfig.FilterActivation = CAN_FILTER_ENABLE;
|
||||
canfilterconfig.FilterBank = 0;
|
||||
canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
|
||||
canfilterconfig.FilterIdHigh = 0;
|
||||
canfilterconfig.FilterIdLow = 0;
|
||||
canfilterconfig.FilterMaskIdHigh = 0;
|
||||
canfilterconfig.FilterMaskIdLow = 0;
|
||||
canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||
canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
|
||||
canfilterconfig.SlaveStartFilterBank = 14;
|
||||
|
||||
if (HAL_CAN_ConfigFilter(&hcan, &canfilterconfig) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
|
||||
Error_Handler();
|
||||
|
||||
HAL_CAN_Start(&hcan);
|
||||
|
||||
CAN_TxHeaderTypeDef TxHeader;
|
||||
uint32_t TxMailbox;
|
||||
tx_data_t TxData;
|
||||
|
||||
memset(&TxData, 0, sizeof(tx_data_t));
|
||||
|
||||
// Prep the tx frame
|
||||
TxHeader.IDE = CAN_ID_STD;
|
||||
TxHeader.StdId = CAN_ID_TX;
|
||||
@ -149,13 +173,16 @@ int main(void)
|
||||
HAL_GPIO_WritePin(GPIOA, AS_close_SDC_Pin, RxData.signals.as_close_sdc);
|
||||
HAL_GPIO_WritePin(GPIOA, Watchdog_Pin, RxData.signals.watchdog);
|
||||
|
||||
// every nth rx, we tx
|
||||
// every nth rx, we tx¨
|
||||
if (++counter >= (TX_UPDATE_PERIOD / RX_UPDATE_PERIOD)) {
|
||||
|
||||
// Read values to send
|
||||
TxData.signals.sdc_in = HAL_GPIO_ReadPin(GPIOA, SDC_in_3V3_Pin);
|
||||
TxData.signals.sdc_ready = HAL_GPIO_ReadPin(GPIOA, SDC_is_ready_Pin);
|
||||
TxData.signals.ts_start = HAL_GPIO_ReadPin(GPIOA, TS_activate_MUXed_Pin);
|
||||
uint8_t s = HAL_GPIO_ReadPin(GPIOA, SDC_in_3V3_Pin) == GPIO_PIN_SET;
|
||||
uint8_t r = HAL_GPIO_ReadPin(GPIOA, SDC_is_ready_Pin) == GPIO_PIN_SET;
|
||||
uint8_t t = HAL_GPIO_ReadPin(GPIOA, TS_activate_MUXed_Pin) == GPIO_PIN_SET;
|
||||
TxData.signals.sdc_in = s;
|
||||
TxData.signals.sdc_ready = r;
|
||||
TxData.signals.ts_start = t;
|
||||
|
||||
// Send out CAN message
|
||||
if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData.raw, &TxMailbox) != HAL_OK)
|
||||
@ -165,7 +192,17 @@ int main(void)
|
||||
|
||||
}
|
||||
|
||||
// Slow the loop
|
||||
// CAN_RxHeaderTypeDef RxHeader;
|
||||
// uint8_t RxBuffer[8];
|
||||
//
|
||||
// // Read frame from HW into buffer
|
||||
// if (HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxBuffer) == HAL_OK) {
|
||||
// // Copy into the bitfield if it's for us
|
||||
// if (RxHeader.StdId == CAN_ID_RX)
|
||||
// RxData.raw[0] = RxBuffer[0];
|
||||
// }
|
||||
//
|
||||
// // Slow the loop
|
||||
HAL_Delay(RX_UPDATE_PERIOD);
|
||||
|
||||
/* USER CODE END WHILE */
|
||||
@ -234,7 +271,7 @@ static void MX_CAN_Init(void)
|
||||
hcan.Init.TimeTriggeredMode = DISABLE;
|
||||
hcan.Init.AutoBusOff = DISABLE;
|
||||
hcan.Init.AutoWakeUp = DISABLE;
|
||||
hcan.Init.AutoRetransmission = DISABLE;
|
||||
hcan.Init.AutoRetransmission = ENABLE;
|
||||
hcan.Init.ReceiveFifoLocked = DISABLE;
|
||||
hcan.Init.TransmitFifoPriority = DISABLE;
|
||||
if (HAL_CAN_Init(&hcan) != HAL_OK)
|
||||
@ -263,6 +300,12 @@ static void MX_GPIO_Init(void)
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOA, AS_close_SDC_Pin|AS_driving_mode_Pin|Watchdog_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pins : SDC_is_ready_Pin SDC_in_3V3_Pin */
|
||||
GPIO_InitStruct.Pin = SDC_is_ready_Pin|SDC_in_3V3_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : AS_close_SDC_Pin AS_driving_mode_Pin Watchdog_Pin */
|
||||
GPIO_InitStruct.Pin = AS_close_SDC_Pin|AS_driving_mode_Pin|Watchdog_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
@ -270,11 +313,11 @@ static void MX_GPIO_Init(void)
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : TS_activate_MUXed_Pin SDC_is_ready_Pin SDC_in_3V3_Pin */
|
||||
GPIO_InitStruct.Pin = TS_activate_MUXed_Pin|SDC_is_ready_Pin|SDC_in_3V3_Pin;
|
||||
/*Configure GPIO pin : TS_activate_MUXed_Pin */
|
||||
GPIO_InitStruct.Pin = TS_activate_MUXed_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
||||
HAL_GPIO_Init(TS_activate_MUXed_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -105,6 +105,9 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF9_TIM1;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* CAN interrupt Init */
|
||||
HAL_NVIC_SetPriority(USB_LP_CAN_RX0_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn);
|
||||
/* USER CODE BEGIN CAN_MspInit 1 */
|
||||
|
||||
/* USER CODE END CAN_MspInit 1 */
|
||||
@ -134,6 +137,8 @@ void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);
|
||||
|
||||
/* CAN interrupt DeInit */
|
||||
HAL_NVIC_DisableIRQ(USB_LP_CAN_RX0_IRQn);
|
||||
/* USER CODE BEGIN CAN_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END CAN_MspDeInit 1 */
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
|
||||
extern CAN_HandleTypeDef hcan;
|
||||
/* USER CODE BEGIN EV */
|
||||
|
||||
/* USER CODE END EV */
|
||||
@ -198,6 +198,20 @@ void SysTick_Handler(void)
|
||||
/* please refer to the startup file (startup_stm32f3xx.s). */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles CAN RX0 and USB low priority interrupts.
|
||||
*/
|
||||
void USB_LP_CAN_RX0_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 0 */
|
||||
|
||||
/* USER CODE END USB_LP_CAN_RX0_IRQn 0 */
|
||||
HAL_CAN_IRQHandler(&hcan);
|
||||
/* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 1 */
|
||||
|
||||
/* USER CODE END USB_LP_CAN_RX0_IRQn 1 */
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
||||
Reference in New Issue
Block a user