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

Cube下实现串口+DMA+空闲中断接收不定长数据  

[复制链接]
wjjontheway 提问时间:2015-7-30 16:38 /
阅读主题, 点击返回1楼
4 收藏 22 评论81 发布时间:2015-7-30 16:38
81个回答
June牛 回答时间:2017-4-5 15:17:25
谢谢!  真心对我很有用啊!
yygkqzh 回答时间:2017-5-3 20:51:46

多谢分享,学习了
zdx 回答时间:2017-5-24 16:45:37
Thanks!
lynnxie 回答时间:2017-5-28 23:00:52
非常感谢楼主的方法,非常好用
如果在一次性接收的数据包比较大,大于设定的DMA接收Buf,用空闲中断则会丢掉之前的一整帧,对吧,这个问题如何解决呢?
jazu 回答时间:2017-6-1 18:03:32
lynnxie 发表于 2017-5-28 23:00
非常感谢楼主的方法,非常好用
如果在一次性接收的数据包比较大,大于设定的DMA接收Buf,用空闲中断则会丢 ...

缓冲区要设置超过可能存在的最大数据包
星辰一方 回答时间:2017-6-1 18:32:26
空闲中断很有用,分享很赞!
张亚飞 回答时间:2017-6-1 18:43:04
对DMA的实时性好奇,以及中断优先级对DMA传输有没有影响,还有适用多大内存的片子
jtc_88 回答时间:2017-6-2 11:28:17
这个 需要配合 串口数据 收发 协议来,否则无法确认 到底接收多少数据。
                HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);
                __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断

                __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断

                HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
                HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断

void USART1_IRQHandler(void)
{
        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[3]) == (RX_DATA_NUM - 6))
        {
                Flag_RX = 1;
        }
       
        __HAL_UART_CLEAR_IT(&huart1, UART_CLEAR_IDLEF);
       
        __HAL_DMA_DISABLE(huart1.hdmarx);
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;
        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入
}
胡图图啊 回答时间:2017-8-23 09:47:50
救我一个发现了吗??接收的第二个数据覆盖不了第一个。也就是说第一次接收1234,第二次你发送12它还是显示1234.好气啊
dongchenyu163 回答时间:2017-11-14 11:50:28
很好的教程,支持一下楼主

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版