OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6301|回复: 15

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

[复制链接]

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
发表于 2017-7-4 20:03:13 | 显示全部楼层 |阅读模式
2金钱
各位大佬,我看着http://www.openedv.com/forum.php ... 7&highlight=DMA这个帖子写关于STM32F767DMA串口接收不定长数据,DMA发送可以了,但是DMA接收死活不行,求大佬看看
目前的情况是DMA发送可以用,DMA接收也进了空闲中断,但数据对不上(如图),还有不要说我没开DMA接收,开了以后连DMA发送都用不了,这是正常现象吗?????@正点原子 @Silmeria
有谁有解决办法
QQ截图20170704200047.png

USART.zip

10.33 MB, 下载次数: 638

最佳答案

查看完整内容[请看2#楼]

问题解决了,STM32HAL库就是坑爹,还是寄存器大法好。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-7-4 20:03:14 | 显示全部楼层

问题解决了,STM32HAL库就是坑爹,还是寄存器大法好。
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-7-4 20:06:35 | 显示全部楼层
#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\r\n%s\r\n",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);

}
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-7-4 20:23:49 | 显示全部楼层
有人吗
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-7-4 21:44:56 | 显示全部楼层
调试时说执行HAL_UART_Receive_DMA(&usart1_handler,USART1_RX_BUF,USART1_RX_BUF_SIZE);       时USART1的RX 为BUSY,开不了,为什么????
还有调试时准确进入中断,但数组为0,推测为上面的哪个启动失败了
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-7-5 14:35:04 | 显示全部楼层
现在可以收一次数据,但是第二次的时候数据个数是对的,但数据内容还是第一次的
有人吗

USART.zip

10.33 MB, 下载次数: 617

回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-7-5 16:32:20 | 显示全部楼层
没有人吗
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-7-5 22:14:02 | 显示全部楼层
有人吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-7-23
在线时间
0 小时
发表于 2017-7-23 13:46:40 | 显示全部楼层
问题解决了吗?参考http://www.openedv.com/forum.php ... 7&highlight=DMA
可能对你有帮助
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-7-28
在线时间
0 小时
发表于 2017-7-28 17:53:37 来自手机 | 显示全部楼层
亲,我也遇到你六楼提出的问题!解决了吗?貌似只要是读取dma 接收的缓存区,dma 就没办法把新的数据更新进来!
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
629
金钱
629
注册时间
2016-2-5
在线时间
100 小时
 楼主| 发表于 2017-8-8 10:56:18 | 显示全部楼层
Noahark 发表于 2017-7-28 17:53
亲,我也遇到你六楼提出的问题!解决了吗?貌似只要是读取dma 接收的缓存区,dma 就没办法把新的数据更新进 ...

是的,我用寄存器先把CR清0,然后重新初始化
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-2-25
在线时间
9 小时
发表于 2018-4-9 10:29:18 | 显示全部楼层
能把调试好的这个收发小demo重新上传一遍吗?1楼提供的还是之前有问题的。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2018-11-10
在线时间
2 小时
发表于 2018-11-10 16:10:16 | 显示全部楼层
楼主可以可以分享一下这个Demo吗
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-7-10
在线时间
9 小时
发表于 2018-11-30 09:55:07 | 显示全部楼层
Noahark 发表于 2017-7-28 17:53
**** 作者被禁止或删除 内容自动屏蔽 ****

我也遇到了这个问题
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-7-8
在线时间
2 小时
发表于 2019-7-9 14:19:34 | 显示全部楼层
哈哈哈哈 发表于 2017-8-8 10:56
是的,我用寄存器先把CR清0,然后重新初始化

楼主,将调好的程序共享下,谢谢
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-5-5
在线时间
19 小时
发表于 2019-8-12 21:03:00 | 显示全部楼层
哈哈哈哈 发表于 2017-7-4 20:03
问题解决了,STM32HAL库就是坑爹,还是寄存器大法好。

您好   能看一下您的程序?   我想实现DMA接收程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 00:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表