标签: lpc

尽管“string.h”包括对“strnlen”的未定义引用

我正在尝试在 LPCXpresso 上为 LPC1769 创建一个项目。我有一个 C 文件调用

#include <string.h>
int main()
{
    //some stuff
    strnlen(SomeString, someInt);
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

Undefined reference to 'strnlen'
Run Code Online (Sandbox Code Playgroud)

奇怪的是strcpy、strncpy或者其他常用的字符串函数都没有问题。

我正在为 Cortex-M3 处理器构建使用的编译器是:arm-none-eabi-gcc 在 Eclipse 中,我勾选了 MCU 链接器选项:没有启动或默认库我在 Ubuntu 上运行 Eclipse

虽然仅使用 strlen 绕过它可能很容易,但我实际上在使用使用 strnlen 的库时遇到了问题,而且我不想弄乱库源。

c eclipse gcc arm lpc

6
推荐指数
1
解决办法
1万
查看次数

CAN总线协议实现

我想学习并实现CAN BUS协议.我在软件中使用MSP430 Launchpad实现了UART,SPI,I2C和单线总线协议.现在我想了解CAN总线协议.我有mBed LPC 1768 Cortex M3开发板.mBed有Can Bus Library,但我想编写自己的库,以便我可以详细了解它,即我对其他通信协议的方式.

我无法找到合适的资源开始,这些材料似乎散布在网上.任何人都可以指导如何使用我提供的开发板编写和实现CAN总线协议.

谢谢

can-bus serial-communication lpc

5
推荐指数
1
解决办法
9948
查看次数

将CRC存储到AXF/ELF文件中

我目前正在研究Windows 7上的LPCXpresso(基于eclipse的)工具链中的C程序,这是一个针对NXP Cortex M3微处理器的gcc IDE.它提供了一种通过JTAG对微处理器进行编译链接编程的简单方法.构建的结果是由调试配置加载的AXF文件(ELF格式).

加载的程序驻留在闪存中,从0x00000到0x3FFFB.我想在0x3FFFC处包含一个4字节的CRC-32,以便在启动时验证程序.我添加了另一节,并使用gcc __attribute__指令访问该内存位置.

uint32_t crc32_build __attribute__ ((section(".text_MFlashCRC")));
Run Code Online (Sandbox Code Playgroud)

为了计算和存储CRC-32值,我的计划是使用SRecord以及以下的构建后步骤:

arm-none-eabi-size "${BuildArtifactFileName}"
arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin"
checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"
../util/srec_cat "${BuildArtifactFileBaseName}.bin" -binary -crop 0 0x3FFFC -fill 0xFF 0x00000 0x3FFFC -crc32-b-e 0x3FFFC -o "${BuildArtifactFileBaseName}.crc.bin" -binary
echo ""
echo "CRC32:"
../util/srec_cat "${BuildArtifactFileBaseName}.crc.bin" -binary -crop 0x3FFFC 0x40000 -o - -hex-dump
Run Code Online (Sandbox Code Playgroud)

这将创建一个带校验和的二进制文件(引导加载程序所必需的),然后在使用的闪存上计算CRC,将CRC值存储在0x3FFFC.

但是,我不认为我可以使用调试器加载二进制文件.有一个内置的编程实用程序与LPCXpresso可以加载修改后的二进制文件,但是,这不允许我调试.我相信我可以尝试使用"仅附加"模式启动与原始AXF文件的调试会话,但这会变得很麻烦.

我已经能够使用readelf来检查crc32_buildAXF文件中的变量.有没有办法在AXF文件中编辑变量?是否有行业标准方法将CRC作为构建后步骤插入?

c gcc arm crc lpc

5
推荐指数
1
解决办法
6465
查看次数

LPC1700不会从深度睡眠中醒来

我在LPC1754,59和68 + FreeRTOS + CMSIS 上运行固件.

我希望能够将微控制器置于最低功耗模式,但是:

  1. "睡觉"还不够.
  2. 一旦微控制器处于"深度睡眠","断电"或"深度断电",按下按钮(EINT3)就不能再唤醒它.

据我在" LPC17xx用户手册 "(第58,59页)中所读到的,我应该可以从EINT3唤醒到"断电"模式.

我错过了什么?是否在低功率时产生中断?怎么说?我应该做任何特定的东西才能生成它吗?

  • 为了简化,我从内部RC运行,因此PLL勘误不是问题.

编辑:

  • 实际上,我使用"GPIO中断"来处理P2中的几个引脚,而这些引脚又与EINT3共享.EINT3引脚本身(P2.13)未使用.请参阅下面的评论.

c++ embedded arm cortex-m3 lpc

5
推荐指数
1
解决办法
1385
查看次数

重新映射中断向量和引导块

我无法理解重新映射中断向量或引导块的概念.重映射矢量表有什么用?如何使用重映射和无重映射?有关这方面好文章的链接吗?我用Google搜索,但无法得到好的答案.将RAM映射到0x0000并将0x0000中存在的任何内容映射到其他地方有什么好处?从0x0000执行是否执行速度更快?

arm remap lpc

4
推荐指数
1
解决办法
1629
查看次数

什么是与LPC1788微控制器一起使用的优秀RTOS?

我正试图找到一个免费/廉价的RTOS,其他人发现它与恩智浦LPC1788微控制器配合得很好.我原本打算使用FreeRTOS,但它似乎不支持那个特定的处理器; 最接近的支持核心是LPC1768.ThreadX可与LPC1788配合使用,但它的许可证将耗资数千英镑.建议?

编辑1:我忘了提及,我正在使用IAR Embedded Workbench.

编辑2:我想我还应该指出,我对嵌入式编程相当新,更不用说使用RTOS了.FreeRTOS和ThreadX似乎非常相似,都有相当直观的API.另一个RTOS的API与这些API的匹配越多,我想就越好.

编辑3:我一直在寻找一个名为embOS的RTOS.它看起来很专业,API看起来不错,它们支持相当数量的处理器/ IDE组合(包括我的),而且我已经有一个示例项目正常工作.它不是免费的,它的许可证将花费大约2500欧元,但这仍然比threadX许可证便宜约3倍.感谢您的建议,我觉得有点不好,我不能选择一个接受的答案.

c microcontroller rtos lpc threadx

4
推荐指数
2
解决办法
5866
查看次数

ARM-C互操作

我正在尝试一个用于 ARM-C 互操作的简单程序。这是代码:

 #include<stdio.h>
#include<stdlib.h>

int Double(int a);
extern int Start(void);
int main(){

int result=0;
printf("in C main\n");
result=Start();
printf("result=%d\n",result);
return 0;
}

int Double(int a)
{
  printf("inside double func_argument_value=%d\n",a);

  return (a*2);
}
Run Code Online (Sandbox Code Playgroud)

汇编文件如下:

.syntax unified
    .cpu cortex-m3
    .thumb

    .align
    .global Start
    .global Double
    .thumb_func



Start:
      mov r10,lr
      mov r0,#42
      bl Double
      mov lr,r10
      mov r2,r0
      mov pc,lr
Run Code Online (Sandbox Code Playgroud)

在 LPC1769(嵌入式艺术家板)上调试期间,我在指令“ result=Start() ”上收到硬故障错误。我正在尝试在这里进行arm-C网络互连。上述语句(result=Start())执行过程中lr值为0x0000029F,即错误指令所在,pc值为0x0000029E。这就是我在 r1 中得到错误指令的方式

__asm("mrs r0,MSP\n"
"isb\n"
"ldr r1,[r0,#24]\n");
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下我哪里出错了吗?任何解决方案表示赞赏。先感谢您。

我是 cortex-m3 的初学者,正在使用由 Code_Red 提供支持的 NXP LPCXpresso IDE。这是我的代码的反汇编。

      IntDefaultHandler:
00000269: …
Run Code Online (Sandbox Code Playgroud)

c assembly thumb lpc cortex-m

4
推荐指数
1
解决办法
2983
查看次数

在C中的UART中接收未定义大小的消息

我正在为LPC2148编写自己的驱动程序,我想到了一个问题.如何在UART中收到未指定大小的消息?

想到的唯一两件事是:1 - 配置看门狗并在时间用完时结束接收.2-使它无论何时向其发送消息都必须有消息字符结束.

在我看来,第一选择似乎更好,但我想知道是否有人有更好的答案,我知道必须有.

非常感谢你

c arm lpc uart

2
推荐指数
1
解决办法
2411
查看次数

调用strcpy后尝试释放内存会导致程序崩溃

我知道很多人在这里抱怨strcpy,但我没有找到任何使用搜索来解决我的问题.

首先,调用strcpy本身不会导致任何类型的崩溃/分段错误.其次,代码包含在一个函数中,第一次调用这个函数它完美地运行.它只在第二次崩溃.

我正在用LPC1788微控制器编程; 内存非常有限,所以我可以看到为什么像malloc这样的东西可能会失败,但不是免费的.

函数trimMessage()包含代码,函数的目的是删除大字符串数组的一部分,如果它变得太大.

void trimMessage()
{
  int trimIndex;
  // currMessage is a globally declared char array that has already been malloc'd
  // and written to.
  size_t msgSize = strlen(currMessage);

  // Iterate through the array and find the first newline character. Everything
  // from the start of the array to this character represents the oldest 'message'
  // in the array, to be got rid of.
  for(int i=0; i < msgSize; i++)
  {
    if(currMessage[i] == '\n')
    {
      trimIndex = i; …
Run Code Online (Sandbox Code Playgroud)

c microcontroller lpc

1
推荐指数
1
解决办法
2491
查看次数