精华内容
下载资源
问答
  • 2019-10-31 12:00:34

     

    目录

    STR -(Store Register)存储指令

    LDR -(Load Register)存储指令


    ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。

     

    STR -(Store Register)存储指令

    格式:
    str{条件}  源寄存器,<存储器地址>
    将源寄存器中数据存到存储器地址中。 

    实例1:

    str   r1,[r2]        ; 将r1中的值存到r2所指定的地址中

    str  r1,[r2,#4]   ;将r1中的值存到r2+4所指定的地址中

    str   r1,[r2],#4  ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4

    LDR -(Load Register)存储指令

    格式:

    LDR{条件} 目的寄存器,<存储器地址>

    当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

     实例1:

      LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。

      LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。

      LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。

      LDR R0,[R1,R2]! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

      LDR R0,[R1,#8]! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

      LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

      LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

      LDRR0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。”

     

    更多相关内容
  • STM32指令周期

    万次阅读 多人点赞 2018-09-18 16:25:59
    在keil中编程时,写了一行代码,然后就想知道,执行这句C代码需要多长时间。 时钟周期在这就不解释了,频率的倒数。 指令周期,个人理解就是cpu执行...使用STM32F103RC,。配置其主时钟HCLK为72mhz测试代码如下: ...

    在keil中编程时,写了一行代码,然后就想知道,执行这句C代码需要多长时间。

    时钟周期在这就不解释了,频率的倒数。

    指令周期,个人理解就是cpu执行一条汇编指令所需要的时间。

    我们知道cm3使用的三级流水线,那么到底一条指令的执行需要多少个时钟周期。下面通过keil软件仿真,来计算一个指令所需的时钟周期。

     

    使用STM32F103RC,。配置其主时钟HCLK为72mhz测试代码如下:

    然后开始仿真

    编译通过后,点击dbg按钮,调出如下窗口:

    并且设置以上的断点,开始单步调试。并记录时间,

    单步调试

    这样便可以计算出执行  MVOS  r1,#0x04 所用的时间视为29.20833-29.19444=0.1389us。使用这种方式便可以测试出每条指令所使用的时间。便有了下面的表。

    但是,我测试BL.W指令所需要的是8T0,不知道是什么原因,其他指令都是正确的

    ARM官方给出的指令周期是

    STM32有三级流水线,指令周期不定的,arm给出的是1.25MIPS/Mhz,一个平均执行速度。

    个人理解就是1Mhz的频率,每秒钟可以执行1.25M指令。72M,那么就是72*1.25。

    而这个最大的应用是通过单周期指令去测试系统时钟是否配置的正确。

    展开全文
  • STM32单片机-汇编指令1

    2022-05-08 14:03:36
    STM32单片机-汇编指令

    目录:

    1、ldr/str/mov指令

    1)LDR指令   2)STR和LDRB指令   3)MOV指令   4)使用示例

    2、MOVS指令

    3、LDM表示装载,STM表示存储

    4、teq指令

    5、使用tst来检查是否设置了特定的位

    6、'^'的理解

    7、spsr_cxsf,cpsr_cxsf的理解

    8、cpsr的理解

    9、指令后缀和条件判断

    10、B、BL、BX、BLX 和 BXJ指令的区别

    1)B 指令   2)BL 指令   3)BLX 指令   4)BX 指令和BXJ指令   5)总结

    --------------------------------------------

    说明:

    STM32单片机-汇编指令使用1

    STM32单片机-汇编指令使用2

    ARM单片机汇编指令的查找见“STM32单片机二之十五、查找汇编指令”。

    --------------------------------------------

    .macro restore_user_regs //宏

       ldr r1,[sp, #S_PSR]

       ldr lr,[sp, #S_PC]!   @ !用来控制基址变址寻址的最终新地址是否进行回写操作,

                                      @ 执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址

       msrspsr,r1              @ 把cpsr的值保存到spsr中

       ldmdb sp,{r0 - lr}^@lr=[sp-1*4],r13=[sp-2*4],r12=[sp-3*4],......,r0=[sp-15*4]

                                     @ 因为没对pc赋值,所以^的表示将数据恢复到User模式的[r0-lr]寄存器组中[gliethttp]

       mov r0,r0 

       add sp,sp,#S_FRAME_SIZE - S_PC

       movs pc,lr

    .endm

    -------------------------------------------------------------------------------------------------------

    1、ldr/str/mov指令

    1)LDR指令

    LDR格式:LDR{条件}   目的寄存器  <存储器地址>

    LDR作用:将存储器地址所指地址处连续的4个字节(1个字)的数据传送到目的寄存器

    比如想把数据从内存中某处读取到寄存器中,只能使用ldr

    比如:ldr r0, 0x12345678

    就是把0x12345678这个地址中的值存放到r0。

    而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。

    -------------------

    2)STR和LDRB指令

    STR格式:STR{条件}  源寄存器,<存储器地址>

    STR作用:STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,寻址方式灵活多样,使用方式可参考指令LDR。 

    LDRB:字节数据加载指令

    -------------------

    3)MOV指令

    MOV格式:mov source, destination

    MOV作用:source 和 destination 的值可以是内存地址,存储在内存中的数据值,指令语句中定义的数据值,或者寄存器。

    -------------------

    4)使用示例

       ldr ip,[sp],#4 //将sp中内容存入ip,之后sp=sp+4;

       ldr ip,[sp,#4] //将sp+4这个新地址下内容存入ip,之后sp值保持不变

       ldr ip,[sp,#4]! //将sp+4这个新地址下内容存入ip,之后sp=sp+4将新地址值赋给sp

       str ip,[sp],#4 //将ip存入sp地址处,之后sp=sp+4;

       str ip,[sp,#4] //将ip存入sp+4这个新地址,之后sp值保持不变

       str ip,[sp,#4]! //将ip存入sp+4这个新地址,之后sp=sp+4将新地址值赋给sp

    -------------------------------------------------------------------------------------------------------

    2、MOVS指令

       movs r1,#3 ; //movs将导致ALU被更改,因为r1赋值非0,即操作结果r0非0,所以ALU的Z标志清0

       bne 1f  ; //因为Z=0,说明不等,所以向前跳到标号1:所在处继续执行其他语句

    MOVS pc,r14_und; //cpsr(状态寄存器)←spsr_und(备份状态寄存器),pc←r14_und

    相关指令详见“嵌入式网络那些事LwIP协议深度剖析与实战演练P42下方”。

    MOVS总是会影响cpsr, 包括N,Z,C标志位,执行MOVS pc,lr(也就是r14寄存器)时,cpsr会被spsr覆盖,如上。内核态,USER和SYSTEM模式下没有spsr。

    -------------------------------------------------------------------------------------------------------

    3、LDM表示装载,STM表示存储

       LDMED LDMIB 预先增加装载

       LDMFD LDMIA 过后增加装载

       LDMEA LDMDB 预先减少装载

       LDMFA LDMDA 过后减少装载

       STMFA STMIB 预先增加存储

       STMEA STMIA 过后增加存储

       STMFD STMDB 预先减少存储

       STMED STMDA 过后减少存储

    注意ED不同于IB;只对于预先减少装是相同的.在存储的时候,ED是过后减少的.

    FD、ED、FA、和 EA 指定是满栈还是空栈,是升序栈还是降序栈.

    对于存储STM而言

    先加后存 FA 姑且这么来记,先加(first add),存数据

    后加先存 EA 姑且这么来记,存数据,后加end add

    先减后存 FD 姑且这么来记,先减first dec,存数据

    后减先存 ED 姑且这么来记,存数据,后减end dec

    然后记忆LDM,LDM是STM的反相弹出动作,所以

    因为是先加后存,所以后减先取 FA 就成了与STM对应的取数据,后减

    因为是后加先存,所以先减后取 EA 就成了与STM对应的先减,取数据

    因为是先减后存,所以后加先取 FD 就成了与STM对应的取数据,后加

    因为是后减先存,所以先加后取 ED 就成了与STM对应的先加,取数据

    我想通过上面的变态方式可以比较容易的记住这套指令[gliethttp]

    一个满栈的栈指针指向上次写的最后一个数据单元,而空栈的栈指针指向第一个空闲单元.

    一个降序栈是在内存中反向增长(就是说,从应用程序空间结束处开始反向增长)而升序栈在内存中正向增长. 

    其他形式简单的描述指令的行为,意思分别是

    IA过后增加(Increment After)、

    IB预先增加(Increment Before)、

    DA过后减少(Decrement After)、

    DB预先减少(Decrement Before).

    RISC OS使用传统的满降序栈.在使用符合APCS规定的编译器的时候,它通常把你的栈指针设置在应用程序空间的

    结束处并接着使用一个FD(满降序-Full Descending)栈.如果你与一个高级语言(BASIC或C)一起工作,你将别无选择.

    栈指针(传统上是R13)指向一个满降序栈.你必须继续这个格式,或则建立并管理你自己的栈.

    -------------------------------------------------------------------------------------------------------
    4、teq指令
    teq r1,#0      //r1-0,将结果送入状态标志,如果r1和0相减的结果为0,那么ALU的Z置位,否则Z清0
    bne reschedule//ne表示Z非0,即:不等,那么执行reschedule函数

    -------------------------------------------------------------------------------------------------------
    5、使用tst来检查是否设置了特定的位
    tst r1,#0x80 //按位and操作,检测r1的0x1<<7,即第7位是否置1,按位与之后结果为0,那么ALU的Z置位
    beq reset    //如果Z置位,即:以上按位与操作结果是0,那么跳转到reset标号执行

    -------------------------------------------------------------------------------------------------------
    6、'^'的理解
    '^'是一个后缀标志,不能在User模式和Sys系统模式下使用该标志.该标志有两个存在目的:
    1)对于LDM操作,同时恢复的寄存器中含有pc(r15)寄存器,那么指令执行的同时cpu自动将spsr拷贝到cpsr中
    如:在IRQ中断返回代码中[如下为ads环境下的代码gliethttp]
    ldmfd {r4}           //读取sp中保存的的spsr值到r4中
    msr spsr_cxsf,r4     //对spsr的所有控制为进行写操作,将r4的值全部注入spsr
    ldmfd {r0-r12,lr,pc}^//当指令执行完毕,pc跳转之前,将spsr的值自动拷贝到cpsr中[gliethttp]

    -------------------
    2)数据的送入、送出发生在User用户模式下的寄存器,而非当前模式寄存器
    如:ldmdb sp,{r0 - lr}^;表示sp栈中的数据回复到User分组寄存器r0-lr中,而不是恢复到当前模式寄存器r0-lr
    当然对于User,System,IRQ,SVC,Abort,Undefined这6种模式来说[gliethttp]r0-r12是共用的,只是r13和r14
       为分别独有,对于FIQ模式,仅仅r0-r7是和前6中模式的r0-r7共用,r8-r14都是FIQ模式下专有.

    -------------------------------------------------------------------------------------------------------
    7、spsr_cxsf,cpsr_cxsf的理解
    c - control field maskbyte(PSR[7:0])
    x - extension field maskbyte(PSR[15:8])
    s - status field maskbyte(PSR[23:16)
    f - flags field maskbyte(PSR[31:24]).
    老式声明方式:cpsr_flg,cpsr_all在ADS中已经不在支持
    cpsr_flg对应cpsr_f
    cpsr_all对应cpsr_cxsf

    需要使用专用指令对cpsr和spsr操作:mrs,msr
    mrs tmp,cpsr      //读取CPSR的值
    bic tmp,tmp,#0x80 //如果第7位为1,将其清0
    msr cpsr_c,tmp    //对控制位区psr[7:0]进行写操作

    -------------------------------------------------------------------------------------------------------
    8、cpsr的理解
    CPSR = Current Program Status Register
    SPSR = Saved Program Status Registers
    CPSR寄存器(和保存它的SPSR寄存器)

    (上图)
    N,Z,C,V称为ALU状态标志
    N:如果结果是负数则置位
    Z:如果结果是零则置位
    C:如果发生进位则置位
    V:如果发生溢出则置位
    I:置位表示禁用IRQ中断,清0表示使能IRQ
    F:置位表示禁用FIQ中断,清0表示使能FIQ
    T:置位表示系统运行在Thumb态,清0表示运行在ARM态
    M[4:0]:
    10000 User模式,和System系统模式一样
    10001 FIQ模式
    10010 IRQ模式
    10011 SVC超级管理模式
    10111 Abort数据异常模式
    11011 Undefined未定义指令模式
    11111 System系统模式,和User模式一样

    举例:
    ands r2,r2,#7 使用运算结果改变标志位,如果运算结果r2=0,那么Z置位,EQ相等判断成立
    subs r2,r2,#1 使用运算结果改变标志位,如果运算结果r2=0,那么Z置位,EQ相等判断成立
    beq wordcopy

    -------------------------------------------------------------------------------------------------------

    9、指令后缀和条件判断

     (上图)

    EQ : 等于
    NE : 不等
    CS : 无符号>=
    CC : 无符号<</span>
    MI : 负数
    PL : 非负[>=0]
    VS : 溢出
    VC : 无溢出
    HI : 无符号>
    LS : 无符号<=
    GE : 有符号>=
    LT : 有符号<</span>
    GT : 有符号>
    LE : 有符号<=
    AL : 总是[默认]

    对于arm汇编指令,可以参考linux内核的arch/arm目录,那里的汇编指令很丰富[gliethttp_20080603]
    __CopyFromStart
    ;    ldr     r3, [r9],#4
    ;    str     r3, [r7], #4
    ;    sub   r8, r8, #4
        ldrb   r3, [r9], #1
        strb   r3, [r7], #1
        sub   r8, r8, #1
        cmp  r8, #0
        bgt    __CopyFromStart
        b       __JumpToBootImage

        __JumpToBootImage
        MOV     pc, r0

    -------------------------------------------------------------------------------------------------------

    10、B、BL、BX、BLX 和 BXJ指令的区别

    跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转:

    使用专门的跳转指令。

    直接向程序计数器 PC 写入跳转地址值。

    通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用

    MOV LR , PC

    等类似指令,可以保存下一条指令地址作为将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程序调用。

    专门的跳转指令

    B、BL、BX、BLX 和 BXJ:

    跳转、带链接跳转(带返回的跳转)、跳转并切换指令集、带链接跳转并切换指令集(带返回的跳转并切换指令集)、跳转并转换到 Jazelle 状态。

    -------------------

    1)B 指令

    B 指令的格式为:B{条件} 目标地址

    B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继
    续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)。以下指令:

    B Label ;程序无条件跳转到标号 Label 处执行

    CMP R1 ,# 0 ;当 CPSR 寄存器中的 Z 条件码置位时,程序跳转到标号 Label 处执行

    BEQ Label

    -------------------

    2)BL 指令

    BL 指令的格式为:BL{条件} 目标地址

    BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段以下指令:

    BL Label ;当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值保存到 R14 中

    -------------------

    3)BLX 指令

    BLX 指令的格式为:BLX 目标地址

    BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。因此,当子程序使用Thumb 指令集,而调用者使用ARM 指令集时,可以通过BLX 指令实现子程序的调用和处理器工作状态的切换。

    同时,子程序的返回可以通过将寄存器R14 值复制到PC 中来完成。

    -------------------

    4)BX 指令和BXJ指令

    BX 指令的格式为:BX{条件} 目标地址

    BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。

    -------------------

    5)总结

    语法

    op1{cond}{.W} label
    op2{cond} Rm

    其中:

    op1

    是下列项之一:

    B

    跳转。

    BL

    带链接跳转

    BLX

    带链接跳转并切换指令集。

    op2

    是下列项之一:

    BX

    跳转并切换指令集。

    BLX

    带链接跳转并切换指令集。

    BXJ

    跳转并转换为 Jazelle 执行。

    cond

    是一个可选的条件代码。 cond 不能用于此指令的所有形式。

    .W

    是一个可选的指令宽度说明符,用于强制要求在 Thumb-2 中使用 32 位 B 指令。

    label

    是一个程序相对的表达式。

    Rm

    是一个寄存器,包含要跳转到的目标地址。

    操作

    所有这些指令均会引发跳转,或跳转到 label,或跳转到包含在 Rm 中的地址处。 此外:

    BL 和 BLX 指令可将下一个指令的地址复制到 lr(r14,链接寄存器)中

    BX 和 BLX 指令可将处理器的状态从 ARM 更改为 Thumb,或从 Thumb 更改为 ARM

    BLX label 无论何种情况,始终会更改处理器的状态。

    BX Rm  BLX Rm 可从 Rm 的位 [0] 推算出目标状态:

    如果 Rm 的位 [0] 为 0,则处理器的状态会更改为(或保持在)ARM 状态

    如果 Rm 的位 [0] 为 1,则处理器的状态会更改为(或保持在)Thumb 状态。

     

    BXJ 指令会将处理器的状态更改为 Jazelle

    -------------------------------------------------------------------------------------------------------

    展开全文
  • STM32常用汇编指令.pdf

    2020-08-25 20:47:11
    在嵌入式开发中汇编程序常常用于非常关键的地方比如系统启动时初始化进出中断时 的环境保护恢复等对性能...ARM指令使用的基本格式如下 opcode{ cond}{S} RdRn{operand2} opcode 操作码指令助记符如LDRSTR等 cond 可选的
  • 这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。...

    https://blog.csdn.net/q75197694/article/details/48287781

    这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。

    (1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register。下面这条语句就说明的很清楚:

    LDR   R1,     [R2]

    R1<——[R2]

    就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到R1中(一个register)

    (2)STR:S表示STORE,STORE的含义应该理解为:Store from a register into memory。下面这条语句表示的很清楚:

    STR    R1,     [R2]

    R1——>[R2]

    就是把寄存器R1中的内容“保存”到R2所指向的存储的单元中(一个memory地址)。

    显然,这两条语句都有个特点,就是寄存器写在前面(左边)而内存地址写在后面(右边),数据传送的方向则是恰好相反的。

    下面对LDM和STM介绍,使用sp来介绍,因为实际使用中,和sp一起使用更多。

    (3)LDM:L的含义仍然是LOAD,即是Load from memory into register。

    虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:

    LDMFD     SP! ,   {R0, R1, R2}

    实际上可以理解为:    LDMFD     [SP]!,    {R0, R1, R2}

    意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去(如果这个地方还不懂的话,可以参看我文章开头提到的链接,里面有详细的图解)

    (4)STM:S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。

       STMFD      SP!,   {R0}

    同样的,该指令也可理解为:  STMFD      [SP]!,   {R0}

    意思是:把R0保存到堆栈(sp指向的地址)中。

    显然,这两个堆栈操作指令也有个特点,就是寄存器组写在后面(右边)而堆栈指针写在前面(左边),而且实际上使用的是堆栈指针中的内存地址,这一点与前面两条指令是有区别的。

    (补充:sp后面的!,作用是指命令执行完后,对应的地址值赋给sp,对于例程的SDM,是说最后sp的值应该是sp+3*4=sp+12)

    这四条指令中,前面两条和后面两条其实联系不多,反而是差别很大,因此,可以直接把这两组指令区分开来,认为它们之间没有联系,这样避免误解。

    展开全文
  • 处理器:STM32F103 MDK:5.30 STM32CubeMX:6.0.1 对于我们常用的桌面操作系统而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运行后才开始运行的,操作系统已经提供了一个合适的运行...
  • 汇编指令ldr str stm ldm

    千次阅读 2020-08-16 15:39:37
    ldr命令:把数据从内存加载到寄存器 ldr r0, =addr ;r0 = addr ldr r1, [r0] ; r1 = *r0 ldr r1, [r0, #4] ; r1 = *(r0+4) ldr r1, [r0, #4] ! ; r1 = *(r0+4);r0=r0+4; ldr r1, [r0], #4 ; r1 = *(r0);r0=r0+4; ...
  • STM32--ARM常用汇编指令

    千次阅读 2019-03-06 16:50:14
    ARM常用汇编指令: 1、 EQU:给数字常量取一个符号名,相当于C语言中的define 2、 AREA:汇编一个新的代码段或者数据段 3、 SPACE:分配内存空间 4、 PRESERVE8:当前文件栈需要按照8字节对齐 5、 EXPORT:声明一个标号...
  • STM32F0Thumb汇编学习

    2022-03-24 18:07:01
    一周掌握STM32汇编指令用法 —;************************************************ ;一周掌握STM32汇编指令用法 ;Project: Light Led © ;MCU: STM32F030C8T6 ;Date: 2022.03.24 ;File: start.s ;Function: ...
  • 一、基于STM32CubeMX实现流水灯 (1)下载STM32CubeMX (2)STM32CubeMX环境配置 (3)代码编写 (4)结果演示 二、完成一个STM32的USART串口通讯程序 (1)创建新工程并编写代码 (2)生成hex文件 (3)结果...
  • ARM指令ldr、str、stm、ldm理解

    千次阅读 2019-05-01 21:28:44
    这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。...
  • 目录 一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块...2.2安装stm32CubeMX 2.3安装固件库 三、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯..
  • STM32启动过程分析

    千次阅读 2021-06-05 14:49:32
    在讲解 STM32 启动过程之前,我们先来了解一下 STM32 的程序和数据在 Flash 和 SRAM 上到底是如何存储的,因为有了这方面的知识之后,非常有助于我们理解 STM32 启动过程中还做了哪些隐藏的工作。关于详细的程序和...
  • STM32】ARM汇编指令

    千次阅读 2020-01-10 10:34:26
    在嵌入式的学习中,编程时,总会遇到一些汇编代码。。。 不过一想也是,嵌入式本身就偏底层,和硬件接触,汇编代码效率更高,总会接触的。 ----------------------------- ...ARM汇编指令: EQU...
  • 【IoT】STM32 启动代码汇编指令详解

    千次阅读 2019-03-27 09:24:25
    指令EQU用来为一个数字常量或一个和内核寄存器相关的数值或一个和程序计数器相关的数值定义的一个符号名称,类似于C语言中的"#define"。 语法格式:name EQU expr{ , type} 注意:语法格式中的{ }不属于语法格式...
  • 安装STM32CubeMX,stm32串口通信

    千次阅读 2021-10-24 00:01:43
    安装STM32CubeMX,搭建STM32的开发环境 1.安装jdk 由于STM32CubeMX是Java实现的,需要安装jdk环境。 jdk官网下载链接:Java Downloads | Oracle 选Windows的下载: 这个安装很简单,跟着安装步骤一步一步安装...
  • 我相信很多朋友在学习单片机之前都学习过51单片机,假设在51单片机的P1.1的IO口上挂了一个LED,那么你单独对LED的操作就是P1.1 = 0或P1.1 = 1,这样你就可以单独的对P1端的第一个IO口进行上下拉操作,然而对于STM32,...
  • STM32F4知识
  • STM32 汇编程序

    2021-10-30 23:03:37
    一、Keil项目 ...2.芯片选择STM32F103下的STM32F103C8 3.Hello.s代码 ;RCC寄存器地址映像 RCC_BASE EQU 0x40021000 RCC_CR EQU (RCC_BASE + 0x00) RCC_CFGR EQU (RCC_BASE + 0x04) RCC_CIR
  • STM32F0-DAY1

    2022-02-13 14:29:08
    通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令 rigester修饰的变量不能取地址 volatile 防止编译器优化:有时候编译器会将一个地址当成寄存器的值。为了防止出错需要用...
  • 一、STM32简述 STM32 是指 ST 公司开发的 32 位微控制器 STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM Cortex®-M0,M0+,M3, M4和M7内核(ST’s product portfolio contains a comprehensive ...
  • STM32的串口通信

    2021-10-27 00:23:01
    2、STM32给上位机(win10)连续发送hello Windows,上位机接收程序使用“串口调试助手“。 二、创建工程 创建新项目并选择对应芯片STM32F103C8。再按如下设置: 在文件夹下新建 .s文件: 编写代码: ;RCC...
  • stm32启动汇编文件解读
  • STM32 F103之点亮LED流水灯一、STM32初识二、寄存器 使用工具: stm32f103C8T6 USB转串口 面包板 导线若干 LED3个 一、STM32初识 STM32,从字面上来理解,ST 是意法半导体,M 是 Microelectronics 的缩写,32 ...
  • STM32启动文件

    2021-09-13 10:14:57
    startup_stm32f10x_ld_vl.s : for STM32 Low density Value line devices startup_stm32f10x_ld.s : for STM32 Low density devices startup_stm32f10x_md_vl.s : for STM32 Medium density Value line devices ...
  • 3-STM32启动文件详解

    2021-08-08 22:48:44
    启动文件 文章目录启动文件启动文件简介1--初始化栈指针MSP=_initial_sp。2--初始化复位程序计数寄存器值=Reset_Handler。3--初始化异常/ 中断向量表...startup_stm32f429_439xx.s是STM32的启动文件 刚开始我一直认为S
  • STM32之串口通信

    千次阅读 2022-01-13 22:51:12
    打开keil,选择芯片STM32103C8 创建main main.c代码 ;RCC寄存器地址映像 RCC_BASE EQU 0x40021000 RCC_CR EQU (RCC_BASE + 0x00) RCC_CFGR EQU (RCC_BASE + 0x04) RCC_CIR EQU (RCC_BASE + 0x08) RCC_APB2RSTR EQU ...
  • STM32F103串口通信

    2021-10-23 17:20:11
    二、STM32系统给上位机(win10)连续发送“hello windows!” 1、接线: 2、代码实现 3、烧录 4、串口调试 一、串口 串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,...
  • 文章目录一、STM32简介二、使用步骤总结参考 一、STM32简介 二、使用步骤 总结 参考

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,427
精华内容 1,370
热门标签
关键字:

ldr指令 stm32