问题标签 [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.
can-bus - STM32F4xx CAN 滤波器配置
我正在参考参考手册(bxCAN)中的信息写作。
我正在尝试了解CAN
过滤器配置的工作原理,需要您的帮助来检查我是否理解正确。
尤其是过滤器ID和过滤器掩码ID的配置。
在我看了一下stdPeriphLib
和参考之后。手册,我认为了解会发生什么,但我不确定。
FilterId 高/低:
FilterIdHigh/Low 是CAN Controller
二进制 AND 之后的比较值FilterIdMask
吗?
eg: CAN Controller 接收到消息 --> CAN_Rx_
将CAN Controller
Result 与 FilterId 进行比较。
如果匹配CAN Controller
,则将 CAN_Rx_ 消息放入分配的 FIFO,否则将丢弃该消息。
不是吗?
谢谢。
c++ - 嵌入式序列化 - 使用没有 RTTI 的谷物?
我想在嵌入式系统中使用 Cereal 1.2.1,所以我不能使用 RTTI,因为它会增加很多代码大小。我不得不放弃对 typeid 的支持。有没有办法在没有 RTTI 的情况下使用谷物?我序列化的结构不是多态的,只是一些数字和数字数组的容器。
如果有帮助,我正在使用 gcc 5.4.1。
谢谢。
c - 如何在调试时隐藏我的 C 库代码
我想将我的 C 函数创建为库,并且我想对每个人隐藏我的代码
我希望每个人在调试时都看不到 C/Assemble 代码。
所以我使用 IAR 创建一个 C 库文件并设置Project → Option如下
- 通用选项→输出→输出文件:库
- 常规选项 → 库配置 → 库:无
- C/C++ 编译器 → 输出:[未选中] 生成调试信息
- 汇编器→输出:[未选中]生成调试信息
之后,我使用我创建的库并尝试调试。我可以将我的库视为汇编代码,但我不想要它。
那么我该如何隐藏它。
例子:
我创建了一个示例函数
图书馆计划
申请项目
c - STM32,存储在闪存中的变量无法在其他文件中更新
我使用的是 STM32F411RE。因为我的 RAM 中没有更多的内存。我决定在我的闪存中存储大变量。为此,我在section.ld
.
在main.c
文件中,我将变量声明如下:
此时一切正常,缓冲区没有存储在 RAM (bss) 中,我可以访问它并重写它。
当我想从其他文件编辑变量时,问题就来了。
main.c
other.c
buffer
永远不要在另一个文件中更改(作为参数传递)。
我错过了什么 ?
stm32 - stm32f4 DMA 在挂起后并不总是启动
所以这个问题是这个问题的“续集”:Stm32f4: DMA + ADC Transfer pausing。
同样,我正在尝试实现这样的算法:
- 在一个通道上以三重交错模式使用 ADC 初始化 DMA
- 等待外部中断
- 暂停 DMA 传输和 ADC
- 在中断中通过 USART 从内存中发送缓冲数据
- 恢复 DMA 和 ADC
- 退出中断,转到2。
DMA 和 ADC 暂停和恢复,但有时(在大约 16% 的中断调用中)恢复失败 - DMA 只是从 ADC 写入第一个测量值并停止直到下一次中断,其中 DMA 和 ADC 重新启动(因为它们被暂停并且再次恢复)并且 - 好吧,一切都恢复正常,直到下一个这样的错误。
我试过暂停 DMA,就像参考手册说的那样:
为了从传输停止的点重新开始,软件必须在通过写入 DMA_SxCR 寄存器中的 EN 位(然后检查它是否为“0”)来禁用流之后读取 DMA_SxNDTR 寄存器,以了解传输的数量已经收集的数据项。然后:
– 必须更新外设和/或存储器地址以调整地址指针
– 必须使用要传输的剩余数据项数(流被禁用时读取的值)更新 SxNDTR 寄存器
–然后可以重新启用流以从停止点重新开始传输
唯一的实际区别是在恢复 DMA 工作时写入的 NDTR 值。在我的情况下,它是 buffer_size,在 RefMan 的情况下 - 它是暂停 DMA 时读取的值。在 RefMan 情况下,DMA 在暂停后不再启动。就我而言,正如我上面所说,它开始了,但并非总是如此。
我怎样才能防止这种情况发生?
目前的中断代码如下所示:
c - 从微控制器 STM32F401RET6 将数据写入 micro SD 卡
我正在使用基于微控制器 STM32F401RET6 的板 Nucleo F401RE。我将一个 Micro SD 插槽连接到板上,并有兴趣将数据写入 SD 卡并从中读取数据。我使用软件 STM32CubeX 来生成代码,特别是带有内置函数的 SD 库。我试图编写一个简单的代码,它将一个数组写入一个特定的数组并尝试在后面读取相同的数据。代码如下:
虽然,我没有成功写入数据,但函数 HAL_SD_WriteBlocks() 返回值 SD_CMD_CRC_FAIL,这意味着:“收到命令响应(但 CRC 校验失败)”。我错过了什么?我多次检查硬件配置,micro SD 卡已正确连接到微控制器。如果需要,我可以添加 HAL 内置函数的实现。谢谢你。
stm32 - stm32F4 pwm 输入捕获高频信号约。2兆赫?
我想测量 PWM 信号的频率。为此,我使用了 STM-F401RE 及其 Timer_Input_Capture 函数。
问题是:
- 输入信号具有相当高的频率(约 2MHz),并且,
- STM-F401RE 控制器只有 80MHz 时钟
因此,当使用中断程序对输入信号的上升沿进行计数时,它会错过许多上升沿(取决于输入信号的频率)。当使用示波器并切换 I/O 引脚时,我看到它只能在频率低于 400kHz 时捕获所有上升沿。
问题是:如何克服这个问题?还是有另一种方法来测量高频输入 pwm 信号?
谢谢
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 一起使用。是工具的问题吗?还是因为挂在处理程序中?
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。
freertos - FreeRtos如何在上下文切换时存储函数地址
我在我的项目中使用 freertos。我的代码卡在硬故障处理程序中,我想知道上次执行的函数地址或上次执行的行地址以进行调试。当 PC 指向硬故障处理程序时如何调试代码。