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는 벡터 테이블에서 올바른 위치에없는 가능성을 확인하기위한 시도였다.)
감사 라비
코드는 시스틴 부분이 딱딱 해지는 것을 제외하고는 완벽하게 실행됩니다. 벡터 +1 점이 올바른 방향으로 보인다.다른 것들에 대해서는 제 설명입니다 : 이슈 1 : 시동 코드가 작동합니다. C의 시작 기능으로 올바르게 점프합니다. 나는 gdb의 도움을 받아이를 점검 할 것이다. 문제 2 : 내 링커는 오프셋을 나열하지만 내 벡터 테이블은 0x08000000에 저장됩니다. 이것이 STM32F103rb (cortex-m3)가 예상하는 주소입니다. 3 호 : 그것은 내가 생각하는 문제입니다. 나는 그것을 시도 할 것이다. 문제 4 : 문제 3 해결책을 시도한 후에이 문제를 조사 할 것입니다. – Ravi
1. 귀하의 Systick 기능이 호출되었는지 어떻게 확인합니까? 검사가 문제가 될 수 있으므로 알아 두는 것이 중요합니다. 2. 아, 사실, 벡터가'.data '에 있으므로 작동 할 수 있습니다. 6. 왜 gdb에서 systick 레지스터를 출력하지 않고 적어도 실행 중인지 확인하십시오. – domen
벡터 주소에 +1을 추가했습니다. 추가하기 만하면이 예에서 업데이트되는 전역 변수가 없기 때문에 데이터 섹션을 RAM에 복사 할 필요가 없습니다. 그러나 예에 전역 변수가 추가 된 경우 벡터 테이블을 다른 섹션에두고 데이터 섹션을 RAM의 어딘가에 복사해야합니다. 또한 링커 파일은이 경우 업데이트해야합니다. – Ravi