CH32V103 systick中断只能进一次,怎么破?

初始化

    SysTick->CNTL0 =0;

    SysTick->CNTL1 =0;

    SysTick->CNTL2 =0;

    SysTick->CNTL3 =0;

    SysTick->CNTH0 =0;

    SysTick->CNTH1 =0;

    SysTick->CNTH2 =0;

    SysTick->CNTH3 =0;


    i=FSYS/8/4;


    SysTick->CMPLR0 = (u8)(i & 0xFF);

    SysTick->CMPLR1 = (u8)(i >> 8);

    SysTick->CMPLR2 = (u8)(i >> 16);

    SysTick->CMPLR3 = (u8)(i >> 24);

    SysTick->CMPHR0 =0;

    SysTick->CMPHR1 =0;

    SysTick->CMPHR2 =0;

    SysTick->CMPHR3 =0;

    SysTick->CTLR=1;

   NVIC_EnableIRQ(SysTicK_IRQn);


中断程序翻PB8闪灯:

    GPIOB->OUTDR^=1<<8;

    SysTick->CNTL0 =0;

    SysTick->CNTL1 =0;

    SysTick->CNTL2 =0;

    SysTick->CNTL3 =0;

    SysTick->CNTH0 =0;

    SysTick->CNTH1 =0;

    SysTick->CNTH2 =0;

    SysTick->CNTH3 =0;

单独这样跑没有问题,

随便增加USART1发送一字节,就不闪了,CPU没有死,读systick值,CNT在增加,就是不进中断

    GPIOB->CFGHR=0x44444442;

    USART1->BRR=FSYS/115200;

    USART1->CTLR1=1<<13|3<<2;

    GPIOA->BSHR=1<<10;         //IO置位

    GPIOA->CFGHR=0x44444894;   //PA9 PA10 AFR

    Usart1SendByte(0x55);   //查询方式发送

这样增加几行就只能进一次中断,杠掉最后一行,闪灯恢复正常



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

void SysTick_Handler(void)

{

    GPIOB->OUTDR^=1<<8;

仿照官方程序,中断这样写就对了,问题解决

管理员如果看到的话,说说道理


您好,关于中断声明函数:void XXXX_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")))函数,其用于保证中断执行完成之后程序正常运行。若不添加此函数,中断执行完成之后,中断执行之前保存的信息将不会被返回,中断会被认为一个正常程序继续执行下去,但中断之后并没有程序,从而导致程序出现类似跑飞状况。添加此函数,中断执行完成之后,中断执行之前保存的信息将会被返回,从而程序可以继续正常执行,如图所示。

105742fd6tdfftcd6ftflq.png.thumb.jpg


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