文章目录
任务要求
一. 请说明STM32的三种Boot模式的差别,并在之前第11-12周“C语言各种变量的存储地点”作业代码根本上,研究至少两种boot模式下,代码下载(烧录)运行后所在的地点位置,与理论对比验证。
二. 在Keil下完成一个汇编步伐的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容,解释其寄义。
三. 在上面Keil 汇编根本上,用汇编步伐完成 每隔断1秒钟闪烁一次LED的步伐。
BOOT模式
BOOT模式的选择涉及到STM32芯片BOOT两个引脚BOOT0,BOOT1的选择,如下:
1.BOOT0=0,BOOT1=X——主存储器模式
2.BOOT0=1,BOOT1=0——系统存储器模式
3.BOOT0=1,BOOT1=1——内置SRAM模式
通常使用串口下载步伐,选择第二种模式,也就是系统存储器模式(BOOT0为 1, BOOT1为 0)。
而第一种主存储器模式( BOOT0 为 0,BOOT1 为任意),这种方法使得单片机跑代码启动的时候一按下复位键就可以执行。
SRAM 是芯片内置的RAM区,就是内存,如果出现步伐硬件错误的话就可以切换BOOT0/1到该模式下重新烧写Flash即可恢复正常。
汇编简述
工程设置
1.选择新建工程,如下:
2.生存工程,如下:
3.芯片选择为“STM32F103ZE",如下:
4.在设置文件的选择中如下:
5.新建一个.S源文件,如下:
右键单击Source Group 1,选择Add New Item to Group,添加源文件;
2.添加.S文件,生存文件名,如下:
代码调试
1.源码如下,复制到msytest.s文件中即可:
- 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
复制代码 代码烧录
1.点击邪术棒,如下:
2.设置硬件仿真器为ST-LINK,本人所用为ST-LINK,可按实际选择。如下:
3.点击setting,选择”SW",如下:
这里的前提是已经将STM32与自己的电脑毗连好的情况下。
毗连如下:
代码调试
1.开始调试,选择Building,然后选择调试,如下:
2,进入如下页面:
3.该步伐主要是设置寄存器的值,可以看到:
- func01 MOV R5, #05 BX LR func02 MOV R6, #06 BX LR func03 MOV R7, #07 MOV R8, #08 BX LR
复制代码
寄存器R5,R6,R7,R8的值和步伐设置一致
HEX文件
hex是用来传输存在于寄存器中的数据。
16进制代码数据表现。
1.注意导出的时候勾选HEX文件,如下:
2.在文件导出的路径用UltraEdit 打开HEX文件,如下:
UltraEdit 是一款文本编辑器,但是功能比记事本强大得多,可以编辑文本、十六进制、ASCII 码,下载安装包正常安装即可。
3.查看代码,第一行:
- :020000040800F2————》0x02 0x00 0x00 0x00 0x04 0x08 0x00 0xF2
复制代码 因为每一行都是一次纪录的数据,可以看到,每一行都是以冒号开头,全部用十六进制表现。
第一个字节 0x02表现本行数据的长度;
第二、三个字节 0x00 0x00表现本行数据的起始地点;
第四个字节 0x04表现数据范例;
第五,六个字节是数据:0x08 0x00;
最后一个字节是校验和: 0xf2。
关于第四个字节数据范例一般有六种,如下:
- '00' Data Rrecord:纪录数据;'01' End of File Record: 标识文件竣事,一般在末了'02' Extended Segment Address Record: 标识扩展段地点纪录'03' Start Segment Address Record:开始段地点纪录'04' Extended Linear Address Record: 标识扩展线性地点的纪录'05' Start Linear Address Record:开始线性地点纪录**
复制代码 汇编训练
工程设置
1.根据上文中的方法,创建LED灯闪烁的汇编工程,如下:
注意:这里不需要设置情况,也就是说工程里只有一个LED.s文件,不需要启动文件Start up
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
复制代码 烧录设置
1.编译通过按照上文方法设置烧录即可。
2.烧入后,观察单片机LED灯正常按照每隔断1秒钟闪烁一次,如下:
总结
以上就是汇编步伐的简朴工程的学习。
参考泉源:
https://blog.csdn.net/u010632165/article/details/106481146
https://www.cnblogs.com/long5683/p/9638866.html
https://www.bbsmax.com/A/B0zq8RZdvL/
来源:https://blog.csdn.net/qq_44644740/article/details/111827547
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |