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、在汇编文件中添加步调
- 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、直接添加一个汇编文件
- 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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |