c - 学习编程 nrf52840

标签 c gcc ld nrf52

我最近购买了一个 nrf52840 USB 加密狗;但是,我对没有 IDE 和一般 Nordic 产品的编程不熟悉。我没有从我的程序中得到我期望的结果,或者实际上根本没有任何结果,尽管我不确定我的问题是否源于我的程序或我编写的链接描述文件。任何帮助将不胜感激。

编辑:我编辑了链接描述文件以包含所有(我希望)所需的 Material 。我还发布了启动代码。

@Lundin 我正在使用 GCC 进行编译,并使用 NRF Connect 通过 USB 对芯片进行编程。到目前为止,我正在试验时钟设置,但没有成功,但我在数据表中注意到有一个 32 MHz 的内部振荡器,如果调用高速时钟而外部振荡器未打开,它应该会打开。

LED测试.c

// RGB LED at pins G-22,R-23,B-24

#define GPIO_BASE_ADDRESS     0x50000000
#define OUTSET_ADDRESS_OFFSET 0x508  //  1's written to this register set corresponding pins (HIGH). 0's have no effect.
#define DIRSET_ADDRESS_OFFSET 0x518  //  1's written to this register setup corresponding pins as OUTPUT. 0's have no effect.

volatile unsigned long * setupOutputPins = (volatile unsigned long *)GPIO_BASE_ADDRESS + DIRSET_ADDRESS_OFFSET;
volatile unsigned long * ledOn           = (volatile unsigned long *)GPIO_BASE_ADDRESS + OUTSET_ADDRESS_OFFSET;

void main(void){

    *setupOutputPins = 0x01C00000;  //  Make pins 22, 23, and 24 OUTPUT

    for(;;){
        *ledOn           = 0x00400000;  //  Make pin 22 HIGH
    }
}

LED测试.ld

ENTRY (main)

MEMORY{
  FLASH (rx) : ORIGIN = 0x1000, LENGTH = 0xFF000
  RAM  (rwx) : ORIGIN = 0x20000008, LENGTH = 0x3FFF8
}

SECTIONS{
    . = 0x1000;
    .text : {
        *(vectors);
        *(.text);
    }
    .rodata : {
        *(.rodata);
    }
    flash_sdata = .;

    . = 0x20000008;
    ram_sdata = .;
    .data : AT (flash_sdata){
        *(.data);
    }
    ram_edata = .;
    data_size = ram_edata - ram_sdata;

    sbss = .;
    .bss  : {
        *(.bss)
    }
    ebss = .;
    bss_size = ebss - sbss;
}

启动.s

.section "vectors"

reset:  b   start
undef:  b   undef
swi:    b   swi
pabt:   b   pabt
dabt:   b   dabt
        nop
irq:    b   irq
fiq:    b   fiq

.text

start:
            ldr     r0, =flash_sdata
            ldr     r1, =ram_sdata
            ldr     r2, =data_size

            cmp     r2, #0
            beq     init_bss

copy:
            ldrb    r4, [r0], #1
            strb    r4, [r1], #1
            subs    r2, r2, #1
            bne     copy

init_bss:
            ldr     r0, =sbss
            ldr     r1, =ebss
            ldr     r2, =bss_size

            cmp     r2, #0
            beq     init_stack

            mov     r4, #0

zero:
            strb    r4, [r0], #1
            subs    r2, r2, #1
            bne     zero

init_stack:
            ldr     sp, =0x20040000
            bl      main

stop:   b   stop

最佳答案

Nordic 提供了一些资源,可帮助您开始 nRF52840 开发。请参阅以下链接:-

请注意,您仍然可以使用 IDE 来编写您的应用程序,但您可能已经知道,您随后必须使用 Nordic 的工具将应用程序刷写到加密狗上。有关 IDE 使用的更多信息,请参阅:-

希望对您有所帮助。

关于c - 学习编程 nrf52840,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095240/

相关文章:

c 反斜杠在注释中被忽略

c - 为什么 printf 不使用 read() 函数显示放入缓冲区的数据?

c++ - 链接器找不到 mathgl 库

c++ - dpkg-shlibdeps : error: no dependecy information found

ios-simulator - ld 警告 : too many personality routines for compact unwind to encode

c - GCC 编译器中的优化对溢出条件有什么影响

c++ - 静态链接可以导致执行一些初始化例程吗?

gcc - 编译错误gcc -lpthread位置

c - 在 GCC 中对齐 malloc()?

c - 为什么 gcc 允许类型为 void(非指针)的外部声明?