硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8650|回复: 31
收起左侧

[客户分享] 基于STM32F4的模拟串口实现,采用TIM+DMA方案,支持任意GPIO设置

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
发表于 2020-2-24 17:18:32 | 显示全部楼层 |阅读模式
ST官网地址:链接
文档说明: en.DM00110292.pdf (496.49 KB, 下载次数: 325)
软件包: en.stsw-stm32156.zip (36.87 MB, 下载次数: 2232)

由于串口不够用,或者硬件串口5bit,6bit,7bit等数据格式时,此方案比较实用。

全双工,异步串口,数据位支持5-9bit,最高115200bps

1.png
1.png

评分

参与人数 1金币 +20 收起 理由
小狐狸 + 20 很给力!

查看全部评分

回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-2-24 18:31:27 | 显示全部楼层
感谢分享
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-2-25 09:01:57 | 显示全部楼层
H7的话,支持的更多一些

QQ图片20200225090152.png
回复

使用道具 举报

5

主题

201

回帖

216

积分

高级会员

积分
216
发表于 2020-2-25 10:05:02 | 显示全部楼层
这个不错啊!之前有个项目想用8个串口的,但是STM32没有这么多,就变更了项目需求,减少了串口使用。之前的模拟串口都是波特率比较低不想用。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-2-25 10:07:59 | 显示全部楼层
STM32F407VET6芯片平台下测试,软件模拟的UART,TX基本没有什么问题,RX还是不行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-2-25 12:01:48 | 显示全部楼层
yklstudent 发表于 2020-2-25 10:07
STM32F407VET6芯片平台下测试,软件模拟的UART,TX基本没有什么问题,RX还是不行

我在我们V5板子上面测试了下,第1次接收和发送好用,但是后续就不行了,会出错。

你那个是不是忘了加上引脚的EXTI中断服务程序了。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-2-25 13:19:38 | 显示全部楼层
eric2013 发表于 2020-2-25 12:01
我在我们V5板子上面测试了下,第1次接收和发送好用,但是后续就不行了,会出错。

你那个是不是忘了加 ...

嗯,测试结果跟你差不多
第一次可以,后续直接不行
感觉不靠谱
回复

使用道具 举报

5

主题

201

回帖

216

积分

高级会员

积分
216
发表于 2020-2-25 14:45:11 | 显示全部楼层
那还是不行啊!官方发布的也有这么重大的bug
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-2-26 00:23:49 | 显示全部楼层
honami520 发表于 2020-2-25 14:45
那还是不行啊!官方发布的也有这么重大的bug

如果没有测试错的话,的确是不太好用,后面了我再看下他们的文档研究下,看看是不是哪里配置错了。
回复

使用道具 举报

8

主题

135

回帖

159

积分

初级会员

积分
159
发表于 2020-2-26 18:30:33 | 显示全部楼层
附件总是下载失败
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-2-26 22:33:16 | 显示全部楼层
tcs_stm32 发表于 2020-2-26 18:30
附件总是下载失败

点击楼主位最开始的链接,那个是ST官网的,下载速度比较快。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2020-7-4 23:42:35 | 显示全部楼层
文档上写了这句话:To receive new frames the UART has to be reinitialized。
需要重新初始化,
if (HAL_UART_Emul_Init(&UartEmulHandle) != HAL_OK)
  {
    Error_Handler();
  }
不知道是不是要重新运行这一段初始化。如果是的话,那就太麻烦了。
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2020-7-6 12:58:19 | 显示全部楼层
这种的还不如多一个MCU或者加一个FPGA了,处理麻烦还不稳定
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-11-26 21:09:55 | 显示全部楼层
稍微看了下,  它的DMA配置是P2M和M2P,  看了下网上其他说明, 内存跟GPIO之间传输需要用M2M模式。   
实测这个程序确实可以运行,  我自己写代码在非M2M模式会有错误中断,   在M2M模式下传输,GPIO输出高低比例是对的,但是传输节拍又跟定时器完全对不上,只有ns级别。       定时器肯定是对的,在中断翻转LED测试。  

看不懂了,我测试确实跟网上说的要M2M模式,这个程序居然又不需要?     我测试TIM节拍根本没管用,感觉没什么地方能配置了啊。   头痛,明天仔细看看这个程序先。

楼主有DMA控制GPIO输出时序的简单DEMO吗。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-11-27 01:18:26 | 显示全部楼层
dddggg412 发表于 2020-11-26 21:09
稍微看了下,  它的DMA配置是P2M和M2P,  看了下网上其他说明, 内存跟GPIO之间传输需要用M2M模式。   
...

H7我做了,可以参考
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
QQ截图20201127011911.png
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-11-27 09:42:19 | 显示全部楼层
eric2013 发表于 2020-11-27 01:18
H7我做了,可以参考
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

楼主位这个并非用的M2M模式,但是我实测可以运行,代码太繁琐还没细看。     网上搜到资料都说内存跟GPIO传输必须用M2M模式,我实测也要M2M模式才不报错。   硬汉对DMA操作GPIO有研究吗,难道跟网上说的不一样,可以用P2M和M2P模式。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-11-27 09:57:21 | 显示全部楼层
dddggg412 发表于 2020-11-27 09:42
楼主位这个并非用的M2M模式,但是我实测可以运行,代码太繁琐还没细看。     网上搜到资料都说内存跟GPIO ...

错误,M2M不能使用DMA循环模式,这个是最大的弊端。所以要用P2M或M2P
我那个H7的脉冲输出就是M2P。


回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-11-27 11:41:39 | 显示全部楼层
没细看楼主位代码了,代码太绕了。但是意思应该是不用细看了。

重新按楼主位模式配置,  DMA2_STR3_CH6,  采用TIM1_CH1触发,从RAM往GPIO搬运。           DMA配置:M2P,MEM自增,PER不自增    测试成功,预期波形一致。           DMA配置:M2M,PER自增,MEM不自增, 有波形输出,波形高低一致,长度完全不受控,NS级别。

重新仔细检查之前代码,DMA2_STR5_CH6,采用TIM1_UP触发,从RAM往GPIO搬运。   DMA配置:M2P,MEM自增,PER不自增,进入ERR中断,没有波形输出。             DMA配置:M2M,PER自增,MEM不自增,波形高低一致,波形长度完全不受控,ns级别,好像是一口气传完的感觉。              跟之前测试结果依然一致,也跟网上说法要用M2M模式一致,但是跟网上说的可以控制节拍说法不一致。

反复核对代码,似乎是没有笔误之类。
彻底迷茫了。。。   网上说法是:必须DMA2,必须M2M模式。 我测试也确实如此,但是节拍不受控,直接传完了。       楼主位代码跟网上说法不同,但是却可用。                       区别似乎是触发源,TIM1_UP和TIM1_CH1。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-11-27 11:43:01 | 显示全部楼层
eric2013 发表于 2020-11-27 09:57
错误,M2M不能使用DMA循环模式,这个是最大的弊端。所以要用P2M或M2P
我那个H7的脉冲输出就是M2P。

没有用循环模式,都是单次模式。   网上说法是内存跟GPIO传输必须用M2M模式,而且必须DMA2,不能DMA1。 我测试DMA1似乎确实不可以。        针对STM32F4
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-11-27 11:58:44 | 显示全部楼层
dddggg412 发表于 2020-11-27 11:43
没有用循环模式,都是单次模式。   网上说法是内存跟GPIO传输必须用M2M模式,而且必须DMA2,不能DMA1。  ...

此贴,看完就明白了,这是本质,另外说仅支持M2M,是错误的说法。我STM32F429使用FMC GPIO DMA操作AD7606就是P2M。

这么多年了,才发现STM32F4系列使用DMA1的大坑,只有DMA2才是完全体
http://www.armbbs.cn/forum.php?m ... id=97900&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-11-27 12:32:30 | 显示全部楼层
eric2013 发表于 2020-11-27 11:58
此贴,看完就明白了,这是本质,另外说仅支持M2M,是错误的说法。我STM32F429使用FMC GPIO DMA操作AD7606 ...

谢谢,看完连接帖,理解一些了,但是还没明白DMA2的TIM1_UP触发和TIM1_CH1触发区别在哪。  楼主,请看我楼上测试结果,这个怎么解释。  DMA通道不同,触发不同,结果不一样。UP触发出错,CH1触发OK。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-11-27 12:50:00 | 显示全部楼层
dddggg412 发表于 2020-11-27 12:32
谢谢,看完连接帖,理解一些了,但是还没明白DMA2的TIM1_UP触发和TIM1_CH1触发区别在哪。  楼主,请看我 ...

我现在一直用的UP触发,CH1触发我没有用过,没法回复你,有时间了我测试了交流交流。另外那些UP触发的说明是错误的,因为我这个有FMC DMA驱动AD7606例子可以参考的。

这个问题暂时就交流这么多吧。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-11-27 17:02:34 | 显示全部楼层
eric2013 发表于 2020-11-27 12:50
我现在一直用的UP触发,CH1触发我没有用过,没法回复你,有时间了我测试了交流交流。另外那些UP触发的说 ...

谢谢版主, 放下几个小时重新整理,居然TIM1_UP又可以了,  使用M2P模式,但是第一次DMA传输和后面的反复启动传输现象不一样,   第一次启动时TIM1_ON & DAM2_STR5_ON时会立即触发一次DMA数据传输。  后面反复启动时会在打开定时器&打开DMA通道后延时一个定时器周期开始触发DMA数据传输。   很神奇,按照我的理解,应该是启动后延时一个定时器周期触发第一次数据传输才对,经过一次计数循环才会有UP信号啊。  每次启动前都将CNT写0了,就算没写0,按理应该是后面次数快才对,而非第一次。 将CNT初值改其他值,可以看到后面的次数确实触发提前了。

GIT做了节点记录,中途各种测试,到最后测试成功时候与之前TIM1_UP触发使用M2P模式不行的版本做了对比,除了行数,空格什么的不同, 配置TIM和配置DMA,启停DMA,DMA中断相关代码一模一样,也是不得其解,不细究了。

1.   DMA2上的TIM_UP是可以操作内存与GPIO传输的,DMA1不行。  从版主给出的框图看PER2PER似乎也是可行的,DMA2两个接口似乎都接到了所有地方,可以互换。
2.   为什么网上的几个地方都说要M2M模式,不知道最初来源是哪,实测M2M下时序不受控,这个存疑。
3    采用非循环模式,第一次传输会立即启动,后面每次传输会使能后延时一个计数周期启动。   假设传输3个数据,定时器间隔10US, 第一次传输只要20US就完成了,0时刻传输第一个,10时刻传输第二个,20时刻传输第三个,并触发完成中断。     以后每次传输需要30US,0时刻不会传输,10时刻才触发传输。   这个不影响程序逻辑,只是第一次快一点而已。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2020-11-28 01:39:03 | 显示全部楼层
dddggg412 发表于 2020-11-27 17:02
谢谢版主, 放下几个小时重新整理,居然TIM1_UP又可以了,  使用M2P模式,但是第一次DMA传输和后面的反复 ...

总结的还不够好,让不了解的人看完会有更多疑惑。
回复

使用道具 举报

0

主题

68

回帖

68

积分

初级会员

积分
68
发表于 2021-10-18 11:24:03 | 显示全部楼层
mark 模拟串口
回复

使用道具 举报

0

主题

20

回帖

20

积分

新手上路

中国梦我的梦

积分
20
发表于 2021-12-16 23:43:04 | 显示全部楼层
请问最后这个官网上模拟串口的代码能用吗?看蒙了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2021-12-17 11:59:09 | 显示全部楼层
sxw101320 发表于 2021-12-16 23:43
请问最后这个官网上模拟串口的代码能用吗?看蒙了

ST提供的这个,效果一般,不好用,不适合项目实战。
回复

使用道具 举报

0

主题

20

回帖

20

积分

新手上路

中国梦我的梦

积分
20
发表于 2021-12-19 11:16:02 | 显示全部楼层
eric2013 发表于 2021-12-17 11:59
ST提供的这个,效果一般,不好用,不适合项目实战。

那老大有实战相关的例程可以用吗
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2022-3-24 20:53:17 | 显示全部楼层
谢谢,下来学习学习
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2022-8-3 14:33:06 | 显示全部楼层
STC有一个IO+TIME的模拟串口,我曾今移植到STM8上,非常稳定,好用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106640
QQ
 楼主| 发表于 2022-8-3 18:25:35 | 显示全部楼层
xyz2008 发表于 2022-8-3 14:33
STC有一个IO+TIME的模拟串口,我曾今移植到STM8上,非常稳定,好用

回复

使用道具 举报

5

主题

17

回帖

32

积分

新手上路

积分
32
发表于 2022-12-12 11:21:35 | 显示全部楼层

总结一下,这个帖子说明:GPIO模拟串口会发生时序错乱等错误,所以最好不要用GPIO模拟串口。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 11:37 , Processed in 0.423492 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表