ch32v003定时器1中断配置失败

定时器中断配置完,中断里的打印没有执行,主程序尝试打印也没有打印出现


#include "debug.h"


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

void TIM1_Int_Init(u16 arr,u16 psc)

{



    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_30MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure);


    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能TIM1时钟

    TIM_TimeBaseStructure.TIM_Period = arr;   //指定下次更新事件时要加载到活动自动重新加载寄存器中的周期值。

    TIM_TimeBaseStructure.TIM_Prescaler =psc; //指定用于划分TIM时钟的预分频器值。

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频因子

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式,向上计数模式

    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位


    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能TIM1中断,允许更新中断


//    TIM_ClearITPendingBit(TIM1, TIM_IT_Update);

//    TIM_ClearFlag(TIM1, TIM_FLAG_Update); //清除更新标志位

    

    //初始化TIM NVIC,设置中断优先级分组

    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;           //TIM1中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //设置响应优先级0

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能通道1中断

    NVIC_Init(&NVIC_InitStructure); //初始化NVIC

    TIM_Cmd(TIM1, ENABLE);     //TIM1使能


}


u8 i=0;



int main(void)

{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    SystemCoreClockUpdate();

    Delay_Init();

#if (SDI_PRINT == SDI_PR_OPEN)

    SDI_Printf_Enable();

#else

    USART_Printf_Init(115200);

#endif

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


    TIM1_Int_Init(9,4799);    //1ms


    while(1)

    {

//        GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));

//        printf("--00--\r\n");

//        Delay_Ms(1);


    }


}




void TIM1_IRQHandler(void)    //1ms

{

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

      {

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

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

        GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));

      }

}


您好,你的中断函数名称写的有问题,更新中断按照下图标记这种写试一下

image.png


改了还是不行,程序卡死,只有上电打印,定时中断初始化完后就没了

image.png

void TIM1_Int_Init(u16 arr,u16 psc)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_30MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能TIM1时钟

    TIM_TimeBaseStructure.TIM_Period = arr;   //指定下次更新事件时要加载到活动自动重新加载寄存器中的周期值。

    TIM_TimeBaseStructure.TIM_Prescaler =psc; //指定用于划分TIM时钟的预分频器值。

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频因子

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式,向上计数模式

    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能TIM1中断,允许更新中断

    TIM_ClearITPendingBit(TIM1,TIM_IT_Update);


    //初始化TIM NVIC,设置中断优先级分组

    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;           //TIM1中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //设置响应优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能通道1中断

    NVIC_Init(&NVIC_InitStructure); //初始化NVIC

    TIM_Cmd(TIM1, ENABLE);     //TIM1使能

}


u8 i=0;

int main(void)

{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    SystemCoreClockUpdate();

    Delay_Init();

#if (SDI_PRINT == SDI_PR_OPEN)

    SDI_Printf_Enable();

#else

    USART_Printf_Init(115200);

#endif

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


    TIM1_Int_Init(9,4799);    //1ms

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

    while(1)

    {

//        GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));

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

        Delay_Ms(1000);

    }

}


void TIM1_UP_IRQHandler(void)    //1ms

{


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

      {

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

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

        GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));

      }

}



您好,附件例程可参考一下,这边测试没有问题的,可以检查一下你的程序修改后是否有加中断声明,可对照附件例程检查一下。

icon_rar.gifCH32V003 定时器1中断.zip



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