浅谈STM32的三种Boot模式的差异以及用汇编语言设计一个LED灯程序
STM32的三种Boot模式的差异
- 1.三种方式的比较
- 用汇编程序完成LED的程序
1.三种方式的比较
所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
Main Flash memory
是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
主函数:
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;int main(void){ static int m1=2, m2;int i = 1;char *p;char str[10] = "hello";char *var1 = "123456";char *var2 = "abcdef";int *p1=malloc(4);int *p2=malloc(4); u16 t; u16 len; u16 times=0;free(p1);free(p2);delay_init(); //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200KEY_Init(); //初始化与按键连接的硬件接口while(1){for(t=0;t<len;t++){ while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}USART_RX_STA=0;times++;if(times%500==0){printf("栈区-变量地址\r\n");printf(" i=%p\r\n", &i);printf(" p=%p\r\n", &p);printf(" str=%p\r\n", str);printf("\n堆区-动态申请地址\r\n");printf(" %p\r\n", p1);printf(" %p\r\n", p2);printf("\r\n.bss段");printf("\n全局外部无初值 k2:%p\r\n", &k2);printf("静态外部无初值 k4:%p\r\n", &k4);printf("静态内部无初值 m2:%p\r\n", &m2);printf("\r\n.data段");printf("\n全局外部有初值 k1:%p\r\n", &k1);printf("静态外部有初值 k3:%p\r\n", &k3);printf("静态内部有初值 m1:%p\r\n", &m1);printf("\r\n常量区\n");printf("文字常量地址 :%p\r\n",var1);printf("文字常量地址 :%p\r\n",var2);printf("\r\n代码区\n");printf("程序区地址 :%p\n",&main);}delay_ms(10); }}
System memory
从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,
出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:
Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动可以看到, 利用串口下载程序还是比较的麻烦, 需要跳帽跳来跳去的,非常的不注重用户体验。
栈区-变量地址i=20000760p=2000075cstr=20000750堆区-动态申请地址20000198200001a8.bss段
全局外部无初值 k2:20000004
静态外部无初值 k4:2000000c
静态内部无初值 m2:20000018.data段
全局外部有初值 k1:20000000
静态外部有初值 k3:20000008
静态内部有初值 m1:20000014常量区
文字常量地址 :08000318
文字常量地址 :08000324代码区
程序区地址 :080001dd
Embedded Memory
内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。
用汇编程序完成LED的程序
1.新建工程
2.Add new item
3.源代码
LED0 EQU 0x422101a0
RCC_APB2ENR EQU 0x40021018
GPIOA_CRH EQU 0x40010804Stack_Size EQU 0x00000400AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_spAREA RESET, DATA, READONLY__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerAREA |.text|, CODE, READONLYTHUMBREQUIRE8PRESERVE8ENTRY
Reset_Handler BL LED_Init
MainLoop BL LED_ONBL DelayBL LED_OFFBL DelayB MainLoopLED_InitPUSH {R0,R1, LR}LDR R0,=RCC_APB2ENRORR R0,R0,#0x04LDR R1,=RCC_APB2ENRSTR R0,[R1]LDR R0,=GPIOA_CRHBIC R0,R0,#0x0FLDR R1,=GPIOA_CRHSTR R0,[R1]LDR R0,=GPIOA_CRHORR R0,R0,#0x03LDR R1,=GPIOA_CRHSTR R0,[R1]MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}LED_ONPUSH {R0,R1, LR} MOV R0,#0 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}LED_OFFPUSH {R0,R1, LR} MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC} DelayPUSH {R0,R1, LR}MOVS R0,#0MOVS R1,#0MOVS R2,#0DelayLoop0 ADDS R0,R0,#1CMP R0,#330BCC DelayLoop0MOVS R0,#0ADDS R1,R1,#1CMP R1,#330BCC DelayLoop0MOVS R0,#0MOVS R1,#0ADDS R2,R2,#1CMP R2,#15BCC DelayLoop0POP {R0,R1,PC} NOPEND
如果有不懂得地方,可以参考这篇博客
链接: link.https://www.bbsmax.com/A/B0zq8RZdvL/
浅谈STM32的三种Boot模式的差异以及用汇编语言设计一个LED灯程序相关推荐
- 浅谈STM32的三种Boot模式
文章目录 一.关于BOOT模式的介绍 二.实际例子进行分析 三.分析上电启动流程 四.小结 五.参考资料 一.关于BOOT模式的介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的 ...
- STM32的三种Boot模式的差异
STM32的三种Boot模式的差异 一. STM32启动配置 二. 内置SRAM简介 三. 例程验证 3.1 硬件设置 3.2 创建工程调试版本 3.3 配置分散加载文件 3.5 配置中断向量表 3. ...
- STM32的三种Boot模式地址分配
STM32的三种Boot模式地址分配 一.STM32的三种Boot模式 1.主闪存存储器 2.系统存储器 3.内置SRAM 二.三种模式地址分配验证 主闪存存储器 系统存储器 三.汇编程序完成每间隔1 ...
- STM32的三种BOOT模式
文章目录 一.三种BOOT模式的对比 1.内部 FLASH 启动方式 2.内部 SRAM 启动方式 3.系统存储器启动方式 二.BOOT模式下代码运行后所在地址分析 1.从内部 FLASH 启动 2. ...
- STM32三种BOOT模式的差异
文章目录 前言 三种BOOT模式 主闪存存储器 系统存储器 内置SRAM 烧录程序验证 主要代码 主闪存存储器烧录验证 系统存储器烧录验证 内置SRAM烧录验证 前言 本篇文章分析了3种BOOT模式下 ...
- 探究 STM32 的三种 BOOT(启动) 模式并实例验证
目录 一.什么是 Boot 模式 二.实例验证 三.总结 四.参考资料 说明 STM32 的三种 Boot 模式的差异,并在之前第11-12周"C语言各种变量的存储地址"作业代码基 ...
- STM32三种BOOT模式
探究STM32三种BOOT模式 简介 一.三种BOOT模式比较 二.开发BOOT模式选择 三.实验项目 (1)实验要求 (2)实验过程 a.STM32内置的Flash启动--最常用 b.从系统存储器启 ...
- STM32单片机的启动模式 三种BOOT模式介绍
在绘制32单片机时,参考别人的原理图对单片机的启动方式BOOT有疑问, 这里写目录标题 自己的理解和应用 一.三种BOOT模式启动的介绍 二.自己开发BOOT模式的选择 官方的文档介绍 自己的理解和应 ...
- STM32三种BOOT模式介绍
一.三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启 ...
最新文章
- PyTorch在NLP任务中使用预训练词向量
- 简单配置nginx反向代理,实现跨域请求
- 女朋友啥时候怒了?Keras识别面部表情挽救你的膝盖
- Laravel-admin添加模型路由报错出现问题:Model does not exists !
- Spark _17 _SparkShuffle、HashShuffleManager、SortShuffleManager
- C#字符串的基本操作
- 58个PPT下载丨2019 PostgreSQL中国技术大会资源放送
- 分布式选举协议:Paxos
- 可以记录阅读进度的 pdf 电脑阅读器
- 人工智能:从单细胞生物的智能说起
- js中改变原数组的方法以及解决改变原数组的方法
- 私有服务器虚拟化软件市场排名,操作系统、数据库和虚拟化软件2017年市场格局分析...
- 前端开发实习生第一天都在做什么?需要准备什么东西
- 无人机欧拉角万向节锁死详解
- 跳步游戏2--返回最小跳步数
- Word转换PDF的三种方法使用教程
- 淘宝自动回复机器人配置手册——利用旺旺分流针对性配置
- 什么是互联网营销?看一篇这就够了
- 获取Android_Studio模拟器root权限的方法
- 河南大学计算机学院吴哲2008年,计算机与信息工程学院86级校友荣归母校