0

我可以复制一些现有的装配项目,但是有很多与之相关的文件,我想知道它们是否有必要。

重新表述这个问题的另一种方式是,我想设置 CCS 或 Eclipse 来构建/安装/调试 MSP432 Launchpad 开发板,最少的步骤和文件是多少。

我问是因为我(将作为另一个问题发布)想设置一个中断(仅在汇编中)以捕获 GPIO 端口上的输入。

我已经阅读了大量的理论,但它们并没有转化为实际的具体步骤。

更新:

对于 STM32 Nucleo,这非常简单。使用arm gcc、gdb和st-link,只需要两个文件。这是一个示例,显示了在重置处理程序中运行的一些代码。但 MSP432 似乎更复杂。

文件链接器.script.ld:

/* Define the end of RAM and limit of stack memory */
/* (4KB SRAM on the STM32F031x6 line, 4096 = 0x1000) */
/* (RAM starts at address 0x20000000)
_estack = 0x20001000;

MEMORY
{
    FLASH ( rx )      : ORIGIN = 0x08000000, LENGTH = 32K
    RAM ( rxw )       : ORIGIN = 0x20000000, LENGTH = 4K
}

文件核心.S:

/*************************************************************************
* PART 1 - SETUP - DIRECTIVES
*************************************************************************/

// These instructions define attributes of our chip and

// the assembly language we'll use:
.syntax unified        /* See below after this code area */
/*.cpu cortex-m0 */ /*comment out this line of the example */
.cpu cortex-m4     /* add instead our board's cortex. see above image in this step */

/*.fpu softvfp */ /* comment out this line of the example */
.fpu vfpv4         /* add instead our board's; it does have an FPU */

.thumb

// Global memory locations.
.global vtable
.global reset_handler

/*
 * The actual vector table.
 * Only the size of RAM and 'reset' handler are
 * included, for simplicity.
 */
.type vtable, %object
vtable:
    .word _estack
    .word reset_handler
.size vtable, .-vtable



/*************************************************************************
* PART 2 - CODE - Hello World
*************************************************************************/

/*
 * The Reset handler. Called on reset.
 */
.type reset_handler, %function
reset_handler:
  // Set the stack pointer to the end of the stack.
  // The '_estack' value is defined in our linker script.
  LDR  r0, =_estack
  MOV  sp, r0

  // Set some dummy values. When we see these values
  // in our debugger, we'll know that our program
  // is loaded on the chip and working.
  LDR  r7, =0xDEADBEEF
  MOVS r0, #0
  main_loop:
    // Add 1 to register 'r0'.
    ADDS r0, r0, #1
    // Loop back.
    B    main_loop
.size reset_handler, .-reset_handler

编译:

arm-none-eabi-gcc -x assembler-with-cpp -c -O0 -mcpu=cortex-m0 -mthumb -Wall core.S -o core.o

关联:

arm-none-eabi-gcc core.o -mcpu=cortex-m0 -mthumb -Wall --specs=nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

更新:希望这会有所帮助,如果我能决定什么需要消除,什么需要修改。这是我一直在复制的 Code Composer 中的一个汇编项目。在那个项目树中,“Assembly.asm”是我一直使用的文件。它有我的代码和指令。 组装项目

以下是当前项目编译器包含选项: 编译器包含选项

- 谢谢你

4

1 回答 1

1

这可能很痛苦,因为 CCS 对该处理器上的组装项目没有任何开箱即用的支持。我教了一个嵌入式系统课程,我们为 432 编写汇编代码,所以我需要自己解决这个问题。这是我为修改 CCS 项目并使其与汇编代码一起工作所做的工作:

  • 编译器包含选项被修改以删除默认包含路径(但必须保留 PROJECT ROOT):

    • 根/臂/包括
    • ROOT/arm/include/cmsis
    • 根/包括
  • 修改了链接器文件搜索路径选项,将 libc.a 作为默认库文件删除。

  • 修改了链接器文件搜索路径选项以删除默认包含路径:

    • 根/臂/包括
    • ROOT/arm/include/cmsis
    • 根/包括
  • 构建选项中添加了一个构建后步骤,以创建代码的反汇编列表:

    ${CG_TOOL_ROOT}/bin/armdis ${ProjName}.out ${ProjName}.dis

  • 汇编程序选项keep the generated assemblygenerate listing file启用

  • 链接器的符号管理已修改为将程序入口点设置为Reset_Handler. 这只是我对重置向量的首选名称。

  • 链接器诊断消息 10063 被视为备注,并启用了发出备注的选项。诊断 10063 通常是入口点符号已更改的警告。

  • 编译器和链接器都启用了详细诊断。

修改项目首选项后,您还需要创建一个定义中断向量的汇编文件。该代码看起来像:

__STACK_END .equ 0x20010000

  .word __STACK_END         ; Initial Stack Pointer
  .word Reset_Handler       ; Start of executable code
  .word NMI_Handler         ; Non-maskable Interrupt Handler
  .word HardFault_Handler   ; Hard Fault Handler
  .word MemManage_Handler   ; MPU Fault Handler
  .word BusFault_Handler    ; Bus Fault Handler
  .word UsageFault_Handler  ; Usage Fault Handler

对于其余的异常和中断,依此类推。然后创建可以稍后覆盖的虚拟处理程序:

Reset_Handler:  .asmfunc
   B $
  .endasmfunc

  .weak Reset_Handler
  .global Reset_Handler

如果查看 msp.h 头文件,您可以看到如何为内部寄存器的地址创建各种常量标识符,例如控制 GPIO 端口的寄存器。您需要将这些文件转换为您计划使用的任何寄存器的汇编语言,然后将这些文件合并到您的项目中。

于 2018-10-16T17:40:35.257 回答