ARM课程论设计,STM32蓝牙小车,烧录代码后没法循迹,只能原地转圈,可能是超声波那快程序有问题,但是同样的代码别人的可以循迹,求帮忙解决一下
代码太多没法放上去还请谅解。
如果是一样的代码,你的不行,别人的可行,说明程序应该是没有问题的
可能硬件接线不错或者接触不良导致的,你自己检查下硬件电路连接。
.S 文件中基本定义了各个段的定义 但是没有具体的实际地址,汇编中各个标号的偏移地址跟编译链接后的地址是两个不同的概念 但是经过编译器的重定向后才编程我们需要的地址
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
据上图可以看到,_initial_sp栈顶指针和向量表起始地址均未设置。
默认情况下,cortex-m0+内核认为该表位于零地址处,且各向量占用4 字节,因此每个表项占用4 字节
重定向后:
中断向量表里的中断跳转地址在编译后就定下来了,SCB->VTOR向量
可动态调整就是让我们的程序运行后还能改变向量的跳转地址。方法就是:在RAM
重建一个中断向量表,在想改变的位置重新赋值新的跳转地址
要想实现Flash程序跳转和SRAM程序跳转,第一步先设置SCB->VTOR向量,重置中断向量表的起始地址(不是默认的0x00000000了),其中_DSB()为数据同步隔离、_ISB()为指令同步隔离(确保接下来的所有指令都使用新配置)。
以上为改变中断向量表起始地址,经过_DSB()和_ISB()指令后接下来要给这些地址指针重新赋值,也就是在FlashLoader_ASM()和SRAMLoader_ASM()被调函数中重新配置MSP和PC的值。
以SJ_FLASH_BASE=0x10000000,SJ_SRAM_BASE=0x20000000为例:
以上两个函数均是将SJ_FLASH_BASE或SJ_SRAM_BASE地址处存储的值赋给SP
,再将地址值偏移4字节后得到的地址里存储的值给PC
上面过程类似启动文件中中断向量表里提到的Reset_Handler,也是先给_initial_sp
栈顶指针赋值中断向量表起始地址,然后地址偏移4
字节程序跳转到启动文件后面定义的Reset_Handler函数执行如下:
区别只不过是_main和SystemInit代表的是入口地址常量,而前者是直接操作地址值