问题标签 [stm32f4]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
818 浏览

configuration - 带有 STM32F4 的 DSI-to-LVDS 桥的 PLL 不起作用

我正在尝试使用 STM32F469 微控制器驱动SN65DSI84 桥 MIPI-to-LVDS。基本上,我的 STM32 提供 DSI 数据,SN65DSI84 将其转换为 LVDS 格式。

问题

今天,我设法通过 I2C 与我的 SN65DSI84 进行通信以配置其寄存器,但我未能成功使其 PLL 锁定。

只是为了让您理解,SN65DSI84 需要一个用于 LVDS 输出的时钟(LVDS 像素时钟)。您可以在数据表的第 14 页阅读该时钟,它可能来自外部源或直接来自 DSI 通道。我通过设置 CSR 0x0A 寄存器的位 0 来使用最后一个选项。问题是当我通过 0x0D 寄存器启用 PLL 时,0x0A 寄存器中应该告诉我 PLL 确实已启用的位没有设置。

到目前为止我做了什么

好的,首先我最关心的是要锁定 PLL。如果我对数据表的理解正确,那么实现这一点不需要配置桥的所有寄存器,而只需要配置位于地址 0x09、0x0A、0x0B 和 0x0D 的寄存器。

在我的程序中,我创建了一个函数,允许我配置位于地址 0x0A、0x0B 和 0x0D 的寄存器。简而言之,这是算法:

  1. 我通过在地址 0x0D 发送 0x00 来禁用 PLL,然后等待 3ms;
  2. 我在地址 0x0A 发送字节 0x01(LVDS 像素时钟的时钟源来自 MIPI D-PHY 通道,LVDS 像素时钟在 [25 MHz ; 37.5 MHz] 范围内);
  3. 我在地址 0x0B 处发送字节 0x08(将 DSI 时钟除以 2);
  4. 我通过在地址 0x0D 发送 0x01 来启用 PLL;
  5. 我通过在地址 0x09 发送 0x01 来重置网桥,因为根据该寄存器的描述(第 23 页):

该位在设置为“1”时自动清零,读取时返回零。该位必须在 CSR 更新后设置...

  1. 我正在等待通过读取并等待将位 7 设置为 0x0A 地址来启用 PLL。但是这个位从未设置。
  2. 我应该等待 3ms

注意:在 PLL_EN_STAT = 1 后,等待至少 3ms 让 PLL 锁定。

但我从来没有达到这一点,因为我在前一点 6 的循环中。如果我不检查 0x0A 地址处的位 7 并绕过点 6,它似乎不起作用,因为我没有看到LVDS 时钟上的时钟通过 LVDS 连接器。

我检查了我的寄存器的值(通过读取它们)并且它们的值是正确的。

由于它似乎不起作用并且根据位于地址 0x0D (p. 24) 的 PLL_EN 寄存器的描述:

[...]。在使能 PLL 之前,输入时钟源必须有效且稳定

我认为问题可能来自 DSI 端(STM32F4 端),但这是我上述步骤之前所做的。

  1. 我启用了 DSI 主机外设(通过 STM32CubeMx 进行配置);
  2. 我启用了 LTDC 外设(通过 STM32CubeMx 进行配置);
  3. 我启动 DSI 模块。

我检查了在这些初始化过程中没有发生错误,一切似乎都很好。我无法直观地检查 DSI 时钟,因为我无法实际访问 DSI 时钟 PIN si 我无法判断 DSI 时钟是否确实在工作。但是,如果我错了,请告诉我,为了确保它正常工作,我检查了 DSI 主机 PHY 控制寄存器(DSI->PCTLR)以确保 CKE 位已启用(STM32F469 参考手册的第 616 页) . 它是。

无论如何,我真的不知道我现在还能做什么。SN65DSI84 似乎没有启用(或锁定),我不知道为什么。对我来说,问题可能来自各个方面: - DSI 初始化错误(stm32 端);- 网桥配置错误(sn65dsi84 端);- 其他 ?

在此先感谢您的帮助 !

注意:我还没有提供程序代码,以免这篇文章太混乱,因为有很多东西要复制。无论如何,不​​要犹豫,问我一些你想看的部分,我会提供的。

0 投票
2 回答
36834 浏览

c - 如何在 STM32F4、Cortex M4 上写入/读取 FLASH

我想写一个变量,例如一个数字为 5 的整数到 FLASH 中,然后在电源消失并且设备再次打开后读取它。

我已经知道,为了写东西,我首先需要擦除页面然后再写。

在手册中它说:

  1. 将 OPTKEY1 = 0x0819 2A3B 写入 Flash 选项密钥寄存器 (FLASH_OPTKEYR)
  2. 将 OPTKEY2 = 0x4C5D 6E7F 写入 Flash 选项密钥寄存器 (FLASH_OPTKEYR)

如何执行此任务?

Sector 0 有一个从 0x0800 0000 到 0x0800 3FFF 的块地址,这就是我要写的地方。

这里是手册的链接,第 71 页:STM32 手册

0 投票
1 回答
4374 浏览

embedded - 使用 EXTI 线进行软件中断

我正在使用 STM32F4,我想生成一个软件中断。问题是我如何在中断处理程序中知道中断是由软件产生的还是由连接到 EXTI 线的引脚产生的?

0 投票
1 回答
225 浏览

rs485 - STM32F401核板如何发送语音?

我正在研究 stm32f401 核板,我想用 uart 将 2 个板相互通信以发送语音。

我正在使用 Nucleo-CCA02M1 mems 麦克风套件。我应该使用哪一个?RS422 还是 RS485 用于全双工通信?有没有关于帮助的例子?

谢谢你。

0 投票
2 回答
16308 浏览

stm32 - 无需任何操作即可启用读取保护且无法禁用

我目前正在开发一个基于 STM32F4 的独立板(STM32F469)。到目前为止,一切正常。我正在通过 ST-Link Utility 使用 STM32F4-DISCOVERY ST-Link 通过 SWD 对我的微控制器进行编程。

星期五,当我下班时,一切都很顺利。今天早上我回到办公室时,我的程序没有在板上启动。当我尝试通过 SWD 连接到 STM32F4 时,STM32 ST-Link Utility 显示警告说:

无法读取内存!禁用读出保护并重试

我没有设置任何东西。我做了一些研究并尝试了一些事情:

  • 更改Target > Option Bytes > Read Out Protection中的选项字节。我不知道它是否与实际 RDP 状态相关,但是当我打开此选项卡时,RDP 处于Level 1。当我将其设置为 0 并单击Apply时,几秒钟后会显示一条错误消息,称无法设置选项字节!请重置目标并重试。
  • 我试图擦除芯片。当然,自从设置了 RDP 后,它就不起作用了。
  • 我已经更新了 ST-Link 固件。我没有更新 STM32 ST-Link Utility,因为到目前为止运行良好(v4.0.0.0)。我没有改变任何东西。
  • 我试图连接到复位下的芯片。好听,不行

我不知道还能做什么。当我阅读我的 STM32F4 (RM0386) 的参考手册时,第 87 页我们可以阅读:

级别 1:启用读保护。

这是选项字节擦除后的默认读保护级别。读保护级别 1 通过将任何值(分别用于设置级别 0 和级别 2 的 0xAA 和 0xCC 除外)写入 RDP 选项字节来激活。设置读保护级别 1 时:

  • 在连接调试功能或从 RAM 或系统存储器引导加载程序引导时,不能执行对闪存或备份 SRAM 的访问(读取、擦除、编程)。在读取请求的情况下会产生总线错误。
  • 从闪存启动时,允许从用户代码访问(读取、擦除、编程)闪存和备份 SRAM。

当级别 1 处于活动状态时,将保护选项字节 (RDP) 编程为级别 0 会导致闪存和备份 SRAM 被批量擦除。因此,用户代码区域在读取保护被移除之前被清除。整体擦除仅擦除用户代码区域。包括写保护在内的其他选项字节在大容量擦除操作之前保持不变。OTP 区域不受整体擦除的影响并且保持不变。仅当级别 1 处于活动状态且请求级别 0 时才执行整体擦除。当保护级别增加(0->1、1->2、0->2)时,没有整体擦除。

首先,RDP有没有可能被某种超自然现象激活了?我发誓我没有设置这个位。另外,正如我所读到的1 级描述,有可能回到 0 级(但用户程序已被擦除)。对我来说,从 1 级到 0 级是行不通的。所以....恐怕RDP级别实际上是2,在这种情况下......好吧,我死了。

有没有办法解决这个问题?我不明白周末会发生什么变化,因为一切正常,但现在一切都没有了。

提前致谢。

0 投票
4 回答
47573 浏览

stm32 - 尝试与 ST-LINK Utility 连接时出现“未检测到 ST-LINK”错误消息

我有一块 NUCLEO-F401RE 板 (带有STM32F401RE),它大部分工作正常。最近,我在这里按照“掌握 STM32 ”一书中的教程进行操作,其中说要安装 OpenOCD。在此之前我也一直在关注,我已经能够连接到我的电路板并毫无问题地闪烁它。

在尝试让 OpenOCD 工作之后,这不再可能。每次我尝试连接到我的开发板时,我都会收到以下错误消息:

我尝试过多次更新驱动程序,重新启动板,重新安装 ST-LINK 实用程序,切换 USB 电缆,重置板并重新安装所有东西,我还尝试了按住重置按钮并尝试擦除的技巧芯片。到目前为止,不幸的是,这些都没有对我有用。

在这里你可以找到我的董事会的照片。

在我的桌面上,我使用的是 Windows 10。在我的板上,我使用的是 FreeRTOS。 在这里您可以找到我的 Windows 设备管理器的图像。

我还尝试使用 ST-Link 升级来更新我板上的固件,但没有运气。尝试此操作时,我要么没有选择我的设备的选项(使用 .jar 应用程序时),要么使用 .exe 应用程序时,我只收到以下错误消息:

我一直无法在任何地方找到解决方案,所以我希望你们能提供帮助!如果您需要任何进一步的相关信息,请告诉我。非常感谢。

0 投票
2 回答
392 浏览

c - STM32F469I-Discovery 不执行音频传输回调

我是嵌入式编程的新手,我目前正在使用 STM32F469I 发现板进行项目。我将 Eclipse 与 ARM 工具链和提供的驱动程序一起使用。我无法播放在特定地址闪入芯片的二进制音频文件。我非常简单地将我的代码基于一些示例文件,尽管因为我只是想让它工作而减少了很多。

目前,代码一直运行到播放缓冲区的位置,但随后似乎卡住了。缓冲区正在循环播放(我已更改缓冲区的大小以确认这一点),您可以听到它,但这就是发生的一切。传输中断回调永远不会执行,因此缓冲区不会重新填充,并且永远不会播放完整的样本。

我试过使用外部中断来重新填充缓冲区,但是当我尝试这个时,它卡住了。我也尝试通过打开 LED 来调试它,但这已经证实它在播放样本后不久就卡住了。无限while循环永远不会执行,传输中断永远不会执行。

我的问题是 - 为什么它会卡住,为什么没有触发中断?

任何帮助将不胜感激!

为了确定问题的原因,我进一步精简了代码,以便它所做的只是播放缓冲区。我已删除中断调用以尝试确定导致问题的原因。

它应该做的是配置系统时钟,填充缓冲区,初始化音频,然后打开 LED。然后它应该播放音频缓冲区,等待 1 秒,然后关闭 LED。它循环播放缓冲区(因为它应该在循环模式下)但随后卡住并且从不关闭 LED。我试过在正常模式下运行它,但它只是播放一次缓冲区,然后就卡住了。

这让我认为我错误地配置/填充了缓冲区。

此外,我还发现网上其他人有类似问题的实例,尽管到目前为止还没有解决方案。任何帮助将不胜感激。

0 投票
1 回答
1109 浏览

http - 获取从微控制器到服务器的 http 请求 (API)

我正在使用 lwip/stack 使用 stm32f4 微控制器,我用它来控制通过以太网发送 http 请求。以下代码工作正常:

问题是当服务器需要像这样的身份验证时:

我尝试在代码中添加授权部分:

但是http请求不起作用。

有任何想法吗?ps:我使用 Keil ARM /stm32f4 / lwip stack 服务器:Fibaro home center lite

0 投票
1 回答
268 浏览

android - 使用 WRITE_TYPE_NO_RESPONSE 发送许多数据包时,Android BLE 连接中断

我对一个需要使用蓝牙 LE 将固件文件从 Android 设备发送到 STM32F4 芯片的项目感到疯狂。

我已经成功地在两端实现了 BLE,并且我在很长一段时间内都在使用它,并且没有任何问题。

现在应该实现一个文件传输,它应该能够发送大约 250K 大小的文件。我的实现似乎有效,但仅适用于 10 种情况之一。它确实开始以 20 字节的块发送数据包,但随后在未确定的点上停止了 90% 的测试用例中的通信。我需要断开/重置并重新启动以重新启动。

STM32F4 上文件传输器的特性定义为:

在 Andoid 中,我将服务特征中的 WRITE_TYPE_NO_RESPONSE 标志设置为

对于最多 8 个数据包的 FIFO,写入数据包在 onCharacteristicWrite 回调函数中完成。

  • 最多构建 8 个文件数据片段并将其排队到 fifo

  • wrtCharacteristic.setValue(firstQueueItem);

  • 在 onCharacteristicWrite 回调中:if queue not empy { wrtCharacteristic.setValue(nextQueueItem);}

  • 如果在 STM32F4 中接收到最后一个数据包,则该组中的所有数据包都经过验证,并发送回确认,从而在 APP 中引发事件。然后该事件触发发送接下来的 8 个数据包。

这对我来说看起来很简单,有时似乎有效。如果我将连续块的数量设置为 1,它总是可以工作。几乎所有其他大小的文件都不能完成发送 in 文件。

没有证据表明传输何时中断,有时是立即中断,有时是在发送超过 80% 的数据之后。

我还尝试跳过将 STM32F4 上接收到的数据写入闪存,以避免 SPI 干扰而不改变行为。

有什么我在这里想念的吗?我在哪里可以检查错误。任何帮助将不胜感激。

0 投票
1 回答
188 浏览

arm - STM32F4 (Nucleo-F446RE CooCOX) basic GPIO

I just started programming the Nucleo-F446RE (Based on the STM32F446RE MCU).

I can't seem to get a pin to go active, I'm trying to just toggle a GPIO using the following code:

It doesn't seem to work though..I've gone through the header file and c file of the GPIO which explains how to go about setting the pin, although even following this to the bone, it just stays low. Where am I going wrong?

Thanks in advance for any help