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

STM32汇编程序

[复制链接]
西小妹谈娱 发表于 2021-1-1 10:01:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
一、STM32的三种Boot模式的差异

所谓启动,一般来说就是指我们下好步调后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。

启动模式
1.主闪存存储器(Main Flash memory)
STM32内置的Flash,一般我们使用JTAG大概SWD模式下载步调时,就是下载到这个内里,重启后也直接从这启动步调。
2.系统存储器(System memory)
从系统存储器启动,这种模式启动的步调功能是由厂家设置的。一般来说,这种启动方式用的比力少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP步调, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载步调,因为在厂家提供的BootLoader中,提供了串口下载步调的固件,可以通过这个BootLoader将步调下载到系统的Flash中。
3.内置SRAM(Embedded Memory)
内置SRAM这个模式一般用于步调调试。
4.三种模式的访问地点
主闪存存储器:访问地点为0x00000000或0x08000000
系统存储器:访问地点为0x00000000或0x1FF00000
内置SRAM:启动时地点为0x00000000或0x20000000
5.中断向量表
主闪存存储器
中断向量表从Flash的起始地点(0x08000000)开始存放。同时映射到0x00000000处。向量表偏移寄存器的值为0x00000000(实际映射到0x08000000)。
内置SRAM
中断向量表照旧存放在Flash中(Flash才气固化存储,SRAM只能加电才有效),只不外拷贝到SRAM的首地点0x20000000处。此时向量表偏移寄存器的值也是0x00000000(实际映射到0x20000000)。
二、实际例程

任务要求:研究各种boot模式下,代码下载运行后所在的地点位置,与理论对比验证
代码分析:运用之前输出变量的代码来分析boot模式的差异。
1.使用ST-link举行烧录步调

运行效果:

2.串口举行烧录步调:
由于野火mini开发板配置了ISP一键下载的电路,实现通过上位机控制RTS,DTR引脚来实现BOOT0和BOOT1的改变。
使用串口下载步调,举行烧录步调


效果分析:接纳ST_Link烧录的步调,打开串口之后,开发板和上位机直接就可以直接举行通信。而对于串口烧录的步调来说,打开串口后,没有任何反应,要实现通信必须要按一下复位键,才气够通信。通过这一利用,可以看出接纳ST_Link烧录的步调是直接被放置到FLASH中,而串口烧录的步调就不是位于FLASH中,需要手动复位才气在FLASH启动中被看到。
三、基于MDK创建纯汇编语言的STM32工程

1.首先新建一个工程,选择我们的stm芯片范例

接着选择启动文件

右击Source Group 1
添加一个.s文件

2.输入代码如下
  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
复制代码
3.开始调试步调
需要设置一下
点击邪术棒
将这几处举行修改

4.点击Debug开始仿真
效果如下


5.我们查看生成的.hex文件,发现有许多数据

四、调试一个用汇编语言写的小灯闪烁的步调

1.添加一个LED.s文件
步调如下:
  1. ;预界说LED0 EQU 0x422201b4 ;PC13的Bit-Bond地点RCC_APB2ENR EQU 0x40021018GPIOA_CRH EQU 0x40011004  ;分配栈空间Stack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3        ;汇编一个新的代码段或数据段Stack_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                 ENTRY                                                ;声明整个程式的入口点,入口点有且仅有一个Reset_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,#0XFF0FFFFF                LDR R1,=GPIOA_CRH                STR R0,[R1]                 LDR R0,=GPIOA_CRH                ORR R0,R0,#0X00300000                LDR R1,=GPIOA_CRH                STR R0,[R1];将PC13置1                 MOV R0,#1                         ;将立刻数1送入R0                LDR R1,=LED0                STR R0,[R1]                POP {R0,R1,PC};LED亮 LED_ON                PUSH {R0,R1,LR}                    MOV R0,#0                LDR R1,=LED0                STR R0,[R1]                 POP {R0,R1,PC};LED灭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
复制代码
2.将其生成的.hex文件烧录到芯片中

3.运行效果如下


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

使用道具 举报

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

本版积分规则


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

18768367769

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

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

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