关于STM32F767DMA串口接收不定长数据的问题

2019-07-20 00:52发布

各位大佬,我看着http://www.openedv.com/forum.php ... 7&highlight=DMA这个帖子写关于STM32F767DMA串口接收不定长数据,DMA发送可以了,但是DMA接收死活不行,求大佬看看
目前的情况是DMA发送可以用,DMA接收也进了空闲中断,但数据对不上(如图),还有不要说我没开DMA接收,开了以后连DMA发送都用不了,这是正常现象吗?????@正点原子 @Silmeria
有谁有解决办法
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
哈哈哈哈
1楼-- · 2019-07-20 02:30

问题解决了,STM32HAL库就是坑爹,还是寄存器大法好。
哈哈哈哈
2楼-- · 2019-07-20 03:08
#include "USART1.H"

u16 USART1_RX_COUNT;                                                                //DMA½óêÕ¼Æêy
u8 USART1_TX_BUF[USART1_TX_BUF_SIZE];                                //·¢Ëíêy×é
u8 USART1_RX_BUF[USART1_RX_BUF_SIZE];                                //½óêÕêy×é
UART_HandleTypeDef usart1_handler;                                         //USART1¾ä±ú
DMA_HandleTypeDef  usart1_tx_dma_handler;                        //USART1DMA·¢Ëí¾ä±ú
DMA_HandleTypeDef  usart1_rx_dma_handler;                        //USART1DMA½óêÕ¾ä±ú       



#pragma import(__use_no_semihosting)            
//±ê×¼¿aDèòaμÄÖ§3Öoˉêy   
struct __FILE
{
        int handle;
};

FILE __stdout;      

//¶¨òå_sys_exit()òÔ±üÃaê1óðëÖ÷»úģ꽠  
void _sys_exit(int x)
{
        x = x;
}
//Öض¨òåfputcoˉêy
int fputc(int ch, FILE *f)
{        
        while((USART1->ISR&0X40)==0);                                        //Ñ-»··¢Ëí,Ö±μ½·¢Ëííê±Ï   
        USART1->TDR=(u8)ch;      
        return ch;
}

void usart1_init(u32 bound)
{       
        //IO3õê¼»ˉ
        {
                GPIO_InitTypeDef GPIO_init;                                        //GPIO¾ä±ú
               
                __HAL_RCC_GPIOA_CLK_ENABLE();                                //ê1ÄüGPIOAê±Öó
               
                GPIO_init.Pin=GPIO_PIN_9|GPIO_PIN_10;                //PA9
                GPIO_init.Mode=GPIO_MODE_AF_PP;                                //¸′óÃíÆíìêä3ö
                GPIO_init.Pull=GPIO_PULLUP;                                        //éÏà-
                GPIO_init.Speed=GPIO_SPEED_FAST;                        //¸ßËù
                GPIO_init.Alternate=GPIO_AF7_USART1;                //¸′óÃÎaUSART1
                HAL_GPIO_Init(GPIOA,&GPIO_init);                           //3õê¼»ˉPA9
               
        }
        //UART 3õê¼»ˉéèÖÃ
        {
                __HAL_RCC_USART1_CLK_ENABLE();                                //ê1ÄüUSART1ê±Öó
               
                usart1_handler.Instance=USART1;                                //USART1          
                usart1_handler.Init.BaudRate=bound;                        //2¨ìØÂê
                usart1_handler.Init.WordLength=UART_WORDLENGTH_8B;        //8λêy¾Y  
                usart1_handler.Init.StopBits=UART_STOPBITS_1;                //1λí£Ö1
                usart1_handler.Init.Parity=UART_PARITY_NONE;                //2»D£Ñé
                usart1_handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;  //ó2¼tá÷¿ØÖÆ1Ø
                usart1_handler.Init.Mode=UART_MODE_TX_RX;        //·¢Ëí½óêÕÄ£ê½
                HAL_UART_Init(&usart1_handler);                                //3õê¼»ˉ
          
                HAL_NVIC_EnableIRQ(USART1_IRQn);
                HAL_NVIC_SetPriority(USART1_IRQn, 3, 1);        //½óêÕÖD¶Ï
                __HAL_UART_ENABLE_IT(&usart1_handler,UART_IT_IDLE);
                HAL_UART_Receive_IT(&usart1_handler, USART1_RX_BUF, USART1_RX_BUF_SIZE);//¸Ãoˉêy»á¿aÆô½óêÕÖD¶Ï£o±ê־λUART_IT_RXNE£¬2¢ÇòéèÖýóêÕ»o3åòÔ¼°½óêÕ»o3å½óêÕ×î′óêy¾Yá¿
        }
        //DMAÅäÖÃ
        {
                __HAL_RCC_DMA2_CLK_ENABLE();//DMA2ê±Öóê1Äü       
                HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 3, 1);
        HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
                //Tx DMAÅäÖÃ
                {
                        __HAL_LINKDMA(&usart1_handler,hdmatx,usart1_tx_dma_handler);    //½«DMAóëUSART1áaÏμÆeà′(·¢ËíDMA)
                        usart1_tx_dma_handler.Instance=DMA2_Stream7;                            //êy¾Yá÷Ñ¡Ôñ
                        usart1_tx_dma_handler.Init.Channel=DMA_CHANNEL_4;                                //í¨μàÑ¡Ôñ
                        usart1_tx_dma_handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //′æ′¢Æ÷μ½íaéè
                        usart1_tx_dma_handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //íaéè·ÇÔöá¿Ä£ê½
                        usart1_tx_dma_handler.Init.MemInc=DMA_MINC_ENABLE;                     //′æ′¢Æ÷Ôöá¿Ä£ê½
                        usart1_tx_dma_handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //íaéèêy¾Y3¤¶è:8λ
                        usart1_tx_dma_handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //′æ′¢Æ÷êy¾Y3¤¶è:8λ
                        usart1_tx_dma_handler.Init.Mode=DMA_NORMAL;                            //íaéèá÷¿ØÄ£ê½
                        usart1_tx_dma_handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //ÖDμèóÅÏ輶
                        usart1_tx_dma_handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
                        usart1_tx_dma_handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
                        usart1_tx_dma_handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //′æ′¢Æ÷í»·¢μ¥′Î′«êä
                        usart1_tx_dma_handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //íaéèí»·¢μ¥′Î′«êä
                        HAL_DMA_DeInit(&usart1_tx_dma_handler);   
                        HAL_DMA_Init(&usart1_tx_dma_handler);
                }
                //Rx DMAÅäÖÃ
                {
                        __HAL_LINKDMA(&usart1_handler,hdmarx,usart1_rx_dma_handler);    //½«DMAóëUSART1áaÏμÆeà′(½óêÕDMA)
                       
                        usart1_rx_dma_handler.Instance = DMA2_Stream2;
                        usart1_rx_dma_handler.Init.Channel = DMA_CHANNEL_4;
                        usart1_rx_dma_handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
                        usart1_rx_dma_handler.Init.PeriphInc = DMA_PINC_DISABLE;
                        usart1_rx_dma_handler.Init.MemInc = DMA_MINC_ENABLE;
                        usart1_rx_dma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
                        usart1_rx_dma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
                        usart1_rx_dma_handler.Init.Mode = DMA_NORMAL;
                        usart1_rx_dma_handler.Init.Priority = DMA_PRIORITY_VERY_HIGH;
                        usart1_rx_dma_handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
                       
                       
                        HAL_DMA_Init(&usart1_rx_dma_handler);
                        HAL_DMA_DeInit(&usart1_rx_dma_handler);
                       
                }
        }
}
void USART1_IRQHandler(void)
{
        if((__HAL_UART_GET_FLAG(&usart1_handler,UART_FLAG_IDLE)!=RESET))
        {                                    
                HAL_UART_DMAStop(&usart1_handler);                                                                                                                     
                USART1_RX_COUNT=USART1_RX_BUF_SIZE-(__HAL_DMA_GET_COUNTER(&usart1_rx_dma_handler));      
                printf("the data has been transferred is %d %s ",USART1_RX_COUNT,USART1_RX_BUF);                                       
                HAL_UART_Receive_DMA(&usart1_handler,USART1_RX_BUF,USART1_RX_BUF_SIZE);                                                
                __HAL_UART_CLEAR_IT(&usart1_handler,UART_FLAG_IDLE);                                                                        
                HAL_UART_IRQHandler(&usart1_handler);      
                //HAL_UART_Transmit_DMA(&usart1_handler,USART1_RX_BUF,USART1_RX_BUF_SIZE);//Æô¶ˉ½óêÕ
        }
}

void DMA2_Stream2_IRQHandler(void){

  HAL_DMA_IRQHandler(&usart1_rx_dma_handler);

}
哈哈哈哈
3楼-- · 2019-07-20 05:36
 精彩回答 2  元偷偷看……
哈哈哈哈
4楼-- · 2019-07-20 07:18
调试时说执行HAL_UART_Receive_DMA(&usart1_handler,USART1_RX_BUF,USART1_RX_BUF_SIZE);       时USART1的RX 为BUSY,开不了,为什么????
还有调试时准确进入中断,但数组为0,推测为上面的哪个启动失败了
哈哈哈哈
5楼-- · 2019-07-20 09:04
现在可以收一次数据,但是第二次的时候数据个数是对的,但数据内容还是第一次的
有人吗
哈哈哈哈
6楼-- · 2019-07-20 11:59
 精彩回答 2  元偷偷看……

一周热门 更多>