Add CAN send logic and DIO mapping

This commit is contained in:
2025-03-30 10:47:13 +02:00
parent eb994ad693
commit 1a517299a0
4 changed files with 247 additions and 252 deletions

View File

@ -27,7 +27,7 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "mappings.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@ -49,7 +49,8 @@
/* USER CODE BEGIN PV */
/* Declare buffer in D1 domain SRAM */
static uint16_t adc_values[16];
static uint16_t adc_values[NUM_ADC_PINS];
static uint8_t dio_values[NUM_DIO_PINS];
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@ -108,31 +109,106 @@ int main(void)
/* USER CODE BEGIN 2 */
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_values, 16) != HAL_OK)
{
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_values, NUM_ADC_PINS) != HAL_OK)
Error_Handler();
}
HAL_TIM_Base_Start(&htim6);
// CAN TX PREP
FDCAN_TxHeaderTypeDef txHeader;
// Prep the tx frame
txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
txHeader.BitRateSwitch = FDCAN_BRS_OFF;
txHeader.FDFormat = FDCAN_CLASSIC_CAN;
txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
txHeader.IdType = FDCAN_STANDARD_ID;
txHeader.Identifier = 0x0;
txHeader.TxFrameType = FDCAN_DATA_FRAME;
txHeader.DataLength = 8;
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
Error_Handler();
if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT,
FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE) != HAL_OK)
Error_Handler();
// TODO: Add Filters and Rx Handler
if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
Error_Handler();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
for (unsigned int mscounter = 0; 1; mscounter++)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(STATUS_G_GPIO_Port, STATUS_G_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(STATUS_G_GPIO_Port, STATUS_G_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
for (int di = 0; di < NUM_DIO_PINS; di++) {
dio_values[di] = HAL_GPIO_ReadPin(
DIO_PIN_MAP[di].port,
DIO_PIN_MAP[di].pin
);
}
for (int pi = 0; pi < NUM_TX_PKT; pi++) {
can_pkt_t* pktinfo = &(CAN_SIGNAL_MAP[pi]);
if (mscounter % pktinfo->period == 0) {
txHeader.Identifier = pktinfo->can_id;
txHeader.DataLength = pktinfo->dlc;
uint64_t txData = 0;
for (int si = 0; si < pktinfo->num_signals; si++) {
can_signal_t* signal = &(pktinfo->signals[si]);
uint16_t value = 0;
switch (signal->type) {
case DIN:
value = dio_values[signal->channel];
break;
case AIN:
value = signal->factor * adc_values[signal->channel];
break;
case FIN:
/* NYI */
break;
default:
break;
}
uint16_t mask = 0xFFFF >> (16 - signal->length);
txData |= ((uint64_t) (value & mask)) << (signal->start);
}
if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, (uint8_t*) &txData) != HAL_OK)
Error_Handler();
}
if (mscounter >= 500) {
mscounter = 0;
HAL_GPIO_TogglePin(STATUS_G_GPIO_Port, STATUS_G_Pin);
}
}
// TODO: Move all this into a 1kHz timer callback!
HAL_Delay(1);
}
/* USER CODE END 3 */
}
@ -229,9 +305,7 @@ void Error_Handler(void)
/* User can add his own implementation to report the HAL error return state */
HAL_GPIO_WritePin(STATUS_R_GPIO_Port, STATUS_R_Pin, GPIO_PIN_SET);
__disable_irq();
while (1)
{
}
while (1);
/* USER CODE END Error_Handler_Debug */
}