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 ...
随机推荐
- CLR调试报错“Visual Studio远程调试监视器 (MSVSMON.EXE) 的 64 位版本无法调试 32 位进程或 32 位转储。请改用 32 位版本”的解决
Win7 64位电脑上进行visual studio的数据库项目的CLR存储过程进行调试时,报错: ---------------------------Microsoft Visual Studio ...
- FTS抓包看L2CAP Connection的建立(一)
一.概述 在前面的文章中介绍了inquiry和ACL connection的建立过程.这个连接建立后,L2CAP signaling channel(CID = 0x0001)就已经存在,可以 ...
- SQL backup&restore
--完整备份Backup Database NorthwindCSTo disk='G:\Backup\NorthwindCS_Full_20070908.bak' --差异备份Backup Data ...
- Windows搭建Cocos2d-JS环境
目录 安装Python Cocos2d-JS框架 开发工具(WebStorm / Cocos Code IDE) 用Webstorm查看官方实例 使用Cocos Code IDE创建工程 1.安装Py ...
- 图解SSL/TLS协议
本周,CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明(这里和这里),突然意识到这是绝 ...
- Requirements Gathering
Requirements gathering is an essential part of any project and project management. Understanding ful ...
- 我的工具箱之MyEclipse9.1
下载地址:http://pan.baidu.com/s/1bbuN1s 这个工具是用来开发Java程序,自带JDK和Tomcat,功能全面周到,使用方便. 市面上MyEclipse版本很多,但都需要破 ...
- JS-JQ实现页面滚动时元素智能定位(顶部-其他部位)
先看效果: 阅读前提:充分理解div的三种定位方式:浮动,相对定位,绝对定位 方法一(顶部) 原理:直接使用css 进行控制:缺点:不兼容ie6-: 实现:positi ...
- 浅谈Java回调机制
像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号 ...
- 3d sphere opengl
http://stackoverflow.com/questions/5988686/creating-a-3d-sphere-in-opengl-using-visual-c