问题标签 [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.
c++ - 只读内存映射寄存器在 C 中用 `volatile const` 定义,但在 C++ 中只有 `volatile`
在使用 Atmel SAM3X8E 处理嵌入式系统项目时,我注意到一些 CMSIS 头文件中有以下代码。
为什么 C++ 的 typedef 不包括const
?我在某处看到提到 C++ 不在运行时内存中存储整数 const 变量,如果为真则意味着const
由于微控制器寄存器的内存映射方式需要删除,但我似乎找不到任何其他说明C++ 做到了(尽管我的搜索确实很简短)。对 C++ 没有太多经验,我还认为可能是 C++ 不允许const
结构成员,因为这些类型定义主要用于结构类型定义中用于寄存器集合,但似乎也并非如此。
c - 链接期间可以在库之间解析弱符号吗?
我的场景是关于交叉编译到 Arduino Due(ARM 目标),但我想这是一个通用的 C 弱符号问题。
我想将我的固件分成 3 个部分: 1. 硬件库(CMSIS,中间件)-> libHardware.a 2. 实时操作系统库 -> libOS.a 3. 应用程序代码 -> 链接到上面的 Output.elf。
引用的 CMSIS 实现声明了以下内容:
CMSIS 设计的想法是让应用程序代码有选择地实施和处理一些 IRQ。
libHardware.a 的 nm 报告
在我的场景中,我想在 libOS.a 中实现这些 IRQ 处理程序。
我实现了 void SysTick_Handler(void),nm 报告:
然后我将它们链接在一起,这基本上归结为
(分组是必要的,因为操作系统依赖于底层硬件函数。硬件需要调用操作系统提供的 IRQ/main() 函数)
纳米报告:
还是很弱!我希望它使用 libOS.a 中定义的强符号。最后,没有处理 SysTick,这当然会导致灾难性的失败。
另一方面,如果我没有在 libHardware/startup_sam3xa.c 中将它们声明为弱,那么一切正常。如果我选择在 app/app.c 中实现 SysTick_Handler,它也是强链接的。
所以我的问题是:libOS.a 如何实现 libHardware.a 中定义的弱处理程序?或者在这些固件开发场景中,最佳实践是什么?
c - 用于恩智浦 LPC1769 的 CMSIS
我下载了 CMSIS 第 3 版,但在使用时遇到了一些问题。主要问题在 startup_device.s 中。我不知道如何正确完成这个文件,也找不到任何好的文档。有没有人尝试使用这个 cmsis 版本?如何进行?正如我在标题中所说,我使用的是 NXP LPC1769。
谢谢
microcontroller - Cortex-M3 (LPC1787) 上的 SSP1/GPDMA 传输示例
我尝试利用 GPDMA 控制器访问 SSP1 通道。使用 CMSIS 库,这应该是全面的。但我在 SSP1 输出上看不到任何东西。
作为第一个示例,我想发送一个字节。
注释:(A)我改变了大小:0、1、20,几个值没有变化(B)CMSIS 实现总是重置 DMAREQSEL 寄存器中的位。由于我认为必须设置,我添加了这一行。但结果并没有改变。
当我使用直接读取/写入 LPC_SSP1 寄存器的 SSP 轮询功能时,我可以在逻辑分析仪上看到传输。但是当使用 GPDMA 时什么也没有发生。方法有什么问题?
那里有一个可行的例子吗?
c - CMSIS 和外围设备驱动程序
CMSIS 文件和外围驱动程序文件中写入了哪些类型的代码。我怎样才能区分它们?任何例子都会更有帮助。谢谢你。
stm32 - 可以在 stm32f10 中使用 GPIO_Set cmsis 功能设置两个引脚吗?
可以像这样将 2 个引脚设置为高电平GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
:
网上的stm32f10外设库(这里)说:
此参数可以是 GPIO_Pin_x 的任意组合,其中 x 可以是 (0..15)
但在GPIO_SetBits
函数内部有:
它指的是一个简单的宏,将每个输入作为单个引脚进行检查:
c++ - 有什么理由在 C 中声明“volatile const”,而在 C++ 中只声明“volatile”?
我在我的项目中使用了一个具有以下定义的头文件:
在__I
另一个头文件中使用如下:
我的问题是为什么要__I
在 C 中使用 const 而不是在 C++ 中?你仍然可以修改 CR 指向的值,因为你有地址,但我只是好奇为什么定义__I
不同。
对于任何对它的用途或来源感兴趣的人,__I
定义来自 IAR Embedded Workbench ARM for Cortex-M4,结构来自德州仪器 LM4F120H5QR CMSIS 文件。
arm - JTAG 适配器 ULINK-ME 和 openocd(在 ArchLinux 上)
我今天从官方 Arch Linux 存储库安装了 Openocd,现在正尝试将它与我的 JTAG 适配器ULINK-ME一起使用。我发现ULINK-ME使用CMSIS-DAP调试固件。Openocd 有 CMSIS-DAP 驱动程序,因此应该能够与我的适配器通信,但是在我编写下面的命令后,我得到了一个错误。
我将 ULINK-ME 连接到集成了微控制器 LPC3141 的板EA3141 - 与我为其加载配置文件的 LPC3131 近亲。
有谁知道我为什么会收到错误消息?
我也尝试以另一种方式启动它,但它再次打印错误。这次有点不同。
更新:
ULINK-ME 的 `sudo lsusb -v 命令的输出是:
因为其中没有字符串“CMSIS-DAP”,我猜这意味着我有一个没有 CMSIS-DAP 固件的旧 ULINK-ME(2013 年之前购买)适配器。我希望 Keil 提供一些将 CMSIS-DAP 刷新到我的旧 ULINK-ME 的方法。
解决方案:
我写信给 Keil,他们声称 ULINK-ME 的固件可以更新,这是真的。他们向我指出了这三个链接:
2. - 如果 Keil uVision 在第 1 点中没有自行完成,则升级。
我必须在 Windows 机器上安装 MDK-ARM v5,然后单击工具栏上一个非常隐藏的图标(魔杖)。在调试中,我选择了 ULINK2/ME 选项,它自己更新了我的固件。现在我的 ULINK-ME(旧型号)上有一个 CMSIS-DAP,我可以通过以下方式确认sudo lsusb -v
:
我尝试使用 Wine 来做到这一点,但这是不可能的。至少现在我不再需要 Windows。
c - 嵌入式 C#define
在嵌入式 C 中,我遇到了以下(以及更多类似的)示例:
GPIOA_AHB_BASE 是一个地址,它是之前定义的。这段代码究竟做了什么?我知道定义是预处理器的指令,因此它用定义中给出的值替换所有实例。例如,
将用已定义的任何值 GPIOA_AHB_BASE 替换 GPIOA_AHB。我不明白在第一种情况下发生了什么......
arm - CMSIS 寄存器值
我刚刚开始探索 ARM 控制器的 CMSIS。使用它似乎很方便,但是我想知道实际的寄存器值在哪里定义。让我们以 GPIO 为例。
有一个结构 GPIOA_AHB_Type 定义了各种成员。然后,对于 GPIOB,定义了一个内存(或寄存器?)地址,比如说 GPIOB_AHB_BASE。之后,将指针设置为 GPIOB_AHB_BASE,如下所示:
以 GPIOB_AHB 的成员变量为 GPIOB_AHB->DIR 为例,设置它的输入或输出。我的问题是,这些成员变量究竟是在哪里初始化的?我猜寄存器的实际地址是特定于设备的,所以我试图在特定于设备的标头中找到它们,但我发现的只是 GPIOB_AHB_BASE 定义和成员变量的声明。编译器如何知道当我键入 GPIOB_AHB->DIR 时,我想写入设置该端口 I/O 方向的寄存器?