OpenEdv-开源电子网

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

STM32C8TC单条指令执行时间异常

[复制链接]

12

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2014-10-22
在线时间
17 小时
发表于 2019-1-14 15:00:53 | 显示全部楼层 |阅读模式
10金钱
各位大大:
     因项目需要,我在做一个工装,模拟实现IIC的从机。主机的SCL时钟周期为10us,我通过2us的定时器不断扫描SDA与SCL的状态来实现模拟过程。
通过单步调试(即主机的每个时钟上下沿均是鼠标点击,比正常SCL时钟周期慢的多),实现了主机与从机的IIC通信过程,但全速跑时就不行了。
经测试发现,定时器设定2us,但实际为10us进一次定时中断,即定时器中执行语句的时间超过了2us导致实际定时超时,将定时器中执行语句注释定时时间就正常了。
但我在定时器中执行的语句并不多,不至于超时,再经测试:在定时中将一个端口电平进行翻转测试(通过宏PBout实现),其时间居然达到了惊人了154ns!!
时钟配置均引用的官方固件库,代码我也查询过APB2总线时钟没有进行分频,这是怎么回事呢?
因定时时间短,对定时中执行的语句时间要求严格。是否因为PBout执行时间就需要154ns呢?有没有更高效的端口高低电平控制方法?


scope_0.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-15 01:37:03 | 显示全部楼层
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2019-1-15 08:48:05 | 显示全部楼层
本帖最后由 0x00000000 于 2019-1-15 08:51 编辑

GPIO有bitset和bitrest寄存器,可以快速控制电平变化。还是不够快直接写汇编得了。
不过你这个应该是程序设计的问题吧。2us扫描是不是太频繁,能不能降低频率?中断服务是不是太复杂,可以只做一些简单工作,比如设立一些标志位,让主循环处理?或者是使用定时器触发DMA以2us采集GPIO状态缓存到指定RAM,再处理,避免高频中断?
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2019-1-15 08:53:24 | 显示全部楼层
原子有很成熟的IIC软模代码,自己看看差在哪里?能用可以直接移植得了。
回复

使用道具 举报

12

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2014-10-22
在线时间
17 小时
 楼主| 发表于 2019-3-1 13:40:21 | 显示全部楼层
0x00000000 发表于 2019-1-15 08:53
原子有很成熟的IIC软模代码,自己看看差在哪里?能用可以直接移植得了。

原子哥的是模拟主机,你模拟个从机试试,很难。
经过一周的调试,我已经实现了,SCL持续时间只要大于2us均能正常跟踪。
回复

使用道具 举报

12

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2014-10-22
在线时间
17 小时
 楼主| 发表于 2019-3-1 13:42:28 | 显示全部楼层
0x00000000 发表于 2019-1-15 08:48
GPIO有bitset和bitrest寄存器,可以快速控制电平变化。还是不够快直接写汇编得了。
不过你这个应该是程序 ...

目前已经实现了温湿度,PM2.5、CO2传感器的从机模拟。
定时器扫描不可靠,最后是用外部中断实现的,的确有很多地方应直接操作寄存器而非用库函数,可以节省很多宝贵的时间。
回复

使用道具 举报

12

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2014-10-22
在线时间
17 小时
 楼主| 发表于 2019-3-1 13:44:21 | 显示全部楼层

谢谢原子哥帮顶,已实现了多类从机的IIC软件模拟。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-1 14:29:13 | 显示全部楼层
本帖最后由 edmund1234 于 2019-3-1 14:45 编辑

中断的发生它不止是执行你的代码, 之前还有压栈, 之后还要压栈,跳转后流水线的初始,也许它真的没你想的那么快速呢。
这类需要快速响应的要求, 应该用内置的IIC模块, 除非你这段时间, 不用管按键, 不用管显示, 不用管其它通信设备
如果说真的是啥也不用管, 那何必要用中断呢, 用查询的保证你速度过关。
回复

使用道具 举报

12

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2014-10-22
在线时间
17 小时
 楼主| 发表于 2019-3-1 14:45:39 | 显示全部楼层
edmund1234 发表于 2019-3-1 14:29
中断的发生它不止是执行你的代码, 之前还有压栈, 之后还要压栈,跳转后流水线的初始,也许它真的没你想的 ...

已经实现!
硬件IIC很麻烦的,不是没研究过。
中断实现的,为什么会不关其他模块呢?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-1 14:48:09 | 显示全部楼层
xielei 发表于 2019-3-1 14:45
已经实现!
硬件IIC很麻烦的,不是没研究过。
中断实现的,为什么会不关其他模块呢?

中断实现的,为什么会不关其他模块呢?

不明白你问的是什么不关模块
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 20:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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