问题标签 [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 回答
3448 浏览

stm32 - 为什么不能用 timer1 CC1 事件触发 ADC?

我正在研究 stm32f407。我想做的是用 timer1 CC1 事件触发 ADC1 和 ADC2,但它不起作用。我尝试使用 timer3 trgo 或 cc1 事件触发 ADC1 和 ADC2,它工作正常。所以我不知道为什么 timer1 cc1 事件不起作用,谁能帮助我?谢谢,以下是我的代码。

更让我困惑的是,如果我开启TIM1_CC_IRQn中断,我真的可以在TIM1_CC_IRQHandler中捕捉到CC1中断。

有没有人对此有一些想法?


最近的状态是我发现如果我启用 CC1 中断然后 CC1 事件可以触发 ADC1,现在我的问题是为什么我必须启用 CC1 中断?我是否启用 CC1 中断有关系吗?如果我用 timer3 的 CC1 事件触发 ADC1,我真的不需要启用 CC1 中断。

0 投票
1 回答
2078 浏览

stm32 - STM32F4 DMA可以并行工作吗?

我正在使用 STM32F446 开发一个需要 3x SPI(我是所有这些方面的大师)和 SDIO 接口的应用程序。

其中 2 个 SPI(SPI1 和 SPI2)是需要每 1ms 读取一次的传感器。对于 SPI1,我需要写入 1 个字节,对此的响应将是值。对于 SPI2,我需要写入 1 个字节,然后读取 6 个字节。

第三个 SPI (SPI3) 和 SDIO 用于通信/记录,它们都不需要以固定周期传输数据。

查看STM32F46x 手册,第 9 节,看起来我不能通过外设中断触发 DMA 传输(这太糟糕了),但我可以做以下所有事情:

  1. 每 1ms 的定时器中断:在 ISR 内部触发 SPI1 和 SPI2 DMA 传输。DMA 传输用接收到的传感器数据填充缓冲区;
  2. 每次我需要写入 SDIO 或 SPI3 时,我都会启动优先级低于 SPI1 和 SPI2 的 DMA 传输。

我猜 SPI1 和 SPI2 可以并行执行,因为我有 2 个 DMA 控制器,如果它们同时发生在 SPI2 和 SDIO 的同时,后者将被阻塞,直到控制器空闲。那正确吗?

0 投票
1 回答
35833 浏览

stm32 - 如何使用 STM32CUBEF4 HAL 库通过 i2c 读取传感器数据?

我想使用最新的 HAL 库而不是标准外设库。

我想读出 BMA250E G-sensor 的chip_id,但它不起作用。

aRxBuffer 的值始终保持在 0x00。但应该是0xf9!

我的代码有什么问题?

0 投票
1 回答
1517 浏览

stm32 - 从 IAR stm32f2/f4 闪存复制函数到 ram 并运行它

我想将一个函数从 Flash 复制到 RAM 并运行它。

我知道 IAR 包含函数的 __ramfunc 类型,允许您在 RAM 中定义函数,但我不想使用它有两个原因:

  • RAM funcs 正在使用我仅在初始化时使用的 RAM 内存
  • 升级 2 次代码后(我正在做一个固件更新系统),__ramfunc 给了我一个错误的位置。

基本上我想要的是将函数声明为闪存,然后在运行时将其复制到内存并运行它。我有下一个代码:

详情如下:

  • 函数的大小不起作用
  • 链接器返回给我错误的函数地址(奇数地址)。使用调试工具检查我发现它是错误的,这就是我执行 &0xFFFFFFFE 的原因。

在这段代码之后,函数被完美地复制到 RAM,完全相同的代码,但是当我用这个运行它时:

我得到一个异常 HardFault_Handler。经过大量测试后,我无法修复此硬故障异常。

检查 asm 代码我注意到对 __ramfunc 和普通闪存函数的调用是不同的,这可能是导致 HardFault 异常的原因。

这是定义为 flash 时被调用的方式:

现在,如果我直接调用它将代码定义为 __ramfunc 并直接调用它:

异常的原因可能是我正在从 Flash 跳转到 RAM,并且可能是皮质保护,但是当使用 __ramfunc 修饰符时,我也在这样做,并且逐步调试,它不会跳转到函数RAM,一调用函数就直接跳转到异常。

跳过此操作的一种方法是“转到”RAM 内存。我尝试将 C 中的 C 和 ASM 与 asm("...") 函数混合,但出现错误,并且可能会出现硬故障异常。

任何提示都会受到欢迎。

0 投票
0 回答
4196 浏览

c - STM32:从自定义引导加载程序跳转到应用程序时出现硬故障

我正在开发带有自定义引导加载程序和应用程序的 STM32F401 MCU。编译器是 GCC 5.2.1,没有优化正在运行。

在以下跳转序列后的第一个中断后,我遇到了硬故障:引导加载程序->应用程序->引导加载程序->应用程序。从引导加载程序第一次跳转到应用程序后,系统工作正常。然而,在跳转回引导加载程序后跳转到应用程序后(我不是故意重置电路板),硬故障发生在第一个中断之后,可能是从 SysTick 到 EXTI 的任何东西。

这可能是什么原因?有什么我不更新的吗?谢谢。

代码的存根:

跳转过程(对于两个程序;应用程序位于 0x08008000,引导加载程序位于 0x08000000):

跳转前的应用程序清理:

0 投票
1 回答
836 浏览

microcontroller - I2C SCL 线,STM32F4 上的时钟问题

在 I2C 接口中,

SCL,时钟线即使总线上没有设备也会传输时钟信号?

我们如何调试 I2C?

0 投票
1 回答
1286 浏览

stm32 - STM32F3Discovery 用 openocd 编程


首先,我很抱歉我的英语很差。
我正在学习如何使用 STM32F3Discovery 板。我编写了一个简单的程序来打开所有板载 LED,使用 STMCubeMX 生成配置代码。
我写的代码就是下面的八行。

这里有一个 Eclipse 项目的副本。
我正在尝试使用 openocd 对板进行编程,所以我运行

然后

openocd 的输出是

但是没有一个led是打开的!
我应该怎么办?

0 投票
1 回答
1739 浏览

arm - 如何配置STM32f405 SPI用DMA传输数据?

我有一个 STM32f405,任务是通过 SPI 传输数据并使用 DMA 节省处理器时间。使用的 SPI 为 SPI1,引脚为 PA4 至 PA7。我为 DMA 选择了来自 DMA2 通道 3 的 3-rd 流。这个想法是激活 CS 信号并将一些数据存储在内存中,然后由 DMA 自动传输,一旦完成,DMA 应该触发中断处理程序以停用 CS。这是代码:

通过调试器,我发现 DMA2_Stream3_IRQHandler 从未被激活。根据参考手册,当 SPI_DR 寄存器的 TXE 标志为 1 时,DMA 应该传输数据,事实就是如此。来自 SPI_CR2 的标志 TXDMAEN 也被设置。我也检查了 DMA S3CR 寄存器,并设置了标志 TCIE 和 EN。另外函数 DMA2_Stream3_IRQHandler 对 main 函数可见。仍然从未激活 DMA2_Stream3_IRQHandler。

更新:当我手动重置 DMA2_S3CR 寄存器的 EN 位时,会触发 DMA2_Stream3_IRQHandler。根据参考手册,该位由硬件清除:

  • 在 DMA 传输结束时(流准备好配置)
  • 如果 AHB 主总线上发生传输错误
  • 当内存 AHB 端口上的 FIFO 阈值与突发大小不兼容时

我还更改了 SPI_Config 和 Analog_Out_Config,但仍然没有干预调试器 DMA2_Stream3_IRQHandler 永远不会被触发。看起来 DMA 没有触发传输并且由于某种原因无法结束传输。如何确定 DMA 是否触发了任何传输?

0 投票
1 回答
999 浏览

usb - USB CDC 仅工作一次,带中断 endp

我正在 STM32F4 MCU 上实现一个虚拟 COM 端口。

MCU 没有可用的端点,所以我必须取消中断端点/通知元素。问题是 MCU 只能向 pc 发送一次消息,之后 pc 将无法收到。

设备 USB 描述符:

0 投票
2 回答
268 浏览

c - C:传递和返回指向 char* 的指针

我正在尝试通过多个函数(每个函数提取消息的一部分)解析一个 char* 并且在函数之间传递指针时遇到了麻烦。在我遇到问题的消息部分中,有一个整数后跟一个空格字符,然后是一个双精度数。

这一切都在STM32F4上运行:

主功能:

职能:

第一个函数调用应该从字符串的第 13 个字符开始提取一个整数。这很好用,如果我在 strtol 调用之后读取返回指针(nLink),它指向正确的位置(在整数后面的空格处)。但是,当我从主函数或第二个函数中的指针读取字符串时,它并没有指向正确的位置。

我要做的是让主函数将指针传递给由第一个函数更新的数组,然后第二个函数获取该指针并使用它。

任何帮助,将不胜感激。