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

can-bus - STM32F4xx CAN 滤波器配置

我正在参考参考手册(bxCAN)中的信息写作。

我正在尝试了解CAN过滤器配置的工作原理,需要您的帮助来检查我是否理解正确。

尤其是过滤器ID和过滤器掩码ID的配置。

在我看了一下stdPeriphLib和参考之后。手册,我认为了解会发生什么,但我不确定。

FilterId 高/低:

FilterIdHigh/Low 是CAN Controller二进制 AND 之后的比较值FilterIdMask吗?

eg: CAN Controller 接收到消息 --> CAN_Rx_

CAN ControllerResult 与 FilterId 进行比较。

如果匹配CAN Controller,则将 CAN_Rx_ 消息放入分配的 FIFO,否则将丢弃该消息。

不是吗?

谢谢。

0 投票
0 回答
417 浏览

c++ - 嵌入式序列化 - 使用没有 RTTI 的谷物?

我想在嵌入式系统中使用 Cereal 1.2.1,所以我不能使用 RTTI,因为它会增加很多代码大小。我不得不放弃对 typeid 的支持。有没有办法在没有 RTTI 的情况下使用谷物?我序列化的结构不是多态的,只是一些数字和数字数组的容器。

如果有帮助,我正在使用 gcc 5.4.1。

谢谢。

0 投票
1 回答
221 浏览

c - 如何在调试时隐藏我的 C 库代码

我想将我的 C 函数创建为库,并且我想对每个人隐藏我的代码

我希望每个人在调试时都看不到 C/Assemble 代码。

所以我使用 IAR 创建一个 C 库文件并设置Project → Option如下

  • 通用选项→输出→输出文件:
  • 常规选项 → 库配置 → 库:
  • C/C++ 编译器 → 输出:[未选中] 生成调试信息
  • 汇编器→输出:[未选中]生成调试信息

之后,我使用我创建的库并尝试调试。我可以将我的库视为汇编代码,但我不想要它。

那么我该如何隐藏它。

例子:

我创建了一个示例函数

图书馆计划

申请项目

代码运行到调试点后,我按 F11(步入)。Debug 能够跳转到我的库代码,如下图所示。 调试能够将我的代码视为汇编

0 投票
1 回答
1362 浏览

c - STM32,存储在闪存中的变量无法在其他文件中更新

我使用的是 STM32F411RE。因为我的 RAM 中没有更多的内存。我决定在我的闪存中存储大变量。为此,我在section.ld.

main.c文件中,我将变量声明如下:

此时一切正常,缓冲区没有存储在 RAM (bss) 中,我可以访问它并重写它。

当我想从其他文件编辑变量时,问题就来了。

main.c

other.c

buffer永远不要在另一个文件中更改(作为参数传递)。

我错过了什么 ?

0 投票
1 回答
2245 浏览

stm32 - stm32f4 DMA 在挂起后并不总是启动

所以这个问题是这个问题的“续集”:Stm32f4: DMA + ADC Transfer pausing

同样,我正在尝试实现这样的算法:

  1. 在一个通道上以三重交错模式使用 ADC 初始化 DMA
  2. 等待外部中断
  3. 暂停 DMA 传输和 ADC
  4. 在中断中通过 USART 从内存中发送缓冲数据
  5. 恢复 DMA 和 ADC
  6. 退出中断,转到2。

DMA 和 ADC 暂停和恢复,但有时(在大约 16% 的中断调用中)恢复失败 - DMA 只是从 ADC 写入第一个测量值并停止直到下一次中断,其中 DMA 和 ADC 重新启动(因为它们被暂停并且再次恢复)并且 - 好吧,一切都恢复正常,直到下一个这样的错误。

我试过暂停 DMA,就像参考手册说的那样:

为了从传输停止的点重新开始,软件必须在通过写入 DMA_SxCR 寄存器中的 EN 位(然后检查它是否为“0”)来禁用流之后读取 DMA_SxNDTR 寄存器,以了解传输的数量已经收集的数据项。然后:
– 必须更新外设和/或存储器地址以调整地址指针
– 必须使用要传输的剩余数据项数(流被禁用时读取的值)更新 SxNDTR 寄存器
–然后可以重新启用流以从停止点重新开始传输

唯一的实际区别是在恢复 DMA 工作时写入的 NDTR 值。在我的情况下,它是 buffer_size,在 RefMan 的情况下 - 它是暂停 DMA 时读取的值。在 RefMan 情况下,DMA 在暂停后不再启动。就我而言,正如我上面所说,它开始了,但并非总是如此。

我怎样才能防止这种情况发生?

目前的中断代码如下所示:

0 投票
2 回答
2076 浏览

c - 从微控制器 STM32F401RET6 将数据写入 micro SD 卡

我正在使用基于微控制器 STM32F401RET6 的板 Nucleo F401RE。我将一个 Micro SD 插槽连接到板上,并有兴趣将数据写入 SD 卡并从中读取数据。我使用软件 STM32CubeX 来生成代码,特别是带有内置函数的 SD 库。我试图编写一个简单的代码,它将一个数组写入一个特定的数组并尝试在后面读取相同的数据。代码如下:

虽然,我没有成功写入数据,但函数 HAL_SD_WriteBlocks() 返回值 SD_CMD_CRC_FAIL,这意味着:“收到命令响应(但 CRC 校验失败)”。我错过了什么?我多次检查硬件配置,micro SD 卡已正确连接到微控制器。如果需要,我可以添加 HAL 内置函数的实现。谢谢你。

0 投票
2 回答
7120 浏览

stm32 - stm32F4 pwm 输入捕获高频信号约。2兆赫?

我想测量 PWM 信号的频率。为此,我使用了 STM-F401RE 及其 Timer_Input_Capture 函数。

问题是:

  • 输入信号具有相当高的频率(约 2MHz),并且,
  • STM-F401RE 控制器只有 80MHz 时钟

因此,当使用中断程序对输入信号的上升沿进行计数时,它会错过许多上升沿(取决于输入信号的频率)。当使用示波器并切换 I/O 引脚时,我看到它只能在频率低于 400kHz 时捕获所有上升沿。

问题是:如何克服这个问题?还是有另一种方法来测量高频输入 pwm 信号?

谢谢

0 投票
1 回答
1626 浏览

interrupt-handling - DMA工作时不会发生STM32F4 TIM6中断

我使用 STM32F4Discovery 板,从 Cube 生成代码,SYSCLK 为 168MHz,APB1 定时器时钟 42MHz,TIM6 有预分频器 1000,计数到 62。我做了以下实验。

通过以下方式启用 TIM6 中断

使用 30 元素数组在正常模式下启动 DAC_DMA。

计算发生了多少次定时器中断

在这个函数中设置断点:

我的期望:

1) HAL_DAC_ConvCpltCallbackCh1 被调用一次(由于非循环模式)。是真的。

2) 调用时 tim6Counter 必须等于 30,因为 DAC 数据缓冲区的长度为 30。在实验中 tim6Counter 为 1。

3) DAC 完成后,在 TIM6 处理程序和 main while(1) 循环中设置断点。问题是,它挂在 TIM6 处理程序中。

问题:

1) 即使没有启用 TIM6 中断,DMA 也可以工作。但是如果启用,为什么它只发生一次,而不是每个 DMA 请求?

2)为什么它挂在计时器处理程序中?

3) TIM6 SR 寄存器不会被 HAL 宏或 HAL_TIM_IRQHandler 清除。我将 eclipse 与 openOCD 一起使用。是工具的问题吗?还是因为挂在处理程序中?

0 投票
2 回答
2945 浏览

linux - 在 Cortex-M4 STM32F4 (29I-DISC1) 上运行 Linux 4.9

我花了几天时间试图理解,但我被困住了。在我的 STM32F429I-DISC1 板上输入“bootm 8100000”后,我只收到“正在启动内核...”消息。

在我将 uboot 从 2011 年更新到 2016 年之前,它是“正在启动内核...”+ UNHANDED EXCEPTION HARDFAULT,但现在我只有“正在启动内核...”消息。

MCU是一个stm32F429,2MB Flash + ext。8MB 内存。

Flash start addr 是0x08000000 (uboot addr),我把内核放在第二个 flash bank 的开头 0x08100000

外部 8MB RAM 的开始是0xD0000000

u-boot-2016.11 似乎在那块板上运行得很好,bdi 给我:

这就是我构建内核的方式:

这是 bootm 命令的完整输出:

使用“robutest”/“emcraft”内核/配置文件,我得到了相同的日志,除非入口点看起来更正确,因为它是 08100001。

在 robutest/emcraft 内核上,我尝试激活板子的 LCD 屏幕,但没有任何反应。

在我所有的测试中,我激活了内核配置“early printk”和“DEBUG_LL_xxx”的东西。

这是我的 .config 文件的链接:http: //pastebin.com/gBNYx3Gs

PS:我尝试使用 uCLinux emcraft/robutest 试图找出发生了什么,但我的主要目标是运行 Linux 4.9。

谢谢你读我!!!

编辑:我试图通过 dtb“旧方式”,但结果相同:

我很绝望,欢迎任何想法:'(

EDIT2:我尝试用 u-boot 解压内核,结果是一样的:

EDIT3:我检查了 dtb 中的内存/USART1 地址,没关系。为什么我没有内核的消息?

EDIT4:使用 uxipImage:

我尝试了不同的入口点,08060000、08060040 和 08060041。

0 投票
1 回答
71 浏览

freertos - FreeRtos如何在上下文切换时存储函数地址

我在我的项目中使用 freertos。我的代码卡在硬故障处理程序中,我想知道上次执行的函数地址或上次执行的行地址以进行调试。当 PC 指向硬故障处理程序时如何调试代码。