OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2870|回复: 6

STM32L15系列IO模拟串口失败,请教

[复制链接]

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2017-10-21
在线时间
15 小时
发表于 2019-3-19 10:34:57 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 猜不透亻尔心 于 2019-3-21 09:42 编辑

最近在做一个项目,因为需要用到多个串口,硬件串口就显得不够用了,所以 就打起了IO口模拟串口的主意,然后通过将IO口设置为下降沿中断来捕获串口传送开始的信号
于是做了入图的配置,之所以设置为下拉,是因为我发现,如果设置为上拉,如果是因为不小心触发的中断则会导致接收到 FF 的数据,而且这样也并不会影响到下降沿中断的触发。
然后也是最重要的就是IO口时序的模拟接收了,根据波特率定时查看IO口状态并进行记录程序如下(使用HAL库编写,CUBEMX 进行配置):
这个时候问题就出来了,数据总是不能正确接收,delay_us的延时是通过定时器实现的,这个延时同时也在模拟I2C接口中有用到,系统时钟和定时器配置如下
时钟配置为内部MSI  2M频率,不分频,则外设时钟和系统定时器都应该同样是2M频率
TIM6的TIME_OUT = (period+1)/(prescaler+1)/clock = 2 / 1 / 2 = 1us ;  这里的计算应该没有问题吧,然后定时器回调函数做了如下处理
Nconter 是一个全局变量,下面是延时函数

搞了好几天还是没搞明白是哪里出了问题导致接收到的数据总是不准确,我用示波器看了传入到芯片  IO  的数据的波形没有任何问题,所以烦请哪位大神看到了帮忙解惑一下是哪里出了问题,或者我该怎么测试去找出问题所在。



最佳答案

查看完整内容[请看2#楼]

两个问题 1:你模拟发送是否正常? 2:如果你串口设置的波特率是9600,你也用哪个9600去接收,可能会有问题,试试用8倍频或者16倍频去接收每一个bit,取中间的值(1/0)。以前我用fpga做串口接收就是这么做的。单片机没试过。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

56

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1394
金钱
1394
注册时间
2014-12-31
在线时间
187 小时
发表于 2019-3-19 10:34:58 | 显示全部楼层
两个问题
1:你模拟发送是否正常?
2:如果你串口设置的波特率是9600,你也用哪个9600去接收,可能会有问题,试试用8倍频或者16倍频去接收每一个bit,取中间的值(1/0)。以前我用fpga做串口接收就是这么做的。单片机没试过。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-3-20 02:41:23 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2017-10-21
在线时间
15 小时
 楼主| 发表于 2019-3-21 08:30:47 | 显示全部楼层
上面的时钟配置可能不太好分析,我再上个CUBEMX工具配置图
clock_config.png
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2017-10-21
在线时间
15 小时
 楼主| 发表于 2019-3-21 10:04:00 | 显示全部楼层
原子哥能指点一下么
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2017-10-21
在线时间
15 小时
 楼主| 发表于 2019-3-22 10:00:07 | 显示全部楼层
今天用这个延时函数进行发送尝试,之前一直在拿接收进行尝试(因为我们只需要接收东西),我通过操作IO口高低电平然后通过示波器观察波形发现,延时函数100us 电平宽度在250左右,将延时时间进行相应放大后就能正常发送某 Band 的数据了,我又考虑了下导致这样结果的原因,我的SYSCLK和APB1和APB2均是2M的频率,再考虑语句执行时间和延时时间混在一起就导致了这种情况。所以我得到的经验教训就是,在主频比较低而你又要求定时单位比较小的时候(我现在是us级的定时),建议使用示波器看下,可能会存在很大误差。除非迫不得已,否则少用IO口模拟串口,帖子就到这里吧,问题找到了。
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2017-12-5
在线时间
18 小时
发表于 2019-7-8 22:39:19 | 显示全部楼层
楼主的问题解决了吗?方便把你模拟串口部分的程序分享下吗?389817159@qq.com.谢谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 06:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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