CH32V003定时中断问题

使用CH32V00x评估板,芯片是CH32V003F4P6。

在中定时中断函数里面设置一个变量为1,主函数while循环里判断这个变量,执行异常。

代码见下:

/********************************** (C) COPYRIGHT *******************************

 * File Name          : main.c

 * Author             : WCH

 * Version            : V1.0.0

 * Date               : 2024/08/23

 * Description        : CH32V003 Device Peripheral Access Layer System Header File.

*********************************************************************************

* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.

* Attention: This software (modified or not) and binary are used for

* microcontroller manufactured by Nanjing Qinheng Microelectronics.

*******************************************************************************/


/*

 *@Note

 *TIMER_INT

 *MODE 1 Timer count triggers update interrupt. Updata_time = psc*arr*RepetitionCounter/system

 *MODE 2 generates an update event and triggers an update interrupt.

 *

 */


#include"debug.h"


int runFlag = 0;


/* Mode Definition */

#defineMODE1   0

#defineMODE2   1


/* Mode Selection */

#defineMODE MODE1

//#define MODE MODE2


/*********************************************************************

 * @fn      TIM1_UP_IRQHandler

 *

 * @brief   This function handles TIM1 UP exception.

 *

 *

 * @return  none

 */

void TIM1_UP_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void TIM1_UP_IRQHandler(void)

{

    if(TIM_GetITStatus(TIM1, TIM_IT_Update)==SET)

    {

        printf("--------updata\r\n");

        runFlag = 1;

    }

    TIM_ClearITPendingBit( TIM1, TIM_IT_Update );

}


/*********************************************************************

 * @fn      TIM1_INT_Init

 *

 * @brief   Initializes TIM1 output compare.

 *

 * @param   arr - the period value.

 *          psc - the prescaler value.

 *

 * @return  none

 */

void TIM1_INT_Init( u16 arr, u16 psc)

{


    NVIC_InitTypeDef NVIC_InitStructure={0};

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE );


    TIM_TimeBaseInitStructure.TIM_Period = arr;

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 50;

    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);


    TIM_ClearITPendingBit( TIM1, TIM_IT_Update );


    NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;

    NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);


}


/*********************************************************************

 * @fn      main

 *

 * @brief   Main program.

 *

 * @return  none

 */

int main(void)

{

    SystemCoreClockUpdate();

    Delay_Init();

#if (SDI_PRINT==SDI_PR_OPEN)

    SDI_Printf_Enable();

#else

    USART_Printf_Init(115200);

#endif

    printf("SystemClk:%d\r\n",SystemCoreClock);

    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );


    TIM1_INT_Init( 100-1, 4800-1);

#if(MODE==MODE1)


    TIM_Cmd( TIM1, ENABLE );//0.5S


#elif(MODE==MODE2)


    TIM_GenerateEvent(TIM1, TIM_IT_Update);


#endif


    while(1)

    {

        //printf("\nrunFlag is %d\n",runFlag);

        if( runFlag == 1 ){

            runFlag = 0;

            printf("--------run\r\n");

        }

    }

}


这样写的话,不会执行 printf("--------run\r\n");

但是只要改成这样:

    while(1)

    {

        printf("\nrunFlag is %d\n",runFlag);

        ifrunFlag == 1 ){

            runFlag = 0;

            printf("--------run\r\n");

        }

可以运行printf("--------run\r\n");

请问是什么原因

您好,可在定义的全局变量前面加个volatile试一下,防止被优化。


感谢答复,我试试 @TECH62


只有登录才能回复,可以选择微信账号登录