专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
关于STM32F767DMA串口接收不定长数据的问题
2019-07-20 00:52
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
21273
14
941
各位大佬,我看着
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 元偷偷看……
加载中...
1
2
3
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
问题解决了,STM32HAL库就是坑爹,还是寄存器大法好。
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);
}
还有调试时准确进入中断,但数组为0,推测为上面的哪个启动失败了
有人吗
一周热门 更多>