Caleb
Caleb

Reputation: 21

STM32 Timer Interrupts causing Debug problems

I'm using STM32MP157A-DK1 Discovery kit with STM32MP157A MPU.

My problem is that when I terminate the debug and launch again my code stop in void HardFault_Handler(void); (in stm32mp1xx_it.c). The first debugging time works ok, the problem was in the second debug.

I tried removing HAL_TIM_Base_Start_IT(&htim14); and the problem stopped, but I need the timer. Also tried switching timers and the others also give me the same debugging problem.

I checked the hardware configuration (.ioc file) and it's all in default values except the timers that I'm using.

int main(void) {
    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    if(IS_ENGINEERING_BOOT_MODE()){
        /* Configure the system clock */
        SystemClock_Config();
    }

    if(IS_ENGINEERING_BOOT_MODE()){
        /* Configure the peripherals common clocks */
        PeriphCommonClock_Config();
    }else{
        /* IPCC initialisation */
        MX_IPCC_Init();
        /* OpenAmp initialisation ---------------------------------*/
        MX_OPENAMP_Init(RPMSG_REMOTE, NULL);
    }

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_TIM14_Init();
    /* USER CODE BEGIN 2 */
    /*
     * Create Virtual UART device
     * defined by a rpmsg channel attached to the remote device
     */
    log_info("Virtual UART0 OpenAMP-rpmsg channel creation\r\n");
    if(VIRT_UART_Init(&huart0) != VIRT_UART_OK){
        log_err("VIRT_UART_Init UART0 failed.\r\n");
        Error_Handler();
    }

    log_info("Virtual UART1 OpenAMP-rpmsg channel creation\r\n");
    if(VIRT_UART_Init(&huart1) != VIRT_UART_OK){
        log_err("VIRT_UART_Init UART1 failed.\r\n");
        Error_Handler();
    }
    //Need to register callback for message reception by channels
    if(VIRT_UART_RegisterCallback(&huart0, VIRT_UART_RXCPLT_CB_ID, VIRT_UART0_RxCpltCallback) != VIRT_UART_OK){ Error_Handler();}
    if(VIRT_UART_RegisterCallback(&huart1, VIRT_UART_RXCPLT_CB_ID, VIRT_UART1_RxCpltCallback) != VIRT_UART_OK){ Error_Handler();}

    HAL_TIM_Base_Start_IT(&htim14);     //Here is the trouble maker
    
    while(1){
        OPENAMP_check_for_message();
    }
}

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if(htim == &htim14){
        //do something
    }
}

void VIRT_UART0_RxCpltCallback(VIRT_UART_HandleTypeDef *huart) {
    //log_info("Msg received on VIRTUAL UART0 channel:  %s \n\r",   (char*) huart->pRxBuffPtr);
}

void VIRT_UART1_RxCpltCallback(VIRT_UART_HandleTypeDef *huart) {
    log_info("Msg received on VIRTUAL UART1 channel:  %s \n\r", (char*) huart->pRxBuffPtr);
}

I'm using Windows 10, STM32CubeIDE (Version: 1.8.0, Build: 11526_20211125_0815 (UTC)), STM32CubeMX (Version: 6.4.0-RC4, Build: 20211122-2105 (UTC)).

Upvotes: 1

Views: 1875

Answers (1)

Caleb
Caleb

Reputation: 21

I just put

TIM14->DIER &= ~(TIM_IT_UPDATE);
TIM14->CR1  &= ~(TIM_CR1_CEN);

before call timer initialization

MX_TIM14_Init();

The problem was in Production Mode the A7 core controls all M4's peripherical, so it only reset the interruption when I reset the core A7. This code I use turn off the interrupt to prevent a interrupt call before initialization. You must call it for every peripheric interrupt (check how to disable it, for timers just change the TIM number. Ex: TIM3, TIM17, ...)

Don't know if it's the best way, it's working until now though.

Final main() code:

int main(void) {
    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    if(IS_ENGINEERING_BOOT_MODE()){
        /* Configure the system clock */
        SystemClock_Config();
    }

    if(IS_ENGINEERING_BOOT_MODE()){
        /* Configure the peripherals common clocks */
        PeriphCommonClock_Config();
    }else{
        /* IPCC initialisation */
        MX_IPCC_Init();
        /* OpenAmp initialisation ---------------------------------*/
        MX_OPENAMP_Init(RPMSG_REMOTE, NULL);
    }

    /* USER CODE BEGIN SysInit */
    TIM14->DIER &= ~(TIM_IT_UPDATE);
    TIM14->CR1  &= ~(TIM_CR1_CEN);
    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_TIM14_Init();
    /* USER CODE BEGIN 2 */
    /*
     * Create Virtual UART device
     * defined by a rpmsg channel attached to the remote device
     */
    log_info("Virtual UART0 OpenAMP-rpmsg channel creation\r\n");
    if(VIRT_UART_Init(&huart0) != VIRT_UART_OK){
        log_err("VIRT_UART_Init UART0 failed.\r\n");
        Error_Handler();
    }

    log_info("Virtual UART1 OpenAMP-rpmsg channel creation\r\n");
    if(VIRT_UART_Init(&huart1) != VIRT_UART_OK){
        log_err("VIRT_UART_Init UART1 failed.\r\n");
        Error_Handler();
    }
    //Need to register callback for message reception by channels
    if(VIRT_UART_RegisterCallback(&huart0, VIRT_UART_RXCPLT_CB_ID, VIRT_UART0_RxCpltCallback) != VIRT_UART_OK){ Error_Handler();}
    if(VIRT_UART_RegisterCallback(&huart1, VIRT_UART_RXCPLT_CB_ID, VIRT_UART1_RxCpltCallback) != VIRT_UART_OK){ Error_Handler();}

    HAL_TIM_Base_Start_IT(&htim14);     //Here is the trouble maker
    
    while(1){
        OPENAMP_check_for_message();
    }
}

Upvotes: 1

Related Questions