Resolve #4 by running main loop inside timer IRQ and setting it to 1kHz
This commit is contained in:
		@ -62,6 +62,7 @@ void FDCAN2_IT0_IRQHandler(void);
 | 
			
		||||
void FDCAN1_IT1_IRQHandler(void);
 | 
			
		||||
void FDCAN2_IT1_IRQHandler(void);
 | 
			
		||||
void TIM8_CC_IRQHandler(void);
 | 
			
		||||
void TIM6_DAC_IRQHandler(void);
 | 
			
		||||
/* USER CODE BEGIN EFP */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END EFP */
 | 
			
		||||
 | 
			
		||||
@ -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,113 +78,13 @@ static void MX_NVIC_Init(void);
 | 
			
		||||
/* Private user code ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
void loop_1kHz() {
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  The application entry point.
 | 
			
		||||
  * @retval int
 | 
			
		||||
  */
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
  if (!setup_complete)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN 1 */
 | 
			
		||||
  mscounter++;
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
  /* MCU Configuration--------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 | 
			
		||||
  HAL_Init();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN Init */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Init */
 | 
			
		||||
 | 
			
		||||
  /* Configure the system clock */
 | 
			
		||||
  SystemClock_Config();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SysInit */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SysInit */
 | 
			
		||||
 | 
			
		||||
  /* Initialize all configured peripherals */
 | 
			
		||||
  MX_GPIO_Init();
 | 
			
		||||
  MX_DMA_Init();
 | 
			
		||||
  MX_ADC1_Init();
 | 
			
		||||
  MX_FDCAN1_Init();
 | 
			
		||||
  MX_FDCAN2_Init();
 | 
			
		||||
  MX_TIM1_Init();
 | 
			
		||||
  MX_TIM3_Init();
 | 
			
		||||
  MX_TIM8_Init();
 | 
			
		||||
  MX_TIM6_Init();
 | 
			
		||||
  MX_TIM4_Init();
 | 
			
		||||
 | 
			
		||||
  /* Initialize interrupts */
 | 
			
		||||
  MX_NVIC_Init();
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  
 | 
			
		||||
  FDCAN_HandleTypeDef* hMainCAN = &hfdcan2;
 | 
			
		||||
  //FDCAN_HandleTypeDef* hPeriCAN = &hfdcan1;
 | 
			
		||||
 | 
			
		||||
  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, 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(hMainCAN, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_ConfigGlobalFilter(hMainCAN, FDCAN_REJECT, FDCAN_REJECT,
 | 
			
		||||
                                    FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  FDCAN_FilterTypeDef filter;
 | 
			
		||||
  filter.IdType = FDCAN_STANDARD_ID;
 | 
			
		||||
  filter.FilterIndex = 0;
 | 
			
		||||
  filter.FilterType = FDCAN_FILTER_MASK;
 | 
			
		||||
  filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
 | 
			
		||||
  filter.FilterID1 = 0x0DD;
 | 
			
		||||
  filter.FilterID2 = 0x7FE; // Match 0x0DC and 0x0DD
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_ConfigFilter(hMainCAN, &filter) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_Start(hMainCAN) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  // Init all channels as stopped
 | 
			
		||||
  memset(pwm_ch_active, 0, 8);
 | 
			
		||||
 | 
			
		||||
  // Start input capture for WSS
 | 
			
		||||
  HAL_TIM_IC_Start_IT(&htim8, TIM_CHANNEL_1);
 | 
			
		||||
  HAL_TIM_IC_Start_IT(&htim8, TIM_CHANNEL_2);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END 2 */
 | 
			
		||||
 | 
			
		||||
  /* Infinite loop */
 | 
			
		||||
  /* USER CODE BEGIN WHILE */
 | 
			
		||||
  for (unsigned int mscounter = 0; 1; mscounter++)
 | 
			
		||||
  {
 | 
			
		||||
    /* 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,
 | 
			
		||||
@ -238,9 +144,118 @@ int main(void)
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    // TODO: Move all this into a 1kHz timer callback!
 | 
			
		||||
    HAL_Delay(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  The application entry point.
 | 
			
		||||
  * @retval int
 | 
			
		||||
  */
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
  /* MCU Configuration--------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 | 
			
		||||
  HAL_Init();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN Init */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Init */
 | 
			
		||||
 | 
			
		||||
  /* Configure the system clock */
 | 
			
		||||
  SystemClock_Config();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SysInit */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SysInit */
 | 
			
		||||
 | 
			
		||||
  /* Initialize all configured peripherals */
 | 
			
		||||
  MX_GPIO_Init();
 | 
			
		||||
  MX_DMA_Init();
 | 
			
		||||
  MX_ADC1_Init();
 | 
			
		||||
  MX_FDCAN1_Init();
 | 
			
		||||
  MX_FDCAN2_Init();
 | 
			
		||||
  MX_TIM1_Init();
 | 
			
		||||
  MX_TIM3_Init();
 | 
			
		||||
  MX_TIM8_Init();
 | 
			
		||||
  MX_TIM6_Init();
 | 
			
		||||
  MX_TIM4_Init();
 | 
			
		||||
 | 
			
		||||
  /* Initialize interrupts */
 | 
			
		||||
  MX_NVIC_Init();
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  
 | 
			
		||||
  hMainCAN = &hfdcan2;
 | 
			
		||||
  hPeriCAN = &hfdcan1;
 | 
			
		||||
 | 
			
		||||
  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, NUM_ADC_PINS) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  HAL_TIM_Base_Start_IT(&htim6);
 | 
			
		||||
 | 
			
		||||
  // CAN TX PREP
 | 
			
		||||
 | 
			
		||||
  // 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(hMainCAN, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_ConfigGlobalFilter(hMainCAN, FDCAN_REJECT, FDCAN_REJECT,
 | 
			
		||||
                                    FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  FDCAN_FilterTypeDef filter;
 | 
			
		||||
  filter.IdType = FDCAN_STANDARD_ID;
 | 
			
		||||
  filter.FilterIndex = 0;
 | 
			
		||||
  filter.FilterType = FDCAN_FILTER_MASK;
 | 
			
		||||
  filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
 | 
			
		||||
  filter.FilterID1 = 0x0DD;
 | 
			
		||||
  filter.FilterID2 = 0x7FE; // Match 0x0DC and 0x0DD
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_ConfigFilter(hMainCAN, &filter) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_Start(hMainCAN) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  // Init all channels as stopped
 | 
			
		||||
  memset(pwm_ch_active, 0, 8);
 | 
			
		||||
 | 
			
		||||
  // Start input capture for WSS
 | 
			
		||||
  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 */
 | 
			
		||||
  while(1)
 | 
			
		||||
  {
 | 
			
		||||
    /* USER CODE END WHILE */
 | 
			
		||||
 | 
			
		||||
    /* USER CODE BEGIN 3 */
 | 
			
		||||
    //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 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -59,6 +59,7 @@ extern DMA_HandleTypeDef hdma_adc1;
 | 
			
		||||
extern ADC_HandleTypeDef hadc1;
 | 
			
		||||
extern FDCAN_HandleTypeDef hfdcan1;
 | 
			
		||||
extern FDCAN_HandleTypeDef hfdcan2;
 | 
			
		||||
extern TIM_HandleTypeDef htim6;
 | 
			
		||||
extern TIM_HandleTypeDef htim8;
 | 
			
		||||
/* USER CODE BEGIN EV */
 | 
			
		||||
 | 
			
		||||
@ -300,6 +301,20 @@ void TIM8_CC_IRQHandler(void)
 | 
			
		||||
  /* USER CODE END TIM8_CC_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.
 | 
			
		||||
  */
 | 
			
		||||
void TIM6_DAC_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM6_DAC_IRQn 0 */
 | 
			
		||||
  HAL_TIM_IRQHandler(&htim6);
 | 
			
		||||
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM6_DAC_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
@ -217,9 +217,9 @@ void MX_TIM6_Init(void)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM6_Init 1 */
 | 
			
		||||
  htim6.Instance = TIM6;
 | 
			
		||||
  htim6.Init.Prescaler = 4800-1;
 | 
			
		||||
  htim6.Init.Prescaler = 480-1;
 | 
			
		||||
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim6.Init.Period = 2000-1;
 | 
			
		||||
  htim6.Init.Period = 200-1;
 | 
			
		||||
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
@ -334,6 +334,10 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
 | 
			
		||||
  /* USER CODE END TIM6_MspInit 0 */
 | 
			
		||||
    /* TIM6 clock enable */
 | 
			
		||||
    __HAL_RCC_TIM6_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    /* TIM6 interrupt Init */
 | 
			
		||||
    HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
 | 
			
		||||
    HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
 | 
			
		||||
  /* USER CODE BEGIN TIM6_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM6_MspInit 1 */
 | 
			
		||||
@ -502,6 +506,9 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
 | 
			
		||||
  /* USER CODE END TIM6_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM6_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /* TIM6 interrupt Deinit */
 | 
			
		||||
    HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);
 | 
			
		||||
  /* USER CODE BEGIN TIM6_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM6_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
@ -276,6 +276,7 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 | 
			
		||||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
 | 
			
		||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 | 
			
		||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
 | 
			
		||||
NVIC.TIM6_DAC_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
 | 
			
		||||
NVIC.TIM8_CC_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
 | 
			
		||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 | 
			
		||||
PA0.GPIOParameters=GPIO_Label
 | 
			
		||||
@ -633,8 +634,8 @@ TIM4.Period=255
 | 
			
		||||
TIM4.Prescaler=19
 | 
			
		||||
TIM6.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE
 | 
			
		||||
TIM6.IPParameters=Prescaler,Period,TIM_MasterOutputTrigger,AutoReloadPreload
 | 
			
		||||
TIM6.Period=2000-1
 | 
			
		||||
TIM6.Prescaler=4800-1
 | 
			
		||||
TIM6.Period=200-1
 | 
			
		||||
TIM6.Prescaler=480-1
 | 
			
		||||
TIM6.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
 | 
			
		||||
TIM8.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1
 | 
			
		||||
TIM8.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user