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

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

[复制链接]
wjjontheway 提问时间:2015-7-30 16:38 /
阅读主题, 点击返回1楼
4 收藏 22 评论81 发布时间:2015-7-30 16:38
81个回答
星辰一方 回答时间: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
很好的教程,支持一下楼主
me浩 回答时间:2017-11-29 14:47:28
很好很强大啊
一叶清风 回答时间:2018-1-5 12:57:22
谢谢分享
ZCShou 回答时间:2018-1-22 08:49:47
本帖最后由 zcshou 于 2018-1-22 09:59 编辑
胡图图啊 发表于 2017-8-23 09:47
救我一个发现了吗??接收的第二个数据覆盖不了第一个。也就是说第一次接收1234,第二次你发送12它还是显示 ...


你把 HAL_UART_DMAStop(huart); 一句去掉就应该没事了!具体见手册

Once the transfer has completed, this register can either stay at zero (when the stream is in
normal mode) or be reloaded automatically with the previously programmed value in the
following cases:
– when the stream is configured in Circular mode.
– when the stream is enabled again by setting EN bit to '1'
If the value of this register is zero, no transaction can be served even if the stream is
enabled.

再一点HAL_UART_DMAStop会把 发送和接收都给停止,这就 导致 异步传输没有意义了。。



kfork 回答时间:2018-2-3 17:09:28
找资料翻了好久,下载一个试下
moneng 回答时间:2018-2-6 11:11:47
谢谢楼主分享!
kylongmu 回答时间:2018-4-9 14:02:28
本帖最后由 kylongmu 于 2018-4-9 14:12 编辑

我觉得大家把这个路走歪了点,
__HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断

这里如果将DMA配置成一锤子买卖,肯定会丢东西。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
不如将DMA配置成Circular模式,不要停止DMA,另外开启
“传输一半、全部完成” 中断,然后把DMA缓冲区当作乒乓结构来用,当“传输一半”中断时处理前半部分数据,当“全部完成”中断时处理后半部分数据。处理方法:依据上次读指针读出到当前点数据至一个缓冲区,并更新读指针。

那么在“空闲中断”时,依据上次读指针读出到当前点数据,追加写入缓冲区,并将缓冲区数据整体复制为未处理数据包(带有效数据长度),然后更新缓冲区写入指针至头部。

这样就能解决DMA缓冲区必须设置为很大的问题,还能解决关闭DMA造成数据丢失的问题,仅是维护一个读DMA缓冲区指针(这个指针与Circula模式一样无限循环)+一个写缓冲区指针(每次拷贝数据后复位)。

DMA缓冲区可以设置为256字节,这样缓冲区读指针可以采用基地址+一个UINT8偏移实现,UINT8自动溢出循环256。
Ziv.Lin 回答时间:2018-4-27 01:13:16
学习一下,谢谢楼主
linewin 回答时间:2018-5-4 13:52:19
多谢分享
karzn 回答时间:2018-5-14 08:39:09
谢谢分享!!
longfei456 回答时间:2018-6-19 13:19:31
非常感谢!!!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版