你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

CubeMX 串口空闲中断 DMA 串口数据收发

[复制链接]
与龙共舞 提问时间:2018-4-25 16:23 /
用DMA的方式,原封不动的把PC通过串口发送过来的数据,在串口返回给PC。
附件有CubeMX 原始的代码0
已经修改以后可以完成效果的代码1
方便用比较工具看出我的修改吧。
实际效果是:PC快速给STM32发送数据时候,会丢失数据。
昨天开会,强哥说不用DMA,因为CubeMX 有bug。不明所以。

图片是整个实验的逻辑。
逻辑.png
第一部分:串口通信--直接发送 输出
技术代码:
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,       1, 0xFFFF);//3
HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//4
第二部分:串口通信--接收数据  原封不动输出
技术代码:
HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, sizeof(aRxBuffer));//5
HAL_UART_Receive_IT(&huart1,  (uint8_t *)aRxBuffer, 10);//6
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
          HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer,       1,0xFFFF);
          HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer,     1);
}

第三部分:串口通信--DAM处理原封不动输出
http://blog.csdn.net/youmeichifan/article/details/51750435
思路PC---->发消息到串口it.c处理---》设置了标记位在main死循环处理--》直接发送回来-->发送完成
main.c>>>>>>>>>>
if(UsartType1.receive_flag)
{  
        UsartType1.receive_flag=0;/*Ǩ³ö±ê¼Ç*/
        Usart1SendData_DMA(UsartType1.usartDMA_rxBuf,UsartType1.rx_len); /*send*/
}

main.c>>>>>>>>>>       
HAL_UART_Receive_DMA(&huart1, UsartType1.usartDMA_rxBuf, RECEIVELEN);  /*ʹÄÜDMA½ÓÊÕ*/
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);  /*ʹÄÜ´®¿Ú¿ÕÏÐÖжÏ*/
it.c>>>>>>>>>>>>>
void USART1_IRQHandler(void)  
{   
  UsartReceive_IDLE(&huart1);  
  HAL_UART_IRQHandler(&huart1);  
}

usart.c>>>>>>>>
USART_RECEIVETYPE UsartType1;

//DMA发送函数  
void Usart1SendData_DMA(uint8_t *pdata, uint16_t Length)  
{  
    while(UsartType1.dmaSend_flag == USART_DMA_SENDING);  
    UsartType1.dmaSend_flag = USART_DMA_SENDING;  
    HAL_UART_Transmit_DMA(&huart1, pdata, Length);  
}  

//DMA发送完成中断回调函数  
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  
{  
     __HAL_DMA_DISABLE(huart->hdmatx);  
    UsartType1.dmaSend_flag = USART_DMA_SENDOVER;  
}  

//串口接收空闲中断  
void UsartReceive_IDLE(UART_HandleTypeDef *huart)  
{  
    uint32_t temp;  

    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  
    {   
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);  
        HAL_UART_DMAStop(&huart1);  
        temp = huart1.hdmarx->Instance->NDTR;  
        UsartType1.rx_len =  RECEIVELEN - temp;   
        UsartType1.receive_flag=1;  
        HAL_UART_Receive_DMA(&huart1,UsartType1.usartDMA_rxBuf,RECEIVELEN);  
    }  
}

usart.c>>>>>>>>
USART_RECEIVETYPE UsartType1;  



usart.h>>>>>>>>  
#define RECEIVELEN 1024  
#define USART_DMA_SENDING  1//发送未完成  
#define USART_DMA_SENDOVER 0//发送完成  
typedef struct  
{  
uint8_t receive_flag:1;//空闲接收标记  
uint8_t dmaSend_flag:1;//发送完成标记  
uint16_t rx_len;//接收长度  
uint8_t usartDMA_rxBuf[RECEIVELEN];//DMA接收缓存  
}USART_RECEIVETYPE;  


extern USART_RECEIVETYPE UsartType1;



0.zip

下载

8.95 MB, 下载次数: 7, 下载积分: ST金币 -1

1.zip

下载

8.95 MB, 下载次数: 12, 下载积分: ST金币 -1

评分

参与人数 1 ST金币 +1 收起 理由
linchihhai + 1 很给力!

查看全部评分

收藏 评论3 发布时间:2018-4-25 16:23

举报

3个回答
waiman-156411 回答时间:2018-4-26 11:15:40
其实是用CubeMx的DMA代码可以的,只是数据量大了,就会溢出

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

板子粉丝 回答时间:2018-4-26 11:20:59
路过看看
Cortexxx 回答时间:2018-4-26 14:21:58
CubeMX编译的时间太长了~~  

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版