CH32V103C8运行freertos。运行事件函数后,一开始是正常,过段时间任务就会一直不会再运行。

如何 CH32V103运行freertos。在串口1使用DMA方式发送接收,当DMA发送完成之后,设置事件标记。并在任务中等待事件并亮灯显示。串口空闲中断为上位机下发数据,接收到数据之后设置事件标记并亮灯指示。刚开始运行都是正常的,但过个十来分钟就会停止工作。不知是何原因? 怀疑是中断优先级引起。 参考STM32移植freertos 有以下一些宏定义  configMAX_PRIORITIES。

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY。

 LIBRARY_LOWEST_INTERRUPT_PRIORITY   这些宏定义跟中断功能相关。但是在32V103范例中只找到了configMAX_PRIORITIES。另外一些相关的宏定义怎么设置?

部分代码如下:完整的测试工程在附件。

DMA_4发送完成中断 设置MBTXEND_EVENT

void DMA1_Channel4_IRQHandler(void)

{

   BaseType_t xHigherPriorityTaskWoken = pdFALSE;


    if(DMA_GetITStatus(DMA1_IT_TC4))

    {

        DMA_ClearITPendingBit(DMA1_IT_GL4); //清除全部中断标志

        DMA_Cmd(DMA1_Channel4, DISABLE); //关闭数据输出通道



        if(MBSend_Event_Handle != NULL)

         {

             xEventGroupSetBitsFromISR(MBSend_Event_Handle,MBTXEND_EVENT,&xHigherPriorityTaskWoken);

         }

    }

    if(xHigherPriorityTaskWoken == pdTRUE)

        portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

}


//串口空闲中断设置MBTXEND_EVENT事件

void USART1_IRQHandler(void)

{

    BaseType_t xHigherPriorityTaskWoken = pdFALSE;


    u32 temp;


    (void)temp;


    //if(USART_GetITStatus(USART1,USART_IT_TC)!= RESET)

    // {

    //    if(MBSend_Event_Handle != NULL)

    //     {

    //         xEventGroupSetBitsFromISR(MBSend_Event_Handle,MBTXEND_EVENT,&xHigherPriorityTaskWoken);

    //     }


    //    USART_ClearITPendingBit(USART1,USART_IT_TC);

    //    DMA_Cmd(DMA1_Channel4, DISABLE); //关闭数据输出通道

    //}


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

    {

         if(MBSend_Event_Handle != NULL)

          {

             xEventGroupSetBitsFromISR(MBSend_Event_Handle,MBRX_EVENT,&xHigherPriorityTaskWoken);

          }


        temp = USART1->STATR; //软件序列清除IDLE位

        temp = USART1->DATAR; //先读USART_SR,然后读USART_DR


        USART_ClearITPendingBit(USART1,USART_IT_IDLE);

        DMA_Cmd(DMA1_Channel5, DISABLE);

        DMA_ClearFlag(DMA1_FLAG_TC5);

       // mbHost.rxCounter = USART1_RX_MAX - DMA_GetCurrDataCounter(DMA1_Channel5);

       // memcpy(mbHost.rxBuf, Uart1_Rx_Buffer, mbHost.rxCounter);

        DMA_SetCurrDataCounter(DMA1_Channel5, sizeof(Uart1_Rx_Buffer));

        DMA_Cmd(DMA1_Channel5 , ENABLE);

    }

    if (xHigherPriorityTaskWoken == pdTRUE)

         portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

}


icon_rar.gifprj_HMI_Master1230.zip


您好,V103的中断嵌套只有2级,所以优先级分组为1即可,且中断的抢占优先级分配为0或1而不是7,另外,定义的外设结构体最好先清零。至于您说的configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY, 目前并没有该宏定义,不知下图中PFIC中断优先级阈值配置寄存器可否满足您的需求,后续可以邮箱联系一下:kx@wch.cn

image.png

image.png






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