如何 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);
}