在stm32F103RB核板上没有调用Systick中断函数

时间:2016-11-13 22:37:47

标签: interrupt cortex-m3

我正在尝试实现一个非常简单的程序来从stm32f103rb板上的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

有人可以帮我解决我的代码中出了什么问题吗?当我在ubuntu上使用arm gdb运行它时,我从未调用我的systick函数。 (我知道我已经在向量表中的许多地方放置了systick函数。它试图检查sysTickFunction不在向量表中的正确位置的可能性。)

由于 拉维

1 个答案:

答案 0 :(得分:0)

问题#1

你如何检查是否调用了systick?查看代码,您只需设置几个寄存器,因此我假设您正在检查这些寄存器。

这不会像你想象的那样工作,因为异常条目会将r0-r3(以及其他一些寄存器)存储在堆栈中。您可能需要阅读Cortex-M3技术参考手册(有关例外的章节)以获取详细信息。

问题#2

您的链接器文件在偏移处列出.text。这不会起作用,因为重置向量需要开始。您希望将重置向量放在FLASH开头的单独部分中,然后放置.text.data。不要忘记将.data.bss放入RAM。

问题#3

对于start,您存储指针+ 1(拇指代码),但对于任何其他向量,您都不会。

问题#4

您可能还需要在使用systick寄存器之前启用适当的时钟,并在全局启用中断并通过NVIC实际接收中断。

我还建议您编写更清晰的代码 - 这样可以让您和我们更轻松地尝试阅读。