Fix CAN Interrupts and avoid GPIO Port B

This commit is contained in:
2022-08-02 15:48:35 +02:00
parent 6603b01a0d
commit d020587091
10 changed files with 212 additions and 63 deletions

View File

@ -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);
}

View File

@ -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 */

View File

@ -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 */