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

STM32汇编程序设计基础

[复制链接]
西小妹谈娱 发表于 2021-1-1 09:59:31 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
文章目录



任务要求

  一. 请说明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文件中即可:
  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
复制代码
代码烧录

1.点击邪术棒,如下:

2.设置硬件仿真器为ST-LINK,本人所用为ST-LINK,可按实际选择。如下:

3.点击setting,选择”SW",如下:

  这里的前提是已经将STM32与自己的电脑毗连好的情况下。
毗连如下:

代码调试

1.开始调试,选择Building,然后选择调试,如下:

2,进入如下页面:

3.该步伐主要是设置寄存器的值,可以看到:
  1. 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.查看代码,第一行:
  1. :020000040800F2————》0x02 0x00 0x00 0x00 0x04 0x08 0x00 0xF2
复制代码
因为每一行都是一次纪录的数据,可以看到,每一行都是以冒号开头,全部用十六进制表现。
  第一个字节 0x02表现本行数据的长度;
第二、三个字节 0x00 0x00表现本行数据的起始地点;
第四个字节 0x04表现数据范例;
第五,六个字节是数据:0x08 0x00;
最后一个字节是校验和: 0xf2。

关于第四个字节数据范例一般有六种,如下:
  1. '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.源代码如下:
  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
复制代码
烧录设置

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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

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

本版积分规则


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

18768367769

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

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

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