STM32F4发现GPIO信号生成问题

2019-07-14 17:36发布

我正在尝试使用我的STM32F4-DISC1(STM32F429)生成一个与Nintendo 64控制器接口的信号。我现在试图生成的信号仅为1us高,然后是1us low(无限重复)。我面临两个问题:
  • 我似乎无法正确工作。主时钟应为180 MHz(由“获取时钟”功能报告,抱歉忘记全名)。这应该意味着每微秒有180个周期,对吗?但是当我将GPIO设置为高电平时,等待180个周期(180 nops)然后再将其设置为低电平,3.5us已经过去。我在这里想念的是什么?
  • 我使用下面的代码生成的信号在一段时间后运行良好,但最初没有。如果我用逻辑分析仪来看它,那么第一次捕获将总是如下所示: 1.png 如您所见,信号仅在很短的时间内(约0.17us)很高。虽然没有修改代码,只需再次捕获,信号就会变为: 2.png 在这两种情况下,代码都没有改变,等待180个周期。如果相关,我正在以200 MHz的采样频率使用Open Bench Logic Analyzer。初始化代码
3.png 信号生成代码 4.png 0xE0001004是循环计数器的地址,它会自动更新。所以不需要r6在wait循环中进行修改。另请注意,我尝试使用不同的技术进行等待,包括仅使用180个NOP。这大致相同。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
richips
1楼-- · 2019-07-14 23:24
可能是因为我之前从未做过这样的事情,这是我能够提出的方法。我会看看我能在PWM
jhhfhgj
2楼-- · 2019-07-15 01:22
 精彩回答 2  元偷偷看……
ggfvxv
3楼-- · 2019-07-15 05:56
绝对值得为这个应用程序学习。
uvysdfydad
4楼-- · 2019-07-15 06:16
我非常熟悉AVR和PIC上的asm以及每条指令需要多少个周期。所以我可以对你的asm程序的行为做出有根据的猜测。
你得到3.5μs周期的使你感到很困惑,你的代码看起来也很奇怪。
这里有几件我无法理解的事情:

你不是100%确定#0xe0001000甚至是DWT BASE,为什么你不确定?不是那样的......你应该......确定吗?
你想要等待180个周期,但每次循环你的等待循环,你执行6个指令,其中4个指令,我认为每个指令1个周期。另外2个是每个指令2个周期。这是8个周期。你甚至连续两次打电话给nop ..
你永远不会在等待循环中增加r6,你永远不会使用str指令来更新循环计数。这意味着根据您的代码,您甚至无法离开等待循环,因为没有任何变化。
根据您的逻辑分析仪,您确实离开了循环,这是您无法做到的。这意味着:

这个问题是一个笑话,哈哈,好笑话。
或者在后台有一个中断改变r6或循环计数,你不知道它。
或者你知道它并决定不与我们分享。
或者看门狗定时器正在开始并让你走出循环。
或者这不是您的实际代码。
或CMP指令向后,您将立即离开,这将显示在您的第一个逻辑分析仪图形中,然后STM变得有感知并且理解您想要一个方波并且做出最佳尝试并且只能得到一个方波周期为3.5μs。感觉很差,它正在尽力而为。我永远不会忘记你,你是有感觉的STM。
如果您想制作周期为2μs的方波,请使用合适的定时器。这意味着在您等待期间,您可以执行其他过程。如果你想计算循环中的所有内容,那么与使用中断相比,你实际上是在冻结 CPU。

由于这将与着名的 Nintendo 64控制器接口,是不是有一些库?为什么看,有一个Arduino。

我给你的建议是:

将上面的库从Arduino移植到STM32F429,或者移植该库。
将STM32F429放在一个盒子中,当需要180 MHz微控制器时使用它。获得一个Arduino并使用该库并称它为一天,那里有大量的arduino克隆。
以文本格式(而不是图像)发布您的实际代码。
研究如何在STM32F429上使用中断。
richips
5楼-- · 2019-07-15 12:04
谢谢你的回答。很抱歉,我完全省略了上述代码使用循环计数器的事实。在评论中,一段时间后,我写了“可能”,因为我刚刚从反汇编中获取了代码。循环计数器在init部分初始化,然后0xE0001004包含从那时起经过的循环计数。
richips
6楼-- · 2019-07-15 12:38
我也想过使用arduino,我只是想用现在的东西来工作而不是买新的东西。我意识到使用arduino可能会更容易。

一周热门 更多>