WCH沁恒单片机
直播中

半导体开发

9年用户 848经验值
擅长:可编程逻辑
私信 关注
[问答]

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在增加,就是不进中断
  
     


  
  

回帖(3)

刘双喜

2022-5-24 10:05:48
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);   //查询方式发送
这样增加几行就只能进一次中断,杠掉最后一行,闪灯恢复正常
举报

杜茂仁

2022-5-24 10:05:56
void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void SysTick_Handler(void)
{
    GPIOB->OUTDR^=1<<8;
仿照官方程序,中断这样写就对了,问题解决
管理员如果看到的话,说说道理
举报

刘璐

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

更多回帖

发帖
×
20
完善资料,
赚取积分