CH32V103时间中断里置位的全局变量,主循环中无法查询

用CH32V103C8T6作时间中断,PA0和PA1各控制一个LED

根据例程,如下程序已经实现两个LED都在闪烁,即时间中断功能已经实现


int main(void)
{
    u8 j=0;


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    LED_Init();
    TIM3_Init(4999,7199);
    printf("SystemClk:%d\r\n",SystemCoreClock);

    while(1)
    {        
           GPIO_WriteBit(GPIOA, GPIO_Pin_0, (j==0) ? (j=Bit_SET):(j=Bit_RESET));        

           Delay_Ms(100);
    }

}



void TIM3_IRQHandler(void)
{
    static u8 i=0;

    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
    {
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);    //清除TIM3的中断挂起位。        
         printf("Enter interrupt\n");        

        GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
    }
}


上述功能正常实现,现程序稍作修改:用一个全局变量Tim3Flag用来标记是否有时间中断产生,在主循环中查询标记,查询到标记置1后将标记清零并闪烁LED , 程序如下:


int main(void)
{
    u8 j=0;


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    LED_Init();
    TIM3_Init(4999,7199);
    printf("SystemClk:%d\r\n",SystemCoreClock);

   

  while(1)
    {
        if(Tim3Flag){
            Tim3Flag = 0;
            GPIO_WriteBit(GPIOA, GPIO_Pin_0, (j==0) ? (j=Bit_SET):(j=Bit_RESET));
        }          

    }

}



void TIM3_IRQHandler(void)
{
    static u8 i=0;

    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
    {        

        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);    //清除TIM3的中断挂起位。

         Tim3Flag = 1;        
         printf("Enter interrupt\n");        

        GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
    }
}

上述修改后的程序,正常情况应该是2个LED同频率闪烁,串口定时收到字符串“Enter interrupt

现在的情况是:串口能定时收到信息,PA1控制的LED正常闪烁,主循环中查询标记位并由PA0控制的LED不闪烁。说明定时器工作了,主循环查询标记却查询不到,不知是什么原因? 

全局变量需要使用volatile定义,这个需要注意一下。


加上volatile问题解决了,谢谢


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