完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、概述
STM32F103文件STM32F103文件是由简单的语言启动启动的。 启动文件名称:startup_stm32f10x_hd.s 内容 启动文件的作用是主要执行微控制器从“复位”到“开始执行主函数启动”,中间这段时间(此过程)所必须进行的工作。 启动文件完成的工作 初始化堆垛SP=_initial_sp 初始化PC轴=Reset_Handler 初始化中断向量表 配置系统时钟 调用C库函数_main初始化用户场景,导致转向我们用户应用程序的main。 二、目的 2.1、EQU EQU:数字常数取一个名,相当于C语言中的符号命令给定。 Stack_Size EQU 0x000000400 表示将0x00000400这个数值,用Stack_Size代替。 2.2、AREA 一个新的代码段或者数据段。AREA STACK,INIT,READWRITE=3 表示具体一个数据段,名字是STACK,NOINIT表示初始化不READWRITE表示可读写,ALIG表示字节码,通常后面会赋一个立即数,比如ALIGN = 3表示的就是2 ^ 3字节对齐,即8位字节对齐。 2.3,空间 分配一定大小的内存空间,单位为字节。 Stack_Men SPACE STACK_SIZE 表示给Stack_Men分配2.4PRESERVE8当前文件需要遵循8个字节 ,一个Stack_Size大小的内存空间。 2. 格式:直接写此压缩。 2. 2. 指令指令指令在THUMB 5、THUMB ARM ARM以前的集中有16个THUMBM,现在Cortex-M系列使用的都是指令指令,THUMB-2 -2 是 32 位的,只有 16 位和 32 位的语句,是 THUMB 的超级版。格式:直接写这个词 消毒 2.6、EXPORT 声明一个具有属性的标号,可被外部文件使用。 EXPORT _Vectors 表示_Vectors 标号具有属性,外部文件可以调用它。 2.7、直流电 以字为单位分配内存,要求4字节资料,并要求初始化这些内存。 DCD Reset_Handler ;重置处理程序 表示给 Reset_Handler 名称的地址分配内存并初始化。 在程序程序中“;”即注释。 学习中会接触很多的中断函数,这些中断函数名都可在DCD这部分找到。 2.8,PROC 定义子程序。 复位handlerReset_Handler PROC EXPORT Reset_Handler IMPORT SystemInit IMPORT _main LDR RO,= SystemInit BLX RO LDR RO,= _主BX RO ENDP 表示定义了一个外部程序Reset_Handler,需要与ENDP 成对使用,表示子程序结束,在EXPORT Reset_Handler [WEAK] 有一个WEAK,是弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不会出错。要的是:这个不是ARM的指令,是编译器的。 2.9、LDR 从那里加载的中字到一个电路中,常用格式: LDR RO,=SystemInit 2.10、BLX跳转 到由给出的地址,并根据寄存器的LSE确定处理器的状态,还有把跳转前的下条指令地址保存到LR。 常用格式: BX R0 2.11、 BX 跳转到由判断/标号给出的地址,不用返回。 常用格式: BX R0 2.12、TEMPORT IMPORT SystemInit IMPORT __main 表示声明标语语言来自外部文件,和 C 中的 extern 关键字类似。该函数,编译会报错。如果想修改 main.c 文件中的主要函数名,在这个地方就可以改变,然后后面的 LDR R0, =__main 中的 main 也需要改动。建议不要改。 2.13、B B:跳转到一个标号。常用格式如下 B。 乙后面有一个,汇编中表示循环这句话的意思就是说跳进了循环“” 2.14,IF,ELSE,ENDIF 汇编条件分支语句,与ç语言的的if else类似常用格式: IF: DEF:__MICROLIB EXPORT __initial_spPORT EX __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_memory_EXPORT __user_initial_stackheapENDIF 2.15、END 到达文件的,文件结束。 三、keil自带的语言帮组 四、数据 ;栈空间的开辟Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem SPACE Stack_Size __initial_sp ;栈的结束地址;栈空间的开辟Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3Stack_Mem SPACE Stack_Size __initial_sp ;栈空间的开辟Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3Stack_Mem SPACE Stack_Size __initial_sp的结束地址 在程序开始开辟了一个0x00000400即1KB的Stack_Size栈空间。 栈主要用于举办活动的参数值、局部变量的值等,其操作方式为数据结构中的栈。 栈的大小不能超过内部 RAM 的大小。 如果程序出现莫名不正常的错误,并进入了硬故障的时候,这里已经不是栈大了,通常我们最多修改的栈值。 紧接着又开辟了一个 0x00000200 也就是 512 字节的 Heap_Size 堆空间。 堆和集群生长方式是一种形象,堆是由低向高生长的,栈是由高向低生长的。 五、复位程序 在复位程序内,声明了外部文件标号 SystemInit 和__main(__main 是一个标准库函数,用于初始化外用户,最终还是进入 main,因此需要在这个标名部写出对应的文件函数,否则会报错。 在库文件 system_stm32f10x.c 内就写了 SystemInit() 函数;在 main.c 文件内也写了一个 main() 函数。所以这也就是为什么我们主函数是 main 这个名字了。 系统复位后进入复位函数,首先调用SystemInit()函数,初始化STM32系统,然后再进入我们熟悉的main()函数。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1784 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1088 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
729 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
734浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
559浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 21:09 , Processed in 0.802649 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号