完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
2个回答
|
|
汇编实现LED灯闪
1. 本文目的 基于汇编语言实现最简单的LED灯闪烁。 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。汇编的作用有很多,这里我们更偏终于对高级语言的理解,高级语言C语言、C++语言有很多概念,如果我们懂汇编,看懂每一行代码编译器生成的汇编代码,我们就能知道这行代码计算机在做什么,从本质上理解高级语言。同时,启动代码使用的也是汇编语言,汇编是高手的必经之路。 2. 硬件平台
MDK uVision V5.24.2.0 4. 实现步骤
;led.s LED0 EQU 0x422101a0 RCC_APB2ENR EQU 0x40021018 GPIOA_CRH EQU 0x40010804 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;AREA命令:堆栈段 不初始化 可读写 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 ;汇编器支持THUMB指令 REQUIRE8 ;该文件标识为REQ8属性 PRESERVE8;汇编文件是8字节对齐 ENTRY ;声明整个程式的入口点 Reset_Handler BL LED_Init MainLoop 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} END END 5. 代码分析 1)首先分配一个STACK段,该段不初始化,可读写,按8字节对齐。分配一个大小为Stack_Size的存储空间,并使栈顶的地址为__initial_sp。 2)DCD指令:用于分配一片连续的字存储单元(32bit),并将表达式的值初始化给该字存储单元,类似于C中定义数组并初始化。 3) 开始代码段 AREA |.text|, CODE, READONLY THUMB REQUIRE8 PRESERVE8 这段的意思是,汇编器支持THUMB指令,代码段按8字节对齐。 ENTRY命令:声明整个程式的入口点,入口点有且仅有一个。不管哪种语言,编译器都得有个入口点。 LR 是连接寄存器(Link Register, LR),在ARM体系结构中LR的是用来保存子程序返地址 6. 汇编的基本语法
MOV R0,#1 ;将立即数1送入R0. LDR R1,=LED0;将PA8 bit-bond的地址送入R1. STR R0,[R1];将R0的值,也就是1,送给R1中的值所指向的地址中,也就是PA8的地址。 以上代码段相关指令的介绍结束 。 7. 出现的问题及解决方法 编译后警告: .Objectsproject.sct(8): warning: L6314W: No section matches pattern *(InRoot$$Sections). 以下转载自 keil mini2440 分散加载文件scatter中(InRoot$$Sections)的理解 分析: (InRoot Sections)实现对映像的加载,这一段代码就是∗(InRoot" role=“presentation”>Sections)实现对映像的加载,而这一段代码就是∗(InRoot Sections)是__main()的一部分。如果只用汇编代码,没有 C 代码,则这一段加载应该去除。 从启动代码说起 启动代码 1。异常/中断跳转的地址表。 2。堆栈初始化 3。分散加载镜像文件 IMAGE(映像文件) 1个RO, 1个RW, 1个ZI组成。 并且RO的load region和execution region相同,这个里面放置 *(InRoot$$Sections) 主要作用COPY RW区到RAM,然后再RW区后面创建ZI区。 库函数__main函数中有这个段。 ,则这一段加载应该去除。 从启动代码说起 启动代码 1。异常/中断跳转的地址表。 2。堆栈初始化 3。分散加载镜像文件 IMAGE(映像文件) 1个RO, 1个RW, 1个ZI组成。 并且RO的load region和execution region相同,这个里面放置 *(InRoot$$Sections) 主要作用COPY RW区到RAM,然后再RW区后面创建ZI区。 库函数__main函数中有这个段。 注释掉"…InRoot…",如图示,则编译不再出现警告。 |
|
|
|
汇编是哪种芯片的呢,是51的还是ARM的呢
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1561 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1501 浏览 1 评论
933 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
665 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1555 浏览 2 评论
1847浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
609浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
503浏览 3评论
507浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
488浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:01 , Processed in 0.782600 second(s), Total 80, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号