2016-11-13 6 views
1

stm32f103rb 보드의 systick 인터럽트에서 함수를 호출하는 매우 간단한 프로그램을 구현하려고합니다. 프로그램이 잘 실행되지만 결코 인터럽트 함수를 호출하지 않습니다. 나는 많은 foursms를 통과하고 다른 레지스터 값을 가지고 실험했지만, 내가 무엇을 놓치고 있는지 확실하지 않다. 내 시작 프로그램 및 테스트 프로그램은 다음과 같습니다 :stic32F103RB nucleo 보드에서 Systick 인터럽트 함수가 호출되지 않음

의 Startup.s ::

  .data 
arr: .4byte 0x20001000  @ Read-only array of bytes 
     .4byte start+1  
     .4byte reset1 
     .4byte reset2 
     .4byte reset3 
     .4byte reset4 
     .4byte reset5 
     .4byte reset6 
     .4byte reset7 
     .4byte reset8 
     .4byte reset9 
     .4byte reset10 
     .4byte reset11 
     .4byte reset12 
     .4byte reset13 
     .4byte reset14 
     .4byte reset15 
     .4byte reset16 
eoa: 
     .text 
reset1: b reset1 
reset2: b reset2 
reset3: b reset3 
reset4: b reset4 
reset5: b reset5 
reset6: b reset6 
reset7: b reset7 
reset8: b reset8 
reset9: b reset9 
reset10: b reset10 
reset11: b sysTickFunc 
reset12: b sysTickFunc 
reset13: b sysTickFunc 
reset14: b sysTickFunc 
reset15: b sysTickFunc 
reset16: b sysTickFunc 
start:       @ Label, not really required 
     mov r4, #4    @ Load register r0 with the value 5 
     mov r5, #5    @ Load register r1 with the value 4 
     add r6, r4, r5   @ Add r0 and r1 and store in r2 
     ldr r4, =0x40021000 
     str r1, [r4] 
     cpsie i 
     b test_func 
stop: b stop     @ Infinite loop to stop execution 

TEST.C - 테스트 기능과 systick 기능 구현 :

#define SYSTICK_CTRL  (volatile unsigned int *)(0xE000E010) 
#define SYSTICK_LOAD  (volatile unsigned int *)(0xE000E014) 
#define SYSTICK_VAL  (volatile unsigned int *)(0xE000E018) 

#define PORT_C_CRL (volatile unsigned int *)(0x40011000) 
#define PORT_C_CRH (volatile unsigned int *)(0x40011004) 
#define PORT_C_ODR (volatile unsigned int *)(0x4001100C) 
#define APB2   (volatile unsigned int *)(0x40021018) 
#define AHB   (volatile unsigned int *)(0x40021014) 

void sysTickFunc(void); 
void test_func(void) 
{ 
    volatile unsigned int * p; 
    unsigned int x; 
    p = SYSTICK_CTRL; 
    *p = 7; /*CLKSRC to processor clock, TICK INT is 1, COUNTER ENABLE is 1 */ 
    p = SYSTICK_LOAD; 
    *p = 20; 
    p = (volatile unsigned int *)(0xE000E01C); 
    *p = 0x00002328; 
    x = 0; 
    /* loop in while and check if systick function is called */ 
    while(1) 
    { 

     x++; 
    }  
} 


void sysTickFunc(void) 
{ 
    while(1) 
    { 
     asm("mov r0,0xCCCCCCCC;"); 
     asm("mov r1,0xDDDDDDDD;"); 
     asm("mov r2,0xBBBBBBBB;"); 
     asm("mov r3,0x11111111;"); 
     asm("mov r4,0x22222222;"); 
     asm("mov r5,0x33333333;"); 
     asm("mov r6,0x44444444;"); 
    } 
} 

링커 파일 :

SECTIONS { 
    . = 0x08000000; 
    .data : { * (.data)} 
    . = 0x08003000; 
    .text : {* (.text)} 
} 

빌드 스크립트 :

arm-none-eabi-gcc -nostdlib -mcpu=cortex-m3 -mthumb -g -o add.elf -T stm.ld test.c startup.s 
arm-none-eabi-objcopy -O binary add.elf add.bin 
dd if=/dev/zero of=flash.bin bs=4096 count=4096 
dd if=add.bin of=flash.bin bs=4096 conv=notrunc 

누군가 내 코드에서 잘못된 부분을 도울 수 있습니까? 우분투에서 gdb 팔을 사용하여 실행할 때, 나는 결코 내 systick 함수를 호출하지 않습니다. (내가 벡터 테이블에 여러 곳에서 systick 기능을 넣어 것을 알고있다. sysTickFunction는 벡터 테이블에서 올바른 위치에없는 가능성을 확인하기위한 시도였다.)

감사 라비

답변

0

문제 # 1

어떻게하면 경기가 불렀는지 확인할 것입니까? 코드를 살펴보면 몇 가지 레지스터를 설정하는 것만으로도 확인할 수 있습니다.

예외 항목이 스택에 r0-r3 (및 일부 다른 레지스터)을 저장하므로 생각만큼 효과가 없습니다. 자세한 내용은 Cortex-M3 기술 참조 설명서 (예외 관련 장)를 참조하십시오. 오프셋에서

문제 # 2

귀하의 링커 파일 목록 .text. 재설정 벡터가 처음부터 있어야하기 때문에 작동하지 않습니다. FLASH의 시작 부분에있는 별도의 섹션에 리셋 벡터를 배치하려면 .text.data을 입력합니다. .data.bss도 RAM에 저장하는 것을 잊지 마십시오.

이슈 # 3 포인터 + 1 (Thumb 코드)를 저장 start를 들어

하지만, 다른 벡터를 위해 당신은하지 않습니다.

문제 # 4 또한 systick 레지스터를 사용하기 전에 적절한 클럭을 활성화하고 세계적으로 인터럽트를 활성화하고 NVIC를 통해 실제로 인터럽트를 수신 할 수도 있습니다

.


나는 또한 당신이 명확하게 코드를 작성하는 게 좋을 것 - 그것을 읽으려고, 당신을 위해 쉽게 물건을 만들고, 우리를 위해.

+0

코드는 시스틴 부분이 딱딱 해지는 것을 제외하고는 완벽하게 실행됩니다. 벡터 +1 점이 올바른 방향으로 보인다.다른 것들에 대해서는 제 설명입니다 : 이슈 1 : 시동 코드가 작동합니다. C의 시작 기능으로 올바르게 점프합니다. 나는 gdb의 도움을 받아이를 점검 할 것이다. 문제 2 : 내 링커는 오프셋을 나열하지만 내 벡터 테이블은 0x08000000에 저장됩니다. 이것이 STM32F103rb (cortex-m3)가 예상하는 주소입니다. 3 호 : 그것은 내가 생각하는 문제입니다. 나는 그것을 시도 할 것이다. 문제 4 : 문제 3 해결책을 시도한 후에이 문제를 조사 할 것입니다. – Ravi

+0

1. 귀하의 Systick 기능이 호출되었는지 어떻게 확인합니까? 검사가 문제가 될 수 있으므로 알아 두는 것이 중요합니다. 2. 아, 사실, 벡터가'.data '에 있으므로 작동 할 수 있습니다. 6. 왜 gdb에서 systick 레지스터를 출력하지 않고 적어도 실행 중인지 확인하십시오. – domen

+0

벡터 주소에 +1을 추가했습니다. 추가하기 만하면이 예에서 업데이트되는 전역 변수가 없기 때문에 데이터 섹션을 RAM에 복사 할 필요가 없습니다. 그러나 예에 전역 변수가 추가 된 경우 벡터 테이블을 다른 섹션에두고 데이터 섹션을 RAM의 어딘가에 복사해야합니다. 또한 링커 파일은이 경우 업데이트해야합니다. – Ravi