问题标签 [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.

0 投票
3 回答
2575 浏览

c++ - 只读内存映射寄存器在 C 中用 `volatile const` 定义,但在 C++ 中只有 `volatile`

在使用 Atmel SAM3X8E 处理嵌入式系统项目时,我注意到一些 CMSIS 头文件中有以下代码。

为什么 C++ 的 typedef 不包括const?我在某处看到提到 C++ 不在运行时内存中存储整数 const 变量,如果为真则意味着const由于微控制器寄存器的内存映射方式需要删除,但我似乎找不到任何其他说明C++ 做到了(尽管我的搜索确实很简短)。对 C++ 没有太多经验,我还认为可能是 C++ 不允许const结构成员,因为这些类型定义主要用于结构类型定义中用于寄存器集合,但似乎也并非如此。

0 投票
3 回答
1336 浏览

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 中定义的弱处理程序?或者在这些固件开发场景中,最佳实践是什么?

0 投票
1 回答
794 浏览

c - 用于恩智浦 LPC1769 的 CMSIS

我下载了 CMSIS 第 3 版,但在使用时遇到了一些问题。主要问题在 startup_device.s 中。我不知道如何正确完成这个文件,也找不到任何好的文档。有没有人尝试使用这个 cmsis 版本?如何进行?正如我在标题中所说,我使用的是 NXP LPC1769。

谢谢

0 投票
1 回答
500 浏览

microcontroller - Cortex-M3 (LPC1787) 上的 SSP1/GPDMA 传输示例

我尝试利用 GPDMA 控制器访问 SSP1 通道。使用 CMSIS 库,这应该是全面的。但我在 SSP1 输出上看不到任何东西。

作为第一个示例,我想发送一个字节。

注释:(A)我改变了大小:0、1、20,几个值没有变化(B)CMSIS 实现总是重置 DMAREQSEL 寄存器中的位。由于我认为必须设置,我添加了这一行。但结果并没有改变。

当我使用直接读取/写入 LPC_SSP1 寄存器的 SSP 轮询功能时,我可以在逻辑分析仪上看到传输。但是当使用 GPDMA 时什么也没有发生。方法有什么问题?

那里有一个可行的例子吗?

0 投票
2 回答
2665 浏览

c - CMSIS 和外围设备驱动程序

CMSIS 文件和外围驱动程序文件中写入了哪些类型的代码。我怎样才能区分它们?任何例子都会更有帮助。谢谢你。

0 投票
2 回答
417 浏览

stm32 - 可以在 stm32f10 中使用 GPIO_Set cmsis 功能设置两个引脚吗?

可以像这样将 2 个引脚设置为高电平GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

网上的stm32f10外设库(这里)说:

此参数可以是 GPIO_Pin_x 的任意组合,其中 x 可以是 (0..15)

但在GPIO_SetBits函数内部有:

它指的是一个简单的宏,将每个输入作为单个引脚进行检查:

0 投票
1 回答
656 浏览

c++ - 有什么理由在 C 中声明“volatile const”,而在 C++ 中只声明“volatile”?

我在我的项目中使用了一个具有以下定义的头文件:

__I另一个头文件中使用如下:

我的问题是为什么要__I在 C 中使用 const 而不是在 C++ 中?你仍然可以修改 CR 指向的值,因为你有地址,但我只是好奇为什么定义__I不同。

对于任何对它的用途或来源感兴趣的人,__I定义来自 IAR Embedded Workbench ARM for Cortex-M4,结构来自德州仪器 LM4F120H5QR CMSIS 文件。

0 投票
1 回答
2886 浏览

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 的固件可以更新,这是真的。他们向我指出了这三个链接:

1. - 检查序列号

2. - 如果 Keil uVision 在第 1 点中没有自行完成,则升级。

3. - 进一步操控你的 ULINK-ME

我必须在 Windows 机器上安装 MDK-ARM v5,然后单击工具栏上一个非常隐藏的图标(魔杖)。在调试中,我选择了 ULINK2/ME 选项,它自己更新了我的固件。现在我的 ULINK-ME(旧型号)上有一个 CMSIS-DAP,我可以通过以下方式确认sudo lsusb -v

我尝试使用 Wine 来做到这一点,但这是不可能的。至少现在我不再需要 Windows。

0 投票
2 回答
1094 浏览

c - 嵌入式 C#define

在嵌入式 C 中,我遇到了以下(以及更多类似的)示例:

GPIOA_AHB_BASE 是一个地址,它是之前定义的。这段代码究竟做了什么?我知道定义是预处理器的指令,因此它用定义中给出的值替换所有实例。例如,

将用已定义的任何值 GPIOA_AHB_BASE 替换 GPIOA_AHB。我不明白在第一种情况下发生了什么......

0 投票
1 回答
458 浏览

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 方向的寄存器?