2012-03-05 3 views
4

거의 가장 간단한 ARM 응용 프로그램을 작성했는데 작동하지 않았습니다. 무엇이 잘못 될 수 있습니까? 놓친 것은 무엇입니까?Cortex-M3 초기화

플래시 쓰기 및 CPU 재설정 후 레지스터에 가비지가 있습니다.

STM32F1에서 가장 간단한 애플리케이션 인 을 실행하기 위해 수행해야 할 작업을 알려주십시오.

즉, 응용 프로그램을 시작하기 전에 수행해야 할 작업을 열거 할 수 있습니다.

  1. 초기화 스택 (이 필요한가?)
  2. 설정 뭔가.
  3. 다른 것으로 설정하십시오.

응용 프로그램 :

@Directives 
    .thumb     @.code 16 
    .syntax unified 

.section .text 
    .org 0     @ Alters location of pointer - in this case set to zero 

vectors:     @ Define basic vectors for specific capabilities 
    .word _start + 1  @ Set - start address and increment pointer 
    .word _nmi_handler + 1 @ Below all other vectors will be declared: 
    .word _hard_fault + 1 
    .word _memory_fault + 1 
    .word _bus_fault + 1 
    .word _usage_fault + 1 

_start: 
    mov r0, #5 
    mov r1, #4 
    add r2, r0, r1 

_nmi_handler: 
_hard_fault: 
_memory_fault: 
_bus_fault: 
_usage_fault: 

어쩌면 누군가가 등 링커 스크립트, CPU 초기화에 대한 자습서 또는 책을 알아?

프로세서는 다음에 의해 프로그램 STM32F103VBT6

: OpenOCD. 사전에

감사합니다.

+0

http://github.com/dwelch67에서 일반적인 예제로 많은 cortex-m과 thumb을 사용합니다. 이런 간단한 프로그램을 위해 add hang 후에 무한 루프를 만들 것이다 : b hang, 그런 식으로. –

답변

7

나는 많은 엄지와 피질-M 기반의 예 http://github.com/dwelch67

있습니다. cortex-m에는 팔과 동일한 벡터 테이블이 없으므로 팔 명령으로 팔 모드로 부팅됩니다.

은 설치 첫 번째 단어의 위치에 스택 포인터의 시작 값을 넣어 스택

.cpu cortex-m3 
.thumb 

.word 0x10008000 /* stack top address */ 
.word _start  /* 1 Reset */ 
.word hang  /* 2 NMI */ 
.word hang  /* 3 HardFault */ 
.word hang  /* 4 MemManage */ 

당신이 확실히 한 번에 스택 포인터를 설정 실행 할 수 있습니다 피질-m에 대해,하지만 대답을 완료하려면 팔 모드 또는 대부분의 다른 프로세서에서 팔을 사용하는 것처럼 수동으로 수행 할 수 있습니다.

코드가 무한 루프에 빠지면 코드가 정의되지 않은 명령어 등으로 분류되지 않습니다 (0xFFs 여야합니다.-m3에서 정의되지 않은 것으로 생각되는 피질 -m0에 있어야합니다). 또는 armv7 thumb2를 지원하는 -m4는 실제 명령어 일 수 있습니다.

나는 내 벡터에서 +1을 사용하지 않았다. 당신은 당신의 도구를 알아야합니다. 가지에 엄지 주소/엄지 모드를 표시하기 위해 lsbit 세트가 필요합니다. 내가 그에게 교훈을 비록 당신이 지시를 넣을 경우 GNU 어셈블러로

Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function

을 (너무 질문을 찾을 수있을 것이다).thumb_func를 레이블 앞에 붙이면 그 레이블은 thumb 레이블로 표시되고 gnu 도구는 주소 | 1을 사용합니다.

.thumb_func 
.globl _start 
_start: 

당신은 적절한 주소를 사용하고 있는지 테이블 정확하고 지점과 같은 건설되고있다 있도록 다시 구축하고 지금은 모든를 분해 할 필요가있다.

0: 10008000 andne r8, r0, r0 
    4: 0000005b andeq r0, r0, fp, asr r0 
    8: 00000050 andeq r0, r0, r0, asr r0 
    c: 00000050 andeq r0, r0, r0, asr r0 
    10: 00000050 andeq r0, r0, r0, asr r0 

(즉 내가 모르고 멀리 있었는지 그래서, 예에서로 사용하는 인터럽트)가 재설정하지만 아무것도하지 않을 ... 분명히 내가 예 중 하나의 버그를 참조하십시오. .thumb_func

hang: b . 

00000050 <hang>: 
    50: e7fe  b.n 50 <hang> 

변화

.thumb_func 
hang: b . 

에 생산 벡터 테이블이

00000000 <hang-0x50>: 
    0: 10008000 andne r8, r0, r0 
    4: 0000005b andeq r0, r0, fp, asr r0 
    8: 00000051 andeq r0, r0, r1, asr r0 
    c: 00000051 andeq r0, r0, r1, asr r0 
    10: 00000051 andeq r0, r0, r1, asr r0 
    14: 00000051 andeq r0, r0, r1, asr r0 

이 흥미 롭,

에 코드를 변경 간다 잊었다
.cpu cortex-m3 
.thumb 

.word 0x10008000 /* stack top address */ 
.word _start+1  /* 1 Reset */ 
.word hang+1  /* 2 NMI */ 
.word hang+1  /* 3 HardFault */ 
.word hang  /* 4 MemManage */ 
.word hang  /* 5 BusFault */ 

실제로 더하기 하나가 아니라 하나 또는 그 이상을 수행합니다.

00000000 <hang-0x50>: 
    0: 10008000 andne r8, r0, r0 
    4: 0000005b andeq r0, r0, fp, asr r0 
    8: 00000051 andeq r0, r0, r1, asr r0 
    c: 00000051 andeq r0, r0, r1, asr r0 
    10: 00000051 andeq r0, r0, r1, asr r0 

조금 불안합니다. 결론적으로 두 가지 사항은 벡터 테이블에 스택 포인터를 설정할 수 있다는 점입니다. 둘째, 새 프로젝트를 시작할 때 벡터 테이블을 검사하여 기대하는 바를 확인하십시오. 그것은 당신이해야한다고 생각하는 일을하지 않으면 Esp.

+0

고마워요 ** dwelch **! 그것은 내가 본 Cortex-M3 주제에 대한 최고의 답입니다! 고맙다고 다시 한 번 감사드립니다. – Tyrreus

+0

누구나 요아킴을 상향시켜야합니다. 그는 진짜 문제에 먼저 답했습니다. –

8

M3 documentation;

The vector table at location 0 is only required to have four values: 

Stack top address 
Reset routine location 
NMI ISR location 
Hard Fault ISR location. 

스택 상단 주소는 0이어야합니다. 누락 된 것 같습니다. 요아킴 당신이 벡터 테이블의 첫 번째 항목, 스택 포인터를 누락 지적

+0

예, 이것이 문제입니다. –

+0

스택을 사용하지 않으므로 나중에 .word 0 같은 것을 넣을 수 있습니다. 값을 나중에 가져 오는 것에 대해 걱정할 필요가 없습니다. –

+0

고마워 ** 요아킴 ** – Tyrreus