请选择 进入手机版 | 继续访问电脑版

STM32汇编语言设计

[复制链接]
陈雪霜 发表于 2021-1-1 10:00:44 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
STM32汇编语言



STM32三种BOOT模式

在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。

1、主闪存存储器(Main Flash memory)
STM32内置的Flash,一般我们使用JTAG大概SWD模式下载步调时,就是下载到这个里面,重启后也直接从这启动步调。
2、系统存储器(System memory)
从系统存储器启动,这种模式启动的步调功能是由厂家设置的。一般来说,这种启动方式用的比力少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP步调, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载步调,因为在厂家提供的BootLoader中,提供了串口下载步调的固件,可以通过这个BootLoader将步调下载到系统的Flash中。
3、内置SRAM(Embedded Memory)
内置SRAM,既然是SRAM,自然也就没有步调存储的本事了,这个模式一般用于步调调试。如果我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比力的费时,可以思量从这个模式启动代码(也就是STM32的内存中),用于快速的步调调试,等步调调试完成后,在将步调下载到SRAM中。
根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:
从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然可以或许在它原有的所在(0x0800 0000)访问它,即闪存存储器的内容可以在两个所在区域访问,0x0000 0000或0x0800 0000。
从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),但仍然可以或许在它原有的所在(互联型产物原有所在为0x1FFF B000,别的产物原有所在为0x1FFF F000)访问它。
从内置SRAM启动:只能在0x2000 0000开始的所在区访问SRAM。
基于MDK创建纯汇编语言的STM32工程

创建工程

1、点击project->“New uVision Project” 选项
2、选择设备

3、选择运行情况

4、鼠标右键单击 “Source Group 1”,选择 “Add New Item to Group”

选择 “Asm File (.s)” ,创建汇编文件

添加代码

1、在汇编文件中添加步调
  1. AREA MYDATA, DATA         AREA MYCODE, CODE        ENTRY        EXPORT __main__main        MOV R0, #10        MOV R1, #11        MOV R2, #12        MOV R3, #13        ;LDR R0, =func01        BL        func01        ;LDR R1, =func02        BL        func02                BL         func03        LDR LR, =func01        LDR PC, =func03        B .                func01        MOV R5, #05        BX LR        func02        MOV R6, #06        BX LR        func03        MOV R7, #07        MOV R8, #08                BX LR
复制代码
2、点击邪术棒,勾选 “Create HEX File” 和 设置仿真器

3、用杜邦线将开发板和st-link相连,此中开发板的SWDIO连st-link的SWDIO,开发板的SWCLK连st-link的SWCLK,开发板的GND连st-link的GND,开发板的3v3连st-link的3v3。
4、按照之前博客中的设置方法设置stm32串口通信
编译调试



动态调试之后可以看到,寄存器R5、R6、R7、R8的值从全零变为相应的值。
检察生成的hex文件


上图第一行 :020000040800F2 中,可以看做是0x02 0x00 0x00 0x04 0x08 0x00 0xf2
第一个字节0×02表现该行数据中有两个数据
第二个,第三个字节0x00 0x00表现本行数据的起始所在位
第四个字节 0x04 表现扩展线性所在记录,对应上述的TT域
第五个、第六个字节 0x08 0x00表现数据字节,与**数据长度域(LL)**中对应,即第一个 0x02
最后一个字节0xf2为校验和。校验和= 0x100 - 累加和
用汇编步调完成每间隔一秒闪一次LED的步调

步调编写

1、重新再创建一个纯汇编语言的STM32工程 (跟上面的步骤一样)
这次选择运行情况时,直接跳过,不用再勾选 “Startup” 和 “CORE”。
2、直接添加一个汇编文件
  1. LED0 EQU 0x40010c00RCC_APB2ENR EQU 0x40021018GPIOA_CRH EQU 0x40010804Stack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem       SPACE   Stack_Size__initial_sp                AREA    RESET, DATA, READONLY__Vectors       DCD     __initial_sp               ; Top of Stack                DCD     Reset_Handler              ; Reset Handler                                                        AREA    |.text|, CODE, READONLY                                    THUMB                REQUIRE8                PRESERVE8                                    ENTRYReset_Handler                 BL LED_InitMainLoop        BL LED_ON                BL Delay                BL LED_OFF                BL Delay                                B MainLoop             LED_Init                PUSH {R0,R1, LR}                                LDR R0,=RCC_APB2ENR                ORR R0,R0,#0x04                LDR R1,=RCC_APB2ENR                STR R0,[R1]                                LDR R0,=GPIOA_CRH                BIC R0,R0,#0x0F                LDR R1,=GPIOA_CRH                STR R0,[R1]                                LDR R0,=GPIOA_CRH                ORR R0,R0,#0x03                LDR R1,=GPIOA_CRH                STR R0,[R1]                                MOV R0,#1                 LDR R1,=LED0                STR R0,[R1]                             POP {R0,R1,PC}             LED_ON                PUSH {R0,R1, LR}                                    MOV R0,#0                 LDR R1,=LED0                STR R0,[R1]                             POP {R0,R1,PC}             LED_OFF                PUSH {R0,R1, LR}                                    MOV R0,#1                 LDR R1,=LED0                STR R0,[R1]                             POP {R0,R1,PC}                          Delay                PUSH {R0,R1, LR}                                MOVS R0,#0                MOVS R1,#0                MOVS R2,#0                DelayLoop0                        ADDS R0,R0,#1                CMP R0,#330                BCC DelayLoop0                                MOVS R0,#0                ADDS R1,R1,#1                CMP R1,#330                BCC DelayLoop0                MOVS R0,#0                MOVS R1,#0                ADDS R2,R2,#1                CMP R2,#15                BCC DelayLoop0                                                POP {R0,R1,PC}                     ;         NOP             END
复制代码
3、编译下载烧录步调
效果显示



来源:https://blog.csdn.net/oooooohou/article/details/111876320
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )