打印
[N32G45x]

G455的串口空闲中断+DMA的不定长收发

[复制链接]
3148|49
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 倚楼听风和雨 于 2023-4-27 16:35 编辑

     看N32G455的串口资料时,想起可以用DMA传输串口的数据;但是在DMA传输中需要先设定传输的数据长度,当串口接收或者发送的数据不是固定长度时,好像就不可以了。百度了一下关于不定长接收的例子,有看到ST的,不过没有找到国民的,在官方的BSP中也没有这个例程,最后,参考ST的不定长接收,移植了一个N32G455的不定长收发数据。上传到21ic,希望对大家有帮助,也方便下次自己能找到。   有写的不对的地方,希望有大神能提出修改。
原帖:https://blog.csdn.net/sudoeast/article/details/128022610

1.定义收发的数组和标志位等


2.初始化  
  这里我使用的是串口1和DMA1的通道4和5;串口用空闲中断,不用使能接收和发送中断
   





3.中断函数
     在接收数据之前最好能对两个接收数组做初始化,这样在把接收的数据再发送出来的时候,不会发送错误(比如第一次接收10Byte,第二次接收3Byte,可能会导致第二次再发出的数据是3Byte和第一次接收的10Byte后面几位)





4.测试
     使用串口助手给MCU发送数据,MCU接收到的数据重新发送出来,可以看到是匹配的。



UART+DMA.zip (1.15 MB)













使用特权

评论回复
评论
Xiuer66 2023-12-28 15:42 回复TA
老哥,我试了你的例程,但是烧录后发现串口只能发送一次,用串口第二次给455发数据时候串口就没有回传了 
沙发
zhouchen605768| | 2023-3-24 19:13 | 只看该作者
楼主分享下代码

使用特权

评论回复
板凳
牛牛ko| | 2023-3-27 22:48 | 只看该作者
楼主,为啥这个函数 USART_ClrFlag 第二个参数里没有 USART_FLAG_IDLEF 我看注释说的是软件自动清除空闲标志位,还有就是我在发数据的时候,发现它接受5、6次之后就不行了,DMA中断一直进,中断位好像清除不了

使用特权

评论回复
地板
vivilyly| | 2023-4-4 20:50 | 只看该作者
如何通过DMA实现不定长USART接收

使用特权

评论回复
5
macpherson| | 2023-4-4 21:44 | 只看该作者
跟stm32的代码差不多的 。              

使用特权

评论回复
6
七毛钱| | 2023-4-6 14:55 | 只看该作者
就是说stm32的代码和国民技术的基本上是一样的?

使用特权

评论回复
7
倚楼听风和雨|  楼主 | 2023-4-7 09:46 | 只看该作者
牛牛ko 发表于 2023-3-27 22:48
楼主,为啥这个函数 USART_ClrFlag 第二个参数里没有 USART_FLAG_IDLEF 我看注释说的是软件自动清除空闲标 ...

没有吗?上面我串口中断函数那里有调用呀

使用特权

评论回复
8
倚楼听风和雨|  楼主 | 2023-4-7 09:54 | 只看该作者
七毛钱 发表于 2023-4-6 14:55
就是说stm32的代码和国民技术的基本上是一样的?

是的。一些寄存器的名字不同吧,还有一些函数

使用特权

评论回复
9
倚楼听风和雨|  楼主 | 2023-4-7 09:55 | 只看该作者
vivilyly 发表于 2023-4-4 20:50
如何通过DMA实现不定长USART接收

上面就是呀。串口接收了不定长的数据,DMA把数据搬走,我这里会把数据再转给串口打印出来

使用特权

评论回复
10
倚楼听风和雨|  楼主 | 2023-4-7 09:56 | 只看该作者

其实上面已经很详细了

使用特权

评论回复
11
uytyu| | 2023-4-7 09:58 | 只看该作者
可以使用超时判断的 。              

使用特权

评论回复
12
earlmax| | 2023-4-7 10:08 | 只看该作者
dma使用idle中断的。              

使用特权

评论回复
13
minzisc| | 2023-4-7 23:43 | 只看该作者
有相关的例程可以参考的吗              

使用特权

评论回复
14
倚楼听风和雨|  楼主 | 2023-4-27 16:28 | 只看该作者
uytyu 发表于 2023-4-7 09:58
可以使用超时判断的 。

455串口没有接收超时中断,而且我觉得空闲中断更好用

使用特权

评论回复
15
lihuami| | 2023-5-7 10:39 | 只看该作者
用串口中断接收一帧数据,还是用DMA接收一帧数据,哪个效率

使用特权

评论回复
16
sdlls| | 2023-5-7 13:55 | 只看该作者
在使用该方式时,需要正确配置 DMA 控制器和串口的相关参数,以确保数据的正确传输和处理

使用特权

评论回复
17
gygp| | 2023-5-7 14:50 | 只看该作者
该方式利用串口的空闲中断机制,在数据传输结束后触发中断,通过 DMA 控制器将数据从串口缓冲区中读出或写入内存。

使用特权

评论回复
18
earlmax| | 2023-5-7 15:06 | 只看该作者
有串口空闲中断吗               

使用特权

评论回复
19
phoenixwhite| | 2023-5-7 15:33 | 只看该作者
由于 DMA 可以同时读写多个字节,因此可以实现不定长数据的收发,提高了效率和速度。

使用特权

评论回复
20
mattlincoln| | 2023-5-7 15:57 | 只看该作者
串口中断回调怎能延时               

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

23

帖子

1

粉丝