RT-THREAD,CH32V208W串口接收DMA中断一直出现HARDFAULT

代码是社区里面找的类似拷贝过来的,看着没毛病的样子,

接收几次之后,就出现HARDFAULT

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

void USART2_IRQHandler(void)

{

   uint16_t Count = 0;

   if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //中断产生

   {

       USART_ClearITPendingBit(USART2,USART_IT_RXNE);

   }

   if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)

   {

       USART2->STATR;

       USART2->DATAR;

       rx_int_flag2 = 1;

       /* 获取剩余 DMA缓存大小 */

       Count = DMA_GetCurrDataCounter(DMA1_Channel6);

       //本帧数据长度 = DMA缓存的大小 - 剩余 DMA缓存大小

       rx_recvLen2 = 1024 - Count;

       /* DMA接收复位 */

       DMA_Cmd(DMA1_Channel6,DISABLE);

       DMA_SetCurrDataCounter(DMA1_Channel6,1024);

       DMA_Cmd(DMA1_Channel6,ENABLE);

   }

}

/* 线程2入口 */

static void thread2_entry(void *param)

{

    uint16_t len = 0;

    rt_kprintf("%s22\r\n",__func__);


    for(;;)

    {

        if(rx_int_flag2)

        {

            rx_int_flag2 = 0;

            rt_kprintf("receiveLen = %d\r\n",len);

        }

        rt_thread_mdelay(2);

    }

}


你好,208是V4C内核,在跑rtt的时候,只能用软件压栈,启动文件中关闭软件压栈,并设置为机器模式,函数声明改为软件压栈。

image.png

image.png


改成这样好像就不会出现HARDFAULT,不知道这样有没有问题;

用调试工具自动发送测试了几分钟好像都没HARDFAULT

void USART2_IRQHandler(void) __attribute__((interrupt()));

void USART2_IRQHandler(void)

{

    u16 count = 0;

    GET_INT_SP();

    /* enter interrupt */

    rt_interrupt_enter();

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)

    {

        USART_ClearITPendingBit(USART2, USART_IT_RXNE);

    }

    if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)

    {

        //CLEAR IDLE IT FLAG

        USART2->STATR;

        USART2->DATAR;


        count = DMA_GetCurrDataCounter(OMG_USART2_DMA);

//        rt_kprintf("count= %d\r\n",count);

        rx_recvLen2 = OMG_DMA_LEN - count;

        rx_int_flag2 = 1;

        DMA_Cmd(OMG_USART2_DMA, DISABLE);

        DMA_SetCurrDataCounter(OMG_USART2_DMA, OMG_DMA_LEN);

        DMA_Cmd(OMG_USART2_DMA, ENABLE);

    }


    /* leave interrupt */

    rt_interrupt_leave();


    FREE_INT_SP();

}



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