基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响

D:\GKOSON_BACK_GARDEN\ONENET\10086\STM32F103RET6
这个是MX做的麒麟座的工程
现在做成了空闲中断+TXRX的经典!---锁定空闲中断BUG

IAP是TOUCH的板子工程

现在做一个新的D:\GKOSON_BACK_GARDEN\ONENET\10086\STM32F103RET6
计划是空闲中断+DMA

直接全部文件夹拷贝
MX静静增加一个DMA 编译是可以直接OK的
对比看看
基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响_第1张图片

基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响_第2张图片

何时做IT??

基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响_第3张图片

 

基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响_第4张图片

 

基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响_第5张图片

 

基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响_第6张图片

上面就是区别!

目前工程 可以跑完全部流程 下载OTA完成

所以。。。

DMA可以顺手开 现在发现它没有影响!!!

 

开始修改

uint8_t GK_usart_init(GK_USARTBASE_TYPE *myuart,uint8_t usartid,uint8_t * buf)
{
	switch(usartid)//绑定关系
	{
        case 2:myuart->huart=&huart2;break;
		case 3:myuart->huart=&huart3;break;
		default :return 0;	
	}
	myuart->rxBuf=buf;
#if (USEDMA)
    HAL_UART_Receive_DMA(myuart->huart, myuart->rxBuf, 2048);//开启DMA接收放到BUF 所以rxBuf没有必要放在外面
#else	
    HAL_UART_Receive_IT(myuart->huart, &myuart->one, 1);//开启中断接收 1个1个的接收// 对应 下文
#endif
	__HAL_UART_ENABLE_IT(myuart->huart,UART_IT_IDLE);//开启空闲中断
	__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);
	return 1;
}

这里很好理解 之前是一个一个 现在是一起的 


#if (USEDMA)
void GK_UART_RxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
 	uint32_t temp;

    if((__HAL_UART_GET_FLAG(myuart->huart,UART_FLAG_IDLE)))
    { 
        __HAL_UART_CLEAR_IDLEFLAG(myuart->huart);
        HAL_UART_DMAStop(myuart->huart);
        temp = myuart->huart->hdmarx->Instance->CNDTR;
        myuart->rx_len =  2048 - temp; 
        myuart->received2idle=1;//拉起
        HAL_UART_Receive_DMA(myuart->huart, myuart->rxBuf, 2048);//再次启动DMA接收啦 所以我DMA不是循环模式而是普通模式
    }

}
#else
//需要自己放在IT
void GK_UART_RxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
	if(__HAL_UART_GET_FLAG(myuart->huart,UART_FLAG_IDLE))
	{
		__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);
        if(flag==0)
		myuart->received2idle=1;
        else
        {
            printf("#######COM1####\r\n");
            if(myuart->rx_len >1024)
            myuart->received2idle=1;
        }
	}
}

这里是空闲中断来的时候的处理 就是len的处理有点不太同 最开始是:

void UsartReceive_IDLE(UART_HandleTypeDef *huart)
{
     uint32_t temp;
    if(huart->Instance==USART1)
    {
        if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
        { 
            __HAL_UART_CLEAR_IDLEFLAG(&huart1);
            HAL_UART_DMAStop(&huart1);
            temp = huart1.hdmarx->Instance->CNDTR;
            UsartType1.rx_len =  RECEIVELEN - temp; 
            UsartType1.receive_flag=1;//拉起
            HAL_UART_Receive_DMA(&huart1,UsartType1.usartDMA_rxBuf,RECEIVELEN);//再次启动DMA接收啦 所以我DMA不是循环模式而是普通模式
        }
    }

 

此时别的不用修改 直接跑工程 看到8266init是可以的

到了OTA环节不行 空闲中断17个字节就来了 问题更大!!!不适合大数据

你可能感兴趣的:(基于麒麟座继续串口--DMA可以顺手开启-它是ADD不影响)