LED流水灯(二)
记住看汇编的时候是红在上面 黑色在下面
startup.s 程序
; MDK跑马灯实验
;
PRESERVE8 // 字节对齐关键词 ,汇编有8位对齐的要求,要添加
AREA RESET, CODE, READONLY // AREA 伪指令 用于定义一个代码段或数据段,这里就是一个 代码段,段名为 RESET ,定义成 只读 ,参考 http://blog.csdn.net/beyondioi/article/details/7854011
ENTRY // ENTRY伪指令用于指定汇编程序的入口点 ,参考 http://blog.csdn.net/beyondioi/article/details/7854011
start // 作为汇编程序的一个标号,定义了程序的入口,既程序从start:处开始执行。 缺省也是可以的,但是奇怪的是 这里怎么没有 : 冒号啊,不是必须添加的吗???
; 关闭看门狗
ldr r0, = 0x53000000 ; 将看门狗控制寄存器地址放入r0 // 寄存器也是有地址的 参考 s3C2440 手册或者书 99页,watch dog 地址 便是 0x53000000 ,可以看知乎: http://www.zhihu.com/question/30155201?sort=created
mov r1, #0 //
str r1, [r0] ; 设置看门狗控制寄存器的值为0, str 指令 将r1寄存器的值,传送到地址值为r0的(存储器)内存中
bl initmem ; 跳转到initmem代码段,初始化内存 // 黄色箭头指到这里的时候,使用 图标,跳转到 initmem 标号的代码中
IMPORT xmain ; 引入xmain.c中的xmain函数
ldr sp, =0x34000000 ; 调用C程序之前先初始化栈指针
ldr lr, =endxmain ; 设置xmain函数的返回地址 为什么PC+ 0x0070
ldr pc, =xmain ; 跳转到C程序中的xmain函数的入口处执行
endxmain
ldr r0, =0x56000010 ; LED的GPIO接口配置寄存器
ldr r1, =0x00015400 ; GPIO配置数据
str r1, [r0] ; 设置GPIO
ldr r0, =0x56000014 ; LED控制寄存器地址
ldr r1, =0x000000e0 ; 全部LED亮
str r1,[r0]
loop
b loop ; 死循环
initmem ; 内存初始化
ldr r0, =0x48000000 ; 加载内存相关寄存器首地址r0
ldr r1, =0x48000034 ; 加载内存相关寄存器尾地址到r1 // 相当于 LDR R1 ,[PC,#0x0058] 参考书 ARM体系(P85也),将内存单元 PC+0x0058 中的字读取到 R0 寄存器中,
与 计算机为什么会 这样做呢?? PC=0x3C 加上 0x58 还是 94啊 不是 9C 相差了 8位,有点乱了,不过差不多了
adr r2, memdata ; 将寄存器配置数据地址段首地址加载到r2
PC=0x000040 + 0x00010 = 0x00050 + 8 (也相差8位),读到了, R2=58 ,这么说来 R2 原来就是 0
initmemloop
ldr r3, [r2], #4 ; 循环设置存寄存器 ,将地址为R2的内存单元数据读取到 r3 中,并且 R1=R1+4
str r3, [r0], #4 ; 与上面一样
teq r0, r1
bne initmemloop ; 循环到最后一个寄存器时退出函数,BNE指令,是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行
BX lr ; mov pc,lr
memdata
DCD 0x22000000 ;BWSCON // PC 指针 0X000058
DCD 0x00000700 ;BANKCON0
DCD 0x00000700 ;BANKCON1
DCD 0x00000700 ;BANKCON2
DCD 0x00000700 ;BANKCON3
DCD 0x00000700 ;BANKCON4
DCD 0x00000700 ;BANKCON5
DCD 0x00018005 ;BANKCON6
DCD 0x00018005 ;BANKCON7
DCD 0x008e07a3 ;REFRESH
DCD 0x000000b1 ;BANKSIZE
DCD 0x00000030 ;MRSRB6
DCD 0x00000030 ;MRSRB7
END
第二个函数 cmain.c 函数
- /*C语言函数*/
- /*端口F寄存器预定义*/
- #define GPBCON (*(volatile unsigned long *)0x56000010) // GPBCON 控制寄存器的地址
- #define GPBDAT (*(volatile unsigned long *)0x56000014)
- #define LEDS (1<<5|1<<6|1<<7|1<<8)
- #define DELAYVAL (0xffff)
- extern int delay(int time); /*声明汇编函数*/
- int xmain(void)
- {
- int i = ;
- GPBCON = 0x00015400;// 定义了 四个LED 都为输出端口
- while(i>)
- {
- GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED1 亮了,其余灭
- delay(DELAYVAL);//调用汇编语言编写的延时程序
- GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED2 亮了,其余灭
- delay(DELAYVAL);//调用汇编语言编写的延时程序
- GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED3 亮了,其余灭
- delay(DELAYVAL);//调用汇编语言编写的延时程序
- GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED4 亮了,其余灭
- delay(DELAYVAL);//调用汇编语言编写的延时程序
- i--;
- }
- return ;
- }
现在我们主要老讨论下面这两行代码:
- #define LEDS (1<<5|1<<6|1<<7|1<<8)
- GPBDAT=(GPBDAT&(~LEDS)) | (1<<6|1<<7|1<<8); // LED1 亮了,其余灭
- 这个可以去看 另外一篇 LED 随笔,终于懂了啊
LED流水灯(二)的更多相关文章
- 第一个FPGA工程—LED流水灯
这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...
- 使用CCS10新建TMS320F28335工程并闪烁LED(流水灯)程序
学习TMS320F28335使用Code Composer Studio 10.4.0下载和安装本文不再叙述. 1. 新建工程 1.1选择目录新建工作区 1.2打开软件界面如下图所示: 1.3选择新建 ...
- 学习笔记——单片机简介 & 点亮LED & 流水灯 & 电路基础【更新Ing】
视频地址:https://www.bilibili.com/video/av10765766 超详细!!!!!! 单片机内部三大资源 [资源:单片机可提供使用的东西] FLASH 可以重复擦写 断电后 ...
- 关于LED 流水灯的软件调试方法(非开发板调试)
因为: 硬件 norflash 有寿命,所以尽量少用,而且自己也不会把 程序在 KEIL中从SDRAM 中调试,不会设置.所以采取软件虚拟的方法调试. 主要修改一下几部分: 1. ledcircle ...
- TQ210裸机编程(2)——LED流水灯
两个文件start.S和led.c start.S .global _start @声明一个全局的标号 _start: bl main ...
- [DM8168]Linux下控制GPIO实现LED流水灯
首先加载驱动模块,应用程序通过调用API实现GPIO控制功能. 驱动程序: /* * fileName: led_gpio.c * just for LED GPIO test * GP1_14 -& ...
- 利用简单的有限状态机(FSM)来实现一个简单的LED流水灯
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 有限状态机是指输出取决于过去 ...
- (一)GPIO 编程实验 LED 流水灯控制
7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...
随机推荐
- 蓝牙—逻辑链路控制和适配协议(L2CAP)
L2CAP(Logical Link Control and Adaption Protocol),链路控制和适配协议,位于基带层之上,将基带层的数据分组交换以便于高层应用的数据分组格式,并提供复用和 ...
- Android项目框架升级尝鲜OkHttp
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 随着项目日趋稳定,需求不再总是变化,那么是时间来整理下项目了.先简单介绍下,本项目最初使用loop4 ...
- 自动将每日的日志增量导入到hive中
一:大纲介绍 1.导入方式 load data local inpath 'local_file_path' into table tbname partition (date='',hour='') ...
- Qt 自定义 滚动条 样式(模仿QQ)
今天是时候把软件中的进度条给美化美化了,最初的想法就是仿照QQ. 先前的进度条是这样,默认的总是很难受欢迎的:美化之后的是这样,怎么样?稍微好看一点点了吧,最后告诉你实现这个简单的效果在Qt只需要加几 ...
- NSNotificationCenter带参
(1)post Notification类 [[NSNotificationCenter defaultCenter] postNotificationName:CRMPerformanceNewCe ...
- OC的内存管理
摘自:http://blog.csdn.net/hahahacff/article/details/39839571 OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有 ...
- TortoiseGit 的使用
日常用法 (1) 创建新库 在文件夹中按右键, 选择Git Create repository here 就可以创建库了. 在出现的窗口中, 不勾选选项, 直接按OK 在目录中就会出现一个名为.git ...
- 解决IntelliJ Idea中文乱码问题
乱码的根源是字符编码与解码不一致 解决之道:统一编码
- html5添加音乐包括暂停
<audio id="musicfx" loop="loop" autoplay="autoplay"> <source ...
- iOS:runtime最全的知识总结
runtime 完整总结 好东西,应该拿出来与大家分享... 南峰子博客地址:http://southpeak.github.io/blog/categories/ios/ 原文链接:http://w ...