完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、STM32的三种Boot模式简介
STM32的启动方式一般以储存器的类型来区分, 如下: 主闪存存储器,内部SRAM启动方式 ,系统储存器启动方式。 [tr]BOOT1BOOT0启动模式说明[/tr]
STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。 2.系统存储器(System memory) 从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。 3.内置SRAM(Embedded Memory) 内置SRAM这个模式一般用于程序调试。 三种模式的访问地址 主闪存存储器:访问地址为0x00000000或0x08000000 系统存储器:访问地址为0x00000000或0x1FF00000 内置SRAM:启动时地址为0x00000000或0x20000000 中断向量表 主闪存存储器 中断向量表从Flash的起始地址(0x08000000)开始存放。同时映射到0x00000000处。向量表偏移寄存器的值为0x00000000(实际映射到0x08000000)。 内置SRAM 中断向量表还是存放在Flash中(Flash才能固化存储,SRAM只能加电才有效),只不过拷贝到SRAM的首地址0x20000000处。此时向量表偏移寄存器的值也是0x00000000(实际映射到0x20000000)。 二、创建纯汇编语言的STM32工程 1.工程创建 点击Project,选择New μvison Project 选择芯片STM32F103RC 运行环境选择CMSIS->CORE和DEVICE->Startup 这样工程就创建成功了 2.添加文件 在sourcegroup上新建文件,选择.s文件 现在就可以编写程序了 3.汇编程序 代码 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 4.调试 选择仿真器 设置硬件仿真器为ST_Link(根据自己的实际情况进行选择),仿真器的模式设置为JTAG接口或者SW(根据自己的实际情况进行选择)。设置完成,连接相应的仿真器会有对应信息显示。 选择端口为SW,再点击Download 进行添加 然后就可以进行仿真调试了(断点设置是在代码行前点击,出现红点,即表明断点设置成功) 仿真界面 5.分析编译生成的Hex文件 查看生成的hex文件 最终生成的程序大小 第一行内容分别是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。 0x02 该行数据中有两个数据 0x00 0x00 本行数据的起始地址位 0x04 用来标识扩展线性地址的记录 该字节还可以是其他值,下面是其他值的含义 00:用来记录数据,HEX文件的大部分记录都是数据记录 01:用来标识文件结束,放在文件的最后,标识HEX文件的结尾 02:用来标识扩展段地址的记录 03:开始段地址记录 05:开始线性地址记录 0x08 0x00 该行两个字节的数据 数据类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址 0xF2 校验和,校验和= 0x100 - 累加和 6.使用汇编实现LED闪烁 代码内容如下 LED0 EQU 0x40011004;定义引脚PC2 RCC_APB2ENR EQU 0x40021018;配置RCC寄存器,时钟 GPIOC_CRL EQU 0x40011000;配置CRL寄存器 Stack_Size EQU 0x00000400;栈的大小 ;分配一个STACK段,该段不初始化,可读写,按8字节对齐。分配一个大小为Stack_Size的存储空间,并使栈顶的地址为__initial_sp。 AREA STACK, NOINIT, READWRITE, ALIGN=3;NOINIT: = NO Init,不初始化。READWRITE : 可读,可写。ALIGN =3 : 2^3 对齐,即8字节对齐。 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_Init;BL:带链接的跳转指令。当使用该指令跳转时,当前地址(PC)会自动送入LR寄存器 MainLoop BL LED_ON BL Delay BL LED_OFF BL Delay B MainLoop;B:无条件跳转。 LED_Init;LED初始化 PUSH {R0,R1, LR};R0,R1,LR中的值放入堆栈 LDR R0,=RCC_APB2ENR;LDR是把地址装载到寄存器中(比如R0)。 ORR R0,R0,#0x04;ORR 按位或操作,将将R0的第二位置1,其他位不变 LDR R1,=RCC_APB2ENR STR R0,[R1];STR是把值存储到寄存器所指的地址中。 LDR R0,=GPIOC_CRL BIC R0,R0,#0x0F;BIC 先把立即数取反,再按位与 LDR R1,=GPIOC_CRL STR R0,[R1] LDR R0,=GPIOC_CRL ORR R0,R0,#0x03 LDR R1,=GPIOC_CRL STR R0,[R1] ;将PC2置1 MOV R0,#1 LDR R1,=LED0 STR R0,[R1] POP {R0,R1,PC};将栈中之前存的R0,R1,LR的值返还给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 三、小结 通过本次实验,对汇编有了一定的认识,了解了它相较于其他语言的优点,但想要自己进行编写,还是任重而道远。 |
|||
|
|||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1609 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1540 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1587 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
529浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
503浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 02:35 , Processed in 0.588634 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号