Resolve #4 by running main loop inside timer IRQ and setting it to 1kHz

This commit is contained in:
2025-05-12 17:46:28 +02:00
parent 2657040304
commit 7c50101f9e
5 changed files with 129 additions and 74 deletions

View File

@ -50,6 +50,12 @@
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
unsigned int mscounter;
unsigned int setup_complete;
FDCAN_HandleTypeDef *hMainCAN, *hPeriCAN;
FDCAN_TxHeaderTypeDef txHeader;
/* Declare buffer in D1 domain SRAM */
static uint16_t adc_values[NUM_ADC_PINS];
static uint8_t dio_values[NUM_DIO_PINS];
@ -72,6 +78,74 @@ static void MX_NVIC_Init(void);
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void loop_1kHz() {
if (!setup_complete)
return;
mscounter++;
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 (pktinfo->num_signals < 0)
continue;
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:
value = wss_flanks[signal->channel];
wss_flanks[signal->channel] = 0;
break;
default:
break;
}
uint16_t mask = 0xFFFF >> (16 - signal->length);
txData |= ((uint64_t) (value & mask)) << (signal->start);
}
if (HAL_FDCAN_AddMessageToTxFifoQ(hMainCAN, &txHeader, (uint8_t*) &txData) != HAL_OK)
Error_Handler();
}
if (mscounter >= 500) {
mscounter = 0;
HAL_GPIO_TogglePin(STATUS_G_GPIO_Port, STATUS_G_Pin);
}
}
}
/* USER CODE END 0 */
/**
@ -117,8 +191,8 @@ int main(void)
MX_NVIC_Init();
/* USER CODE BEGIN 2 */
FDCAN_HandleTypeDef* hMainCAN = &hfdcan2;
//FDCAN_HandleTypeDef* hPeriCAN = &hfdcan1;
hMainCAN = &hfdcan2;
hPeriCAN = &hfdcan1;
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
Error_Handler();
@ -126,12 +200,10 @@ int main(void)
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_values, NUM_ADC_PINS) != HAL_OK)
Error_Handler();
HAL_TIM_Base_Start(&htim6);
HAL_TIM_Base_Start_IT(&htim6);
// CAN TX PREP
FDCAN_TxHeaderTypeDef txHeader;
// Prep the tx frame
txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
txHeader.BitRateSwitch = FDCAN_BRS_OFF;
@ -170,77 +242,20 @@ int main(void)
HAL_TIM_IC_Start_IT(&htim8, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim8, TIM_CHANNEL_2);
mscounter = 0;
setup_complete = 1;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
for (unsigned int mscounter = 0; 1; mscounter++)
while(1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
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 (pktinfo->num_signals < 0)
continue;
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:
value = wss_flanks[signal->channel];
wss_flanks[signal->channel] = 0;
break;
default:
break;
}
uint16_t mask = 0xFFFF >> (16 - signal->length);
txData |= ((uint64_t) (value & mask)) << (signal->start);
}
if (HAL_FDCAN_AddMessageToTxFifoQ(hMainCAN, &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);
//HAL_SuspendTick();
//HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}
/* USER CODE END 3 */
}
@ -318,13 +333,24 @@ static void MX_NVIC_Init(void)
}
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
/*void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if (hadc->Instance == ADC1)
{
__asm volatile ("NOP");
}
}
}*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
//HAL_GPIO_TogglePin(STATUS_B_GPIO_Port, STATUS_B_Pin);
if (htim != &htim6)
return;
loop_1kHz();
};
/*
* Input capture timing calculations:
@ -430,6 +456,11 @@ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *handle, uint32_t RxFifo0ITs)
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_ResumeTick();
}
/* USER CODE END 4 */
/**