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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版