stm32 прерывание таймера Hardfault error CubeIDE - PullRequest
0 голосов
/ 08 мая 2020

Я работаю над проектом (управляю степперами) и постоянно получаю Hardfault Errors. Отладчик заявляет, что void hardfault вызывается изнутри "HAL_TIM_IQRHandler".

Я не понимаю, почему это могло произойти.

Я проверил: 1. Размер стека и кучи 2.if void TIM4_IQRHandler занимает больше времени, чем период, который он вызывается в 3. если произошла ошибка указателя 4. другой mcu

Я использую stm32f103c8 и CubeIDE.

Код: 'void TIM4_IRQHandler (void) { / * КОД ПОЛЬЗОВАТЕЛЯ НАЧАЛО TIM4_IRQn 0 * /

/* USER CODE END TIM4_IRQn 0 */
HAL_TIM_IRQHandler(&htim4);
/* USER CODE BEGIN TIM4_IRQn 1 */

c++;    //Frame No.
if (flag_m != 0 || c >= 100) {    // new buffer 
    c = 0;
    frame_ac_fin(pwm_buffer);   // old frame was finished 
    pwm_buffer = get_frame_r(pwm_buffer, flag_buffer); //get new frame /returns NULL when no new data
    if (pwm_buffer == NULL) {
        flag_m = 1;    // no frame 
    } else {
        flag_m = 0;    // new frame 
    }

} else {
    //HAL_TIM_PWM_ConfigChannel(&htim1, sConfig, Channel)

    HAL_TIM_Base_Stop(&htim1);
    HAL_TIM_Base_Stop(&htim3);

    if (pwm_buffer[c] == 0) {
        pwm_buffer[c] = 1;       //Edit
    }
    if (pwm_buffer[100 + c] == 0) {
        pwm_buffer[100+c] = 1;    //Edit
    }

    TIM3->PSC =  pwm_buffer[c];        // M left
    TIM1->PSC =  pwm_buffer[100 + c];  // M right

    HAL_TIM_Base_Start(&htim1);
    HAL_TIM_Base_Start(&htim3);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

    if (pwm_buffer[c] == 0 && pwm_buffer[c + 100] == 0) { //End of buffer/frame  
        flag_m = 1;
    }

}


/* USER CODE END TIM4_IRQn 1 */

} '

TIMER init - это стандартный код CubeIDE / CubeMx

1 Ответ

0 голосов
/ 29 июля 2020

Так что проблема действительно глупая, я больше записывал данные в массив, чем пробел в нем (так что данные выходят за границы).

...