我在我的项目中使用了一个头文件,其中包含以下定义:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions*/
#else
#define __I volatile const /*!< Defines 'read only' permissions*/
#endif
Run Code Online (Sandbox Code Playgroud)
将__I被用作在另一头文件如下:
typedef struct {
// more members before
__I uint32_t CR; /*!< GPIO Commit*/
// more members after
} GPIOA_Type;
#define GPIOF_BASE 0x40025000UL
#define GPIOF ((GPIOA_Type *) GPIOF_BASE)
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么__I在C中使用const而不是在C++中?您仍然可以修改CR指向的值,因为您有地址,但我只是好奇为什么定义__I不同.
对于任何感兴趣的人来说,这些__I定义来自IAR Embedded Workbench ARM for Cortex-M4,结构来自德州仪器LM4F120H5QR CMSIS文件.
在使用Atmel SAM3X8E处理嵌入式系统项目时,我注意到某些CMSIS头文件中的以下代码.
#ifndef __cplusplus
typedef volatile const uint32_t RoReg; /**< Read only 32-bit register (volatile const unsigned int) */
#else
typedef volatile uint32_t RoReg; /**< Read only 32-bit register (volatile const unsigned int) */
#endif
Run Code Online (Sandbox Code Playgroud)
为什么C++的typedef不包含const?我在某处看到C++没有在运行时内存中存储整数const变量,如果为true则意味着const由于微控制器寄存器的内存映射方式需要删除它,但我似乎无法找到其他任何说法C++就是这样做的(尽管我的搜索非常简短).我没有太多的C++经验,我也认为可能是C++不允许使用conststruct成员,因为那些typedef主要用于struct typedef中的寄存器集合,但似乎也不是这样.
CMSIS 文件和外围驱动程序文件中编写了哪些类型的代码。我如何区分它们?任何例子都会更有帮助。谢谢你。
更新\n对于任何感兴趣的人,这里有关于如何构建裸机 USB 堆栈、如何处理此类项目以及每个步骤需要了解的内容的分步说明和解释:STM32USB@GitHub
\nTLDR: \n我有一个STM32G441并且想要实现一个 USB 驱动程序,而不使用任何 HAL 库,只使用 CMSIS - 为了学习经验,为了空间,因为我想做的事情无论如何都需要更改 hal。
但我无法让这个东西接收任何东西。我在尝试获取设备地址时遇到了困难,该地址从未交给代码。hal 中间件工作得很好,所以这不是硬件问题。
\n我正在启用 USB 时钟(正如我所假设的那样,因为它可以使用我的逻辑分析仪发送 ACK 信号),按照数据表中的定义为 USB 外设通电,启用所有必要的中断并通过初始化BTable 和端点 0。现在我希望收到一个从未出现过的 CTR 中断。
\n\n\xce\xbcC 在 25MHz HSE 时钟上运行。USB 外设在 ~48MHz 的 PLL Q 时钟上运行,RCC 设置通过 CubeMX 时钟配置器进行验证。AHB 以半速运行,因为如果我尝试全速运行它,我会遇到总线错误硬故障,但这是另一个问题。系统时钟设置为 143.75MHz。
\nRCC->CR |= RCC_CR_HSEON | RCC_CR_HSION;\n\n// Configure PLL (R=143.75, Q=47.92)\nRCC->CR &= ~RCC_CR_PLLON;\nwhile (RCC->CR & RCC_CR_PLLRDY) {\n}\nRCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE | RCC_PLLCFGR_PLLM_0 | (23 << RCC_PLLCFGR_PLLN_Pos) …Run Code Online (Sandbox Code Playgroud) FreeRTOS和CMSIS-RTOS有什么区别?谁能解释两个RTOS是相似还是不同?
我想使用 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 的选项。
非常感谢
我正在使用 STM32F103C8T6,并希望使用 CMSIS,它本质上只是寄存器定义,没有代码,让我的生活更轻松,同时仍保持在较低水平。问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用。所有文档似乎都与特定于供应商的 IDE(例如 STM32CubeIDE)绑定。
我想要做的第一件事是下载 CMSIS 库,我在GitHub上找到了它。但是解压后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 示例作为最小、完整且可验证的示例。
我做了什么:
/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 行替换为 …我正在研究在STM32F407微控制器(基于ARM Cortex M4)上开发支持openSSL-FIPS的嵌入式蓝牙应用的可行性.该应用程序不能在Linux,Windows或andriod等通用操作系统上运行,但它可以在CMSIS-RTX RTOS上运行.我在Windows中使用Keil作为开发环境,内置armc编译器(armcc)进行编译.
在我的分析过程中,我找到了OpenSSL wiki,它解释了如何构建和安装openSSL库:编译和安装.在页面中虽然有一个用于ARM平台编译的部分,但没有关于如何进行编译的描述.
我还讨论了关于在ARM中交叉编译openSSL的stackoverflow中的一些讨论.但所有这些讨论都基于ARM + Linux,而且没有一个是在RTOS上.
我在使用ARM编译时也经历了以下链接
但这里指定的编译器是GCC.
是否有可用于上述平台的库?
是否可以使用RTOS将openSSL移植到ARM Cortex M4平台?更具体的是可以使用CMSIS RTX将其移植到STM32F407吗?
如果有可能,我应该从哪里开始,它有多复杂?
如果我在GCC编译器中编译openSSL库并在armc编译的应用程序中使用它会工作吗?(我有一种感觉,它不会)
我可以在嵌入式软件中使用哪些其他SSL库?(我听说WolfSSL可能是一个选择)
我正在使用 STM32F107VC 微控制器实现高频(> 100kHz)数据采集系统。它使用spi外设与高频ADC芯片进行通信。我必须使用实时操作系统。我怎样才能做到这一点?
我尝试过 FreeRTOS,但它的最大滴答频率为 1000Hz,所以我无法使用 FreeRTOS 每隔 1us 运行一个线程。我也试过Keil RTX5,它的tick频率可以达到1MHz,但我在某处研究过,不建议将tick频率设置高,因为它会增加整体上下文切换时间。所以我该怎么做?谢谢。
我想在 STM32 上使用 CMSIS 启动项目。网上一搜,没找到具体的教程。有些使用 SPL 开始项目(ST 已停止使用)。我想要一个在 stm32cube 上学习 CMSIS 的资源。
如果有人帮助我,我会很高兴。
问候