s5pv210 用汇编点亮led灯

2024-03-06 14:10
文章标签 s5pv210 led 汇编 点亮

本文主要是介绍s5pv210 用汇编点亮led灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,分析硬件工作原理

1.LED灯的物理特性

LED本身有2个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能就是点亮或者不亮

物理上想要点亮一颗LED只需要给他的正负极上加正电压即可,要熄灭一颗LED只需要去掉电压即可。

二, 分析原理图

通过原理图分析,发现LED灯 D22, D23, D24, D25 分别受 寄存器 GPJ0_3 , GPJ0_4, GPJ0_5, PWMTOUT1 控制

4个LED灯的阳极都连接到3.3v的电源 VDD_IO 上, 四个阴极连接到Soc的引脚上,通过Soc来控制LED阴极来输出正电平(1)或负电平(0),使得LED灯两端电压发生改变 控制LED灯的亮灭 。

 

 

 

三, 分析数据手册

1. 通过原理图分析发现,LED灯的阴极受GPJ0寄存器的控制,所以得先了解GPJ0寄存器

2 .通过编程控制Soc中的GPJ0寄存器来操控LED的亮灭

3. GPJ0 :general purpose input output 通用输入输出

4. GPIO就是芯片的引脚(芯片上的引脚有些不是GPIO,只有一部分是),作为GPIO的这类引          脚,他的功能和特点是可以被编程控制它的工作模式,也可以编程控制他的电压高低等。

5. GPJ0相关的寄存器有以下:

  GPJ0CON, (GPJ0 control)GPJ0控制寄存器,用来配置各引脚的工作模式    
  GPJ0DAT, (GPJ0 data)当引脚配置为input/output模式时,寄存器的相应位和引脚的电平高低    相对应。
  GPJ0PUD, (pull up down)控制引脚内部弱上拉、下拉 

  GPJ0DRV, (driver)配置GPIO引脚的驱动能力
  GPJ0CONPDN,(记得是低功耗模式下的控制寄存器)
  GPJ0PUDPDN  (记得是低功耗模式下的上下拉寄存器)
   注:在驱动LED点亮时,应该将GPIO配置为output模式。

  (写)输出  CPU向外部输出, (读)输入  CPU接收外部数据

6 .实际上真正操控LED的硬件,主要的有:GPJ0CON, GPJ0DAT 这么2个。
7. 如何点亮LED,编程的步骤是:
    1、操控GPJ0CON寄存器中,选中output模式
    2、操控GPJ0DAT寄存器,相应的位设置为0

GPJ0端口一共有8个引脚,分别记住:GPJ0_0 ~ GPJ0_7 , 相关重要寄存器就是GPJ0CON和GPJ0DAT

GPJ0CON寄存器中设置8个引脚的工作模式(32/8=4,每个引脚可以分到4位,譬如GPJ0_0对应的bit位为bit0~bit3,GPJ0_3对应的位为bit12~bit15。工作方法是:给相应的寄存器位写入相应的值,该引脚硬件就会按照相应的模式去工作。譬如给bit12~bit15写入0b0001,GPJ0_3引脚就成为输出模式了)

四, 找到相关的SFR(特殊功能寄存器) 

即GPJ0C0N GPJ0DAT 这两个寄存器

GPJODAT 寄存器中有8个bit为  0——7每一个位 写0或1来控制 GPJOCON寄存器的 GPJOCON_0———7的7个引脚
每一个寄存器是32位的,用到的位就配置,其他未用到的未就随便配置都没有影响
 

五, 写代码设置寄存器得到想要的效果

1. 汇编实现流水灯

//实现led流水灯效果#define GPJ0CON 0xE0200240    
#define GPJ0DAT 0xE0200244.global _start
_start:                                //_start 是一个符号,是汇编程序的的默认入口标号,每一 //个汇编程序的开头都要有// r0 --r17 通用寄存器//第一步对GPJ0CON寄存器进行模式设置ldr r0, =0x11111111                //从后面的“=” 可以看出 ldr 是伪指令, 因为需要编译器 //来判断这个数是合法立即数还是非法立即数 一般写代码都 //用ldr伪指令ldr把0x11111111数据读到 r0 通用寄存器中ldr r1, =GPJ0CON                   str r0, [r1]                       //寄存器的间接寻址, 功能是把r0中的数写入到r1中的数为 //地址的内存中去//循环体,led亮灭循环
flash://D4亮ldr r0, =(0<<3 | 1<<4 | 1<<5)      //把0写入到GPJODAT寄存器中,引脚即输出低电平,LED亮ldr r1, =GPJ0DATstr r0, [r1]//延时函数bl delay      //调用函数//D5亮  D4灭ldr r0, =(1<<3 | 0<<4 | 1<<5)ldr r1, =GPJ0DATstr r0, [r1]//延时bl delay      //调用函数//D6亮 D5灭ldr r0, =(1<<3 | 1<<4 | 0<<5)ldr r1, =GPJ0DATstr r0, [r1]//延时bl delay      //调用函数b flash       //跳转到flash的位置执行delay:ldr r2, =9000000ldr r3, =0x0
delay_loop:             //循环体 相当于while()sub r2, r2, #1      //r2 = r2-1cmp r2, r3          //判断r2 是否与 r3相等 影响z位bne delay_loop      // 如果不相等则 继续执行循环mov pc, lr          //函数返回值

使用位运算进行改进

对GPJODAT寄存器进行赋值 用位运算(&与  |或  ~非(取反)  位移(<<左移   >>右移))的方式

// 改进流水灯  代码#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244.global _start
_start://对GPJ0CON寄存器进行模式设置ldr r0, =0x11111111ldr r1, =GPJ0CONstr r0, [r1]//用循环来实现流水灯效果flash://点亮 D4ldr r0, =~(1<<3)    //位移与取反  0000 1000  取反得 1111 0111ldr r1, =GPJ0DATstr r0, [r1]//延时bl delay //调用延时函数//点亮 D5ldr r0, =~(1<<4)ldr r1, =GPJ0DATstr r0, [r1]//延时bl delay //调用延时函数//点亮 D6ldr r0, =~(1<<5)    ldr r1, =GPJ0DATstr r0, [r1]//延时bl delay //调用延时函数b flash
delay:ldr r2, =9000000ldr r3, =0x0
delay_loop:sub r2, r2, #1cmp r2, r3bne delay_loopmov pc, lr

六, 用到的相关汇编代码

.global   伪指令 在外部对汇编头的声明,保证 _start在文件外部也能用 (.global把_start链接属性改为外部,消除链接时的警告)

ldr    伪指令 用于从存储器中将一个32位的字数据传送到目的寄存器中。并检查立即数是否

例  ldr r0 ,=0x11111111

立即数  我们通常把在立即寻址方式指令中给出的数称为立即数

b是跳转指令  .代表当前这一句指令的地址,

b . 表示跳转到 . 执行      即死循环

str  是ARM汇编中的内存访问指令,表示字数据写入,用于将一个32位的字数据写入到指令中指定的内存单元

例  str r0, [r1]           把r0中的数据写到r1中指定的内存单元

sub  汇编中 是减的意思

例 sub r0 , r0, #1   意思为  r0 = r0 - 1

cmp  (比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数。

cmp 目的操作数, 源操作数      例 cmp r2, r3  比较 r2 和r3 中的 数据是否相等 cmp会影响CPSR寄存器中的z位

bl  函数调用

例 bl 函数名

mov pc, lr  函数返回 

ARM中的通用寄存器 

r0~r3 主要用于子程序间传递参数, r4~r11 主要用于保存局部变量,但在 Thumb 程序中,通常只能使用 r4~r7 来保存局部变量; r12 用作子程序间scratch 寄存器,即 ip 寄存器; r13 通常用做栈指针,即 sp; r14 寄存器又被称为连接寄存器(lr),用于保存子程序以及中断的返回地址; r15 用作程序计数器(pc),由于 ARM 采用了流水线机制,当正确读取了 PC 的值后,该值为当前指令地址加 8 个字节,即 PC 指向当前指令的下两条指令地址。

这篇关于s5pv210 用汇编点亮led灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/780309

相关文章

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步,特别是COB(Chip On Board)超微小间距LED技术的引入,LED智能会议一体机正迎来前所未有的发展机遇,成为大势所趋。 COB技术通过将LED芯片直接封装在基

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

全倒装COB超微小间距LED显示屏的工艺技术,相比SMD小间距有何优势

全倒装COB(Chip On Board)超微小间距LED显示屏,在工艺技术上的革新,相较于传统的SMD(Surface Mount Device)小间距LED显示屏,展现出了多方面的显著优势。 首先,全倒装技术极大地提升了LED芯片的散热性能。通过将芯片直接焊接在基板上,减少了热阻,使得热量能够更快速地传导至基板并散发出去,有效避免了因高温导致的光衰和色彩偏移问题,从而保证了显示屏的长期稳定性

没资料的屏幕怎么点亮?思路分享

这次尝试调通一个没资料的屏幕,型号是HYT13264,这个是淘宝上面的老王2.9元屏,成色很好但是长期库存没有资料和代码能点亮,仅仅只有一个引脚定义。这里我使用Arduino Nano作为控制器尝试点亮这个模块。 首先,已知别人找出来的线序如下 1 - CS2 - RST 3 - DC4 - SCK5 - SDA6 - VCC7 - GND8 - K59 - K410

GDB 查看汇编

查看汇编 x disassemble

RK3288 点亮LVDS屏

本文记录调试 LVDS接口屏的一些关键步骤,主要是dts文件中关于 频率、分辨率 、时序参数的设置  环境: RK3288 9tripod CV5  linux 4.4.189 LCD:JYT121XQ01 (追曦 DS1212)12.1电容触控屏   查看屏幕规格书    只要在rockchip dts 中 设置 T(HB)=Thb+Thf+Thsyn=320clock  T

STM32CubeMX 1 创建一个新工程 利用时钟点亮LED KEIL5 Jlink配置

直接上ST的官网下载STM32CubeMX安装 地址: 单片机:STM32F103C8T6 带外部8MHz晶振 目的:利用Timer和使LED按照1Hz的频率闪烁。 在此方面学霸级人物的指引下学习了,并写此文章记录,以防忘记。 新建工程 出现如下界面,中央就是这个封装的引脚图: 接下来开始配置 1. 设置外部晶振接口在PD0和PD1 单机想要配置的引脚,出现选择菜单。