问题标签 [cmsis]
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.
fft - fft 输出显示出意外的对称性
我正在对信号运行 cfft。输出似乎显示出对称性。我知道 fft 是对称的,但是代码
考虑到这一点,因为 FFTMagBuf 是输入数组长度的一半。不过,输出似乎仍然显示出对称性
箭头指向我的哨子,它显示得很好,周围有很多噪音。中间的可能是谐波(我的口哨是废话)。但左右对称很明显。
我正在使用 stm32f4 迪斯科板,样本来自板载 mems 麦克风,并且每个样本块(在本例中为 1024,给出 512 长度的 fft)通过 hann 窗口。
我正在使用 tony dicola 的 spectrogramui.py 的修改版本进行可视化。
cmake - CMAKE - find_library find_path find_file 都不起作用
所以我在这里有一个图书馆,/path/to/CMSIS/libarm_cortexM4lf_math.a
我似乎无法使用 find_library 和 Cmake 找到它。此外,我找不到带有 find_file 或 find_path 的简单文本文件。
我尝试了以下(及其多次迭代):
find_library(CMSIS_LIB libarm_cortexM4lf_math.a PATHS /path/to/CMSIS)
所以然后我想我会做一些更简单的事情并将文件保存到 /home/user/happy.txt 并尝试
find_path(TEST_FILE happy.txt /home/user)
在所有情况下,我的变量都是 NOTFOUND。
我已经阅读了 find_library、find_path 的大部分内容和略过的 find_file 的 cmake 文档。它们似乎都以相同的方式工作,我无法让它们中的任何一个工作。
我在这里想念什么?
c - CMSIS arm_rfft_fast_f32 到位根据设备给出不同的结果
我最近更新了一些代码,为基于 armV7M 的微控制器执行真正的 FFT。在注意到一些回归之后,并非所有时间都取决于我正在测试的电路板,我发现问题是我没有使用两个不同的缓冲区进行输入/输出,而是使用相同的缓冲区进行就地修改。
在进行此更改之前,我查看了 CMSIS 文档,因为它使用复杂的 FFT 来执行此操作,并且文档在此处确实说明Description
了复杂 FFT 已就地执行,因此我认为它会起作用并且确实做到了但不是在所有设备上。
我的问题是为什么这种变化适用于某些设备而不是其他设备。我就是想不通。其中一个工作板是NucleoF429ZI,有问题的是MxChip
谢谢 !
c - 如何使我的代码独立于“RTOS”?
我想编写一个需要一些 RTOS API 的模块,例如 Mbox 和任务创建 API!
我正在尝试使用结构化代码,为此我正在查看一些库,例如 "lwip" 。在“lwip”中有一个名为 Sys-arch.c 的文件,据我所知,它是 RTOS API 的抽象层!但在我的端口中,它包含 cmsis_os.h 并使用了该 API。为什么他们这样做而不是直接使用 cmsis_os ?
我应该有一个新的操作系统层以便拥有可移植代码还是 CMSIS_OS 就足够了?
arm - STM32 CMSIS FreeRTOS:从 ISR 释放 BinrarySemaphore 时触发 configASSERT
我有一个 UART 空闲中断,它应该通知任务 UART 上的活动已经结束。
为此,我使用了 BinarySemaphore,在这种情况下,它只是一个最大计数为 1 的信号量。
当我调用信号量释放函数时osSemaphoreRelease(semaphore_id_uart4_rx);
由于触发了以下断言,应用程序暂停。
宏configASSERT
扩展为
现在 pxQueue->pcHead 的值为 0,而 pxQueue->pcTail 的值为非 0。所以断言被触发了。
此断言上方的注释表明这是为了从 ISR 中捕获对 MUTEX 的使用。但是,我没有使用 MUTEX,我使用的是 BinarySemaphore !FreeRTOS FAQ 本身鼓励您使用 Semaphores 或 BinarySemaphores 在 ISR 和 Task 之间进行同步。这就是我正在做的事情。但是二进制信号量仍然被检测为导致此问题的 MUTEX。我什至尝试从 STM32CubeMX RTOS 配置中禁用 MUTEX,但它仍将其检测为 MUTEX 并崩溃。
二进制信号量和互斥量非常相似,但有一些细微的差别:互斥量包括优先级继承机制,而二进制信号量没有。这使得二进制信号量成为实现同步(任务之间或任务与中断之间)的更好选择,而互斥锁成为实现简单互斥的更好选择。
我正在使用 NUCLEO-F429ZI 板,上面有 STM32F429ZIT6,CubeMX 版本:4.27.0,固件包名称和版本:STM32Cube FW_F4 V1.21.0
代码:
主功能:
情监侦:
从 ISR 调用的函数:
embedded - FreeRTOS 卡在 osDelay 中
我正在使用 STM32F446 和使用 STM32CubeMX 创建的样板进行一个项目(用于外围设备初始化和中间件,如带有 CMSIS-V1 接口的 FreeRTOS)。我有两个使用邮箱进行通信的线程,但我遇到了一个问题:线程主体之一是
它会延迟,但永远不会出来。在同一个线程中使用邮箱和延迟是否有问题?我也尝试在它之前带来延迟for(;;)
并且它有效。
编辑:我想我可以尝试为问题添加更多细节。第一个线程发送某种类型的邮件,然后等待另一种类型的邮件;我遇到问题的线程接收邮件进入第一种类型并根据它接收到的内容执行一些代码,然后将结果作为第二种类型的邮件发送;有时它必须使用 osDelay 等待它停止工作但没有进入任何故障处理程序
c - 如何在 Atollic TrueStudio 中包含 CMSIS-DSP 标头
我正在尝试在 STM32 F411RE 板上实现 DSP 的使用,但我似乎无法在不调用大量错误的情况下包含必要的文件。
背景
我以前在 Keil uVision 中使用过 CMSIS 和 CMSIS-DSP,但考虑到 32k 的代码限制,我很快就超过了评估限制。因此,我一直在尝试将 CMSIS-DSP 包含到 Atollic TrueStudio 中,但这似乎很难实现:CMSIS-DSP 上可用的文档有限,在 Atollic TrueStudio 中实现的文档更少。
一些相关资源可以在 Atollic TrueStudio 用户指南 以及 StackOverflow 主题 #1 和 StackOverflow 主题 #2中找到 。我能找到的大多数其他相关主题只是参考 Keil uVision 或用户指南的使用,而没有更多帮助。
Atollic TrueStudio 确实包含一个内置的包管理器,其中基本 CMSIS 可供下载,但它不为 CMSIS-DSP 包提供此选项。
尝试的解决方案
我曾尝试手动下载对应的CMSIS包(STM32Cube_FW_F4_V1.24.0),并将对应的DSP包放入工程文件结构中。然后,这允许使用 DSP 功能,例如
#include arm_math.h
也arm_rfft_fast_instance_f32 S;
可以通过使用自动完成功能来调用,并因此被 IDE 识别。
然而,这个过程也会引发很多错误,因为包含的函数无法识别它们的头依赖关系(例如#include arm_math.h
)。我发现 main.c 能够识别该#include arm_math.h
命令但包含的功能却不是,但我仍然尝试通过将 CMSIS DSP 添加到包含的目录来解决这个问题(在“构建属性-> C/C++”中找到构建 --> 设置 --> 工具设置 --> C 编译器 --> 目录`)。然而,这也不能解决手头的问题。
代码结果
该函数找不到标题
但是主要可以找到完全相同的标题
并且标头包含在构建选项 -> 目录中
刚刚验证它也包含在“路径和符号”中,一旦将其包含在构建选项中,它应该自动执行 AFAIK:
更新
自从我的 OP 以来,我取得了一些进展,主要是通过弄乱包含、符号和链接器。我现在已经设法克服了最初的错误(尽管不幸的是我不知道如何),但是我现在已经为 startup_stm32 文件产生了大量额外的错误。
这些似乎都是涉及 CMSIS 中包含的模板文件(CMSIS / Device / ST / STM32F4xx / Source / Templates / ARM / ...)的错误指令错误,无法解释这些模板中列出的各种命令。
示例错误:bad instruction __heap_base
c - i2c 传输,stm32f103 作为 Master,STOP 条件生成问题
我正在使用 KEIL。这是我的 I2C 设置代码。我正在尝试使用中断进行设置。实际上,一切都像这样正常工作。但我唯一的问题是我做了一件奇怪的事情才能让它发挥作用。
如果你看一下最后几行:
这里当我调试时(这段代码,没有行(void)I2C1->SR1;),当我尝试发送数据时,第一个包将被发送而没有任何问题。最后它会产生停止条件(MSL 位将被清除,并且线路被释放),但 STOP 位将保持设置(这就是我在 I2C_transmit while 循环中放置 STOP 位检查的原因)。如果我在调试窗口中手动清除 STOP 位,它会继续,但在下一个发送周期它不会产生正确的启动(SB 将被设置,但 MSL 位将保持在复位状态)。
在调试时,如果我在此行之前放置断点:
(请记住,此时我没有找到解决这个问题的方法,所以没有这条线,一切都一样 - (void)I2C1->SR1;)
停在那里,检查寄存器,然后继续,一切正常。我在stackexchage上发现:
特别是关于读取寄存器的部分可能会给您带来调试地狱,因为调试器的读取将触发状态机,就像读取您的代码一样,所以一旦您停止并检查寄存器(有时调试器会自动完成所有操作)读取发生,外围设备将再次执行某些操作。
很明显,当我触发 STOP 条件时,有些要求没有得到满足。所以我决定检查是否是这种情况,似乎这是一个解决方案。添加读取 I2C 的任何寄存器((void)I2C1->SR1;//或任何其他 I2C 寄存器),解决了问题。必须有合乎逻辑的解释,但我找不到。我非常仔细地研究了参考手册,结果是这段代码,但我没有找到任何可以解释这一点的东西。
以下是参考手册中有关主传输的表格,供您参考:
你能说出我没有满足什么条件,所以我的 STOP 没有得到妥善处理。
arm - uint32_t 在 CMSIS 数学文件中似乎是未知的?
我收到错误消息:
CMSIS/DSP/Include/arm_math.h:3943:3:错误:未知类型名称“uint32_t”;你的意思是“wint_t”吗?
我可以将 stdint.h 添加到 arm_math.h 但我认为我首先做错了什么。如果需要,CMSIS 开发人员肯定会添加一个包含吗?有什么建议该怎么做吗?我使用了 arm-none-eabi-gcc。
c - 未知数据类型 IRQn_Type,
在尝试构建我的项目时,我收到如下错误:
或者
所以似乎没有定义 IRQn_Type 和 __NVIC_PRIO_BITS 。
据我了解,数据类型是在 stm32f407xx.h 文件中定义的,我已经告诉 make 在哪里可以找到它:-IDrivers/CMSIS/Device/ST/STM32F4xx/Include
编辑
我刚刚看到的第一个错误是:
我的模板 makefile 是由 CubeMX 生成的,但我做了一些更改(更改了我的文件夹的结构,添加了定义和包含目录)。
我得到这个错误:
如果我把这条线放在我的#include <arm_math.h>
.
也添加-D__FPU_PRESENT
到定义后,我仍然得到错误: