STM32蓝牙小车转圈问题

ARM课程论设计,STM32蓝牙小车,烧录代码后没法循迹,只能原地转圈,可能是超声波那快程序有问题,但是同样的代码别人的可以循迹,求帮忙解决一下
代码太多没法放上去还请谅解。

如果是一样的代码,你的不行,别人的可行,说明程序应该是没有问题的
可能硬件接线不错或者接触不良导致的,你自己检查下硬件电路连接。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7799738
  • 这篇博客你也可以参考下:ARM内核矩阵计算教程(STM32)
  • 除此之外, 这篇博客: stm32 启动过程 以及中段重定位中的 上面是对基本的arm指令找到一些解释 可能并不能具体说明启动过程下面在总结下 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • .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代表的是入口地址常量,而前者是直接操作地址值

  • 您还可以看一下 Abel小智老师的嵌入式开发系统学习路线 从基础到项目 精品教程 工程师必备课程 物联网课程中的 STM32如何使用定时器?小节, 巩固相关知识点