问题标签 [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.
stm32 - STM32Cube:FreeRTOS 10.0.1 和 CMSIS v2 生成警告
我正在使用 STM32Cube 生成带有 FreeRTOS 10.0.1 和 CMSISv2 API 的 IAR EW 8.2 项目。当我清理项目并再次构建时,我收到以下警告
警告[Pe177]:变量“hTask”已声明但从未被引用
警告[Pe177]:变量“hTimer”已声明但从未被引用
警告[Pe177]:变量“hEventGroup”已声明但从未被引用
警告[Pe177]:变量“hSemaphore”已声明但从未被引用
警告[Pe177]:变量“hQueue”已声明但从未被引用
我知道这些警告不应该影响我的代码,但是如果这些警告总是存在或者它们是否取决于我的设置,我会很感兴趣。
c - stm32CubeMX 的 cmsis_os.c 有修复吗?
我正在使用 STMCubeMX 中提供的 cmsis_os.c 和 cmsis_os.h。我发现至少有两个地方是 cmsis_os.c 应该修复的。
第一个:
TaskFunction_t 是否应该替换为 TimerCallbackFunction_t?
第二个:
我认为它必须是:
你怎么看?
有没有办法让 STMCubeMX 生成修补文件而不是原始文件?
谢谢,阿尔贝托
arm - STM32CubeIDE 中的 CMSIS DSP
我想使用 CMSIS 中的 DSP 功能。我正在使用 STM32CubeIDE,我的目标板是 ST32F411RE Discovery。使用 CMSIS DSP 和 Keil uVision 非常简单,你只需选择你想要的包并使用它,但使用 STM32CubeIDE 就没那么简单了。CMSIS 包含在最新的固件包 STM32Cube_FW_F4_V1.24.2 中,但 CubeMX 或 IDE 中似乎没有任何选项可以添加 DSP 库(固件包中存在)。默认情况下会添加 CORE 库。我已将 DSP Include 和 Source 文件夹添加到我的工作区,我已将包含路径添加到 IDE,但是当我添加
#include "arm_math.h
到 main.c
我收到一条错误消息,告诉我
fatal error: arm_math.h: No such file or directory
它针对每个DSP源文件。
在过去的几天里,我一直在试图克服这一点。有没有人在 STM32CubeIDE 中使用过 CMSIS DSP 功能,如果有,他们是如何设法设置 CMSIS DSP 与 IDE 一起工作的?我的设置还有什么可以尝试的吗?我很惊讶集成的 CubeMX 代码生成器不提供包含 DSP 的选项。
非常感谢
multithreading - 阻止除一个之外的所有线程的最佳方法是什么?
我正在做一个项目,当某个线程开始执行时,我需要阻塞所有线程。我考虑过使用线程标志,但我相信这将涉及向所有线程添加检查。我还考虑过使用互斥锁来阻止除我需要执行的关键线程之外的所有线程/拥有对处理器的唯一控制权。我还没有使用互斥锁的原因是因为我已经读过它只与资源有关,并且如果它们没有链接到互斥锁,某些线程仍然会继续执行,但是我可能误解了这一点。
您能否告诉我我对互斥体想法的方法是否正确,或者我是否应该使用另一种方法?
编辑:我在 STM32H753 芯片上使用 Keil RTX 5/CMSIS RTOS 2
谢谢
git - Should CMSIS libraries be included in version control?
Normally, I used to include device specific headers & sources provided by the chip vendor (ST) and CMSIS-Core headers in version control. There are not many of them and I didn't have a habit to update them. I use STM32 microcontrollers, but I don't use the CUBE framework or the Standard Peripheral Library.
Recently, I needed to use CMSIS-DSP libraries. CMSIS-DSP library comes with a large number of header and source files. I decided to use the precompiled library (libarm_cortexM4lf_math.a), which is around 5.4 MB. But now I started to question if they should go into the version control.
I know that managing the binary files in version control isn't a good idea. But as far as I know, CMSIS is not updated very often. So I'm confused. These are the options I can think of:
- Include CMSIS headers and static binaries in repo: It may be good idea if I decide not to update these libraries. CMSIS itself doesn't get new releases very often and even if a new version is released, it may not be necessary to update it in the project. Or I may skip a few releases before I update it in my project.
- Include CMSIS header and source files in repo: Similar to option 1, but git will be happier to work with text files instead of a 5+ MB binary. But I'm not sure if letting 3rd party code changes to contaminate my source history is a good idea (Option 1 suffers the same problem, but header files only).
- Don't include CMSIS in repo: This results in a clean repo, but then I have to manually copy library files into project directory after cloning the project. I can also specify a system wide installation folder for CMSIS and add it to the project but it causes a "works-on-my-machine" situation.
- Find a way to fetch the library automatically: The first thing comes to mind is git submodules. However, I'm not sure if fetching the whole CMSIS repo will work, because I need to restructure it as there are lots of unneeded files, including precompiled binaries. I guess I need some kind of post processing script?
What is the best approach here? Can there be other options?
There is a similar question here: Storing third-party libraries in source control It seems people have different opinions about the subject. But I believe using CMSIS in an embedded C project is a specific case and deserves its own question.
c - STM32F03和ESP-8266-01之间的UART通信
我正在尝试让智能手机应用程序与 MCU (STM32F030R8) 进行通信。我目前正在进行的步骤是让 WiFi 模块与 MCU 通信。在使用 Arduino Uno/PC 终端时,我可以使用 AT 固件来配置 ESP,但基本上想通过 STM 板做同样的事情。
当我将代码加载到 STM 并使用 Tera Term 向 STM 发送数据时,它应该能够向 ESP 发送 AT 命令,但它不起作用。现在我不知道为什么这不起作用。我正在寻找关于我可能错过的代码或我忽略/不知道的其他原则的指针。
过去几天我在互联网上进行了搜索,但没有找到太多有用的信息。这实际上是我对 C 的经验的总结。感谢您的帮助!
硬件设置如下...
我一起弗兰肯斯坦的代码如下。我正在使用 Keil uVision 5。
编辑:
我稍微修改了代码并继续尝试。当尝试更改广播的网络名称/密码时(它不起作用),它现在始终以命令中的前两个键入字符进行回复,过了一会儿提出了乱码,看起来应该是用“AT”召唤出来的+GMR”命令。以下代码是上传到设备的代码。关于这怎么可能发生的任何想法?谢谢!
c - 通过 SPI 使用 STM32F030R8 控制 AMIS-30543
我正在尝试让我的 STM32 板使用 SPI 控制步进电机(使用 AMIS-30543 驱动器、26M024B2B 步进电机)。我正在使用 Keil uVision 5 并在 C 中采用裸机方法。我的问题是电机没有旋转,我不确定错误隐藏在哪里。我将不胜感激输入指出我在这方面出了什么问题,以及如何解决它。感谢您的时间!
我将它连接在一起,如下所示。
我写的代码如下。代码尝试写入驱动器的控制寄存器,然后切换 NXT 引脚,以便电机根据其控制寄存器在每次切换时递增。为了您的方便,我已通读驱动程序的数据表并将其链接到这篇文章。
数据表上相关的部分是 SPI 接口部分(第 31 页)以及表 11 和 12 以及图 19。我的解释是,可以通过向驱动程序发送一个 8 位消息来写入驱动程序,该消息指定什么命令的类型和数据的去向,然后是 8 位数据,这些数据将填充控制寄存器。我使用以下逻辑组装了第一个数据包...
更新:
这是我尝试的第二次迭代。我浏览了更多文档和示例,并试图从驱动程序那里得到响应,以证明我正确地写入了驱动程序的寄存器。到目前为止,我没有得到回应。在这个时候,尝试翻译这些库对我来说太困难和困惑了(也许我遗漏了一些明显的东西?),所以我仍然采用简单的方法。
非常感谢您迄今为止的帮助,@ralf htp。
更新:
我已经根据此处和此处设置的说明使用上述库设置了 Arduino Uno 。步进电机不旋转。我换了另一个驱动器,步进电机仍然没有旋转。我可以有两个有问题的驱动程序吗?
更新:我已经浏览了 ralf htp 提到的库,并尽我所能翻译了它们。我现在可以通过 SPI 从驱动程序获得响应,但我得到的唯一值是“0xFF”。在一个实例中,我得到了预期的控制寄存器响应,但它没有重复,我正在尝试重新创建确切的设置(尽管我很确定我已经有了)。新代码如下。
arm - 在没有 IDE 的情况下如何使用 CMSIS?
我正在使用 STM32F103C8T6 并想使用 CMSIS,它本质上只是寄存器定义,没有代码,让我的生活更轻松,同时仍然保持在低水平。问题是我不知道如何安装库以在 Makefile 的命令行上使用。所有文档似乎都与特定于供应商的 IDE 绑定,例如 STM32CubeIDE。
我想首先要做的是下载我在GitHub 上找到的 CMSIS 库。但是,解压缩后,ARM.CMSIS.5.6.0.pack
我没有找到名为stm32f10x.h
. 我花了一些时间,为我正在使用的特定 MCU 找到了一个 CMSIS 包core_cm3.h
,但它不包含ARM.CMSIS.5.6.0.pack
. 该文件说我需要将两者都包含到我的项目中,所以我需要将从不同地方下载的文件复制到我的项目中,还是什么?
作为一个额外的问题:CMSIS和Keli之间是什么关系?特定于设备的 CMSIS 包是从 下载的www.keil.com
,但我现在不想使用 Keil MDK,因为它似乎是一个商业产品,而 GNU Arm 工具链为我提供了很好的服务。
编辑:我应该从一开始就更具体,但现在让我们关注如何将基本 CMSIS 示例构建为一个最小、完整和可验证的示例。
我做了什么:
- 分别将 CMSIS-Core 和 CMSIS-DFP 下载并解压缩到
/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/
和/Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/
。 - 创建一个名为 的文件,并将基本示例
main.c
的内容复制到其中。 - 添加
#define STM32F10X_MD
在第一行以指定芯片。 - 修正错别字:将第
:
31 行;
替换为 ,将第 33 行替换为timer1_init (42);
. - 构建并得到一个错误
根据下面@KamilCuk 的评论,我添加了更多选项并注释掉了函数Get_InputValues
、Calculation_Response
和Output_Response
,但现在我遇到了一些不同的错误。
embedded - fatfs f_write 在传递指向邮件队列中数据的指针时返回 FR_DISK_ERR
我正在尝试使用 FreeRTOS 将 ADC 数据写入 STM32F7 上的 SD 卡,并且我正在使用 CMSIS-RTOS API 的 V1。我正在使用邮件队列,并且我有一个包含数组的结构。
在 ADC 半/完整中断上,我将数据添加到队列中,并且我有一个消费者任务将这些数据写入 sd 卡。我的问题在我的消费者任务中,我必须对另一个数组执行 memcpy,然后将该数组的内容写入 sd 卡。
这按预期工作,但如果我尝试将此行更改为
为了摆脱 memcpy,f_write 返回FR_DISK_ERR
。任何人都可以帮助阐明为什么会发生这种情况,我觉得额外的 memcpy 没用,您应该能够将指向队列的指针直接传递给 f_write。
multithreading - xSemaphoreGive() 被不同线程使用时卡住
我正在使用 FreeRTOS 开发 STM32F756ZG。我有一个使用 osThreadDef() 制作的网络线程,它是 CMSIS-RTOS API 的一部分。我还有其他正在运行的任务,这些任务是使用 xTaskCreate() 创建的,它是 freeRTOS API 的一部分。
我有一个由 tempSensor 和 EEPROM 共享的信号量。在网络线程中,我尝试使用 I2C 协议从 EEPROM 中获取 IP 地址的值。它使用 xSemaphoreTake() 成功获取了 Semaphore,但是当它使用 xSemaphoreGive() 放弃 Semaphore 时它会丢失,当我点击暂停时,它会停留在 I2C_WaitOnFlagUntilTimeout() 中。因此它永远不会加载网页。
其他任务运行良好,也使用 I2c 和信号量的温度传感器正确返回值。
所以我的问题是,如果这个问题是因为在两个线程之间使用信号量而产生的,每个线程都是由不同的 OS API 生成的。我真的在为此苦苦挣扎,任何帮助都将不胜感激。非常感谢!
我在这里添加一个小代码片段。
这就是我的信号量的初始化方式:
以下是我读取 EEPROM 时的代码:
下一个代码片段是当我从温度传感器读取数据时:
当我从引导加载程序跳转到应用程序并尝试从 EEPROM 中读取值时,我可以获取信号量,但我不会使用 xSemaphoreGive() 将其返回。