如何 CH32V103運行freertos。在串口1使用DMA方式發(fā)送接收,當(dāng)DMA發(fā)送完成之后,設(shè)置事件標(biāo)記。并在任務(wù)中等待事件并亮燈顯示。串口空閑中斷為上位機下發(fā)數(shù)據(jù),接收到數(shù)據(jù)之后設(shè)置事件標(biāo)記并亮燈指示。剛開始運行都是正常的,但過個十來分鐘就會停止工作。不知是何原因? 懷疑是中斷優(yōu)先級引起。 參考STM32移植freertos 有以下一些宏定義??configMAX_PRIORITIES。
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY。
?LIBRARY_LOWEST_INTERRUPT_PRIORITY? ?這些宏定義跟中斷功能相關(guān)。但是在32V103范例中只找到了configMAX_PRIORITIES。另外一些相關(guān)的宏定義怎么設(shè)置?
部分代碼如下:完整的測試工程在附件。
DMA_4發(fā)送完成中斷 設(shè)置MBTXEND_EVENT
void DMA1_Channel4_IRQHandler(void)
{
? ?BaseType_t xHigherPriorityTaskWoken = pdFALSE;
? ? if(DMA_GetITStatus(DMA1_IT_TC4))
? ? {
? ? ? ? DMA_ClearITPendingBit(DMA1_IT_GL4); //清除全部中斷標(biāo)志
? ? ? ? DMA_Cmd(DMA1_Channel4, DISABLE); //關(guān)閉數(shù)據(jù)輸出通道
? ? ? ? if(MBSend_Event_Handle != NULL)
? ? ? ? ?{
? ? ? ? ? ? ?xEventGroupSetBitsFromISR(MBSend_Event_Handle,MBTXEND_EVENT,&xHigherPriorityTaskWoken);
? ? ? ? ?}
? ? }
? ? if(xHigherPriorityTaskWoken == pdTRUE)
? ? ? ? portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
//串口空閑中斷設(shè)置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); //關(guān)閉數(shù)據(jù)輸出通道
? ? //}
? ? 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);
}