首页 > 系统相关 >Linux汇编LED驱动

Linux汇编LED驱动

时间:2022-10-30 21:26:46浏览次数:41  
标签:汇编 R0 R1 GPIO Linux 指令 寄存器 LED 跳转

MX6U的IO口作为GPIO的步骤总结:

  1. 使能GPIO对应的时钟
  2. 设置寄存器IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置 IO 的复用功能,使其复用为 GPIO 功能。
  3. 设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置 IO 的上下拉、速度等等。
  4. 第2步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO,设置输入/输出、是否使 用中断、默认输出电平等。

总结:类似于stm32的初始化,先使能时钟,在对引脚初始化,然后设置高低电平输入输出。在MX6U的IO口复用为GPIO时的时钟使能,需要对CCM(ClockController Module)里面的寄存器做设置,开发手册上的例子就是控制GPIO的时钟在寄存器的31和30位,按手册设置就行。

GUN汇编语法知识:

  • 语句有三个可选部分:  label:instruction @ comment  ,这里的label是标号,instruction是指令,@符号是注释。举个例子: 这里的add:就是标号,@后面为注释,中间为代码指令。
    add:
    MOVS R0, #0X12 @设置 R0=0X12

     

     

    处理器内部数据的传输指令:
    指令 目的 描述
    MOV R0 R1 将R1里面的数据复制到R0中

    MRS

    (只能用于特殊寄存器数据传给通用寄存器)

    R0 CPSR 将特殊寄存器CPSR里面的数据复制到R0中

    MSR

    (只能用于通用寄存器的数据传给特殊寄存器)

    CPSR R1 将R1里面的数据复制到特殊寄存器CPSR中
    举个例子:
    MOV R0,R1 @将寄存器 R1 中的数据传递给 R0,即 R0=R1
    MOV R0, #0X12 @将立即数 0X12 传递给 R0 寄存器,即 R0=0X12

     

    存储器访问指令:(最常用)
    指令

    描述

    LDR Rd, [Rn , #offset]

    从存储器 Rn+offset 的位置读取数据存放到 Rd 中。

    STR Rd, [Rn, #offset]

    将 Rd 中的数据写入到存储器中的 Rn+offset 位置。

    举个例子:
    LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
    LDR R1, [R0] @读取地址 0X0209C004 中的数据到 R1 寄存器中
    LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
    LDR R1, =0X20000002 @R1 保存要写入到寄存器的值,即 R1=0X20000002
    STR R1, [R0] @将 R1 中的值写入到 R0 中所保存的地址中

     

    压栈和出栈指令:
    指令 描述

    PUSH <reg list>

    将寄存器列表存入栈中。

    POP <reg list>

    从栈中恢复寄存器列表。

    举个例子:
    PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
    还有一种写法:
    STMFD SP!,{R0~R3, R12} @R0~R3,R12 入栈
    STMFD SP!,{LR} @LR 入栈 34 LDMFD SP!, {LR} @先恢复 LR
    LDMFD SP!, {R0~R3, R12} @再恢复 R0~R3, R12

     

    跳转指令:
    指令 描述

    B <label>

    跳转到 label,如果跳转范围超过+/-2KB,可以指定 B.W<label>使用 32 位版本的跳转指令, 这样可以得到较大范围的跳转

    BX <Rm>

    间接跳转,跳转到存放于 Rm 中的地址处,并且切换指令集

    BL <label>

    跳转到标号地址,并将返回地址保存在 LR 中。

    BLX <Rm>

    结合 BX 和 BL 的特点,跳转到 Rm 指定的地址,并将返回地址保存在 LR 中,切换指令集。

    举个例子:
    _start: 
    
        ldr sp,=0X80200000 @设置栈指针
        b main @跳转到 main 函数

     

    上面是典型的在汇编中初始化C运行环境,然后跳转到C文件的main函数中运行。(这里不会跳转回来继续运行)
    push {r0, r1} @保存 r0,r1
    cps #0x13 @进入 SVC 模式,允许其他中断再次进去
    
    bl system_irqhandler @加载 C 语言中断处理函数到 r2 寄存器中
    
    cps #0x12 @进入 IRQ 模式
    pop {r0, r1} 
    str r0, [r1, #0X10] @中断执行完成,写 EOIR
    上面用bl就是C语言中的中断处理函数,还要回来继续处理执行下面的程序。
  • 还有算数运算指令和逻辑运算指令,比较简单,用到就可以理解。

总结:看到后面发现自己对汇编这里的知识还有所不熟练,特地重新针对文档看一遍,记录一下基础的知识点

GPIO的8个寄存器介绍:

  1. DR寄存器:是数据寄存器,32位,控制高低电平,当GPIO被配置为输出功能,向指定位写入数据那么相应的IO就会输出相应的高低电平。
  2. GDIR寄存器:设置某个IO的工作方向,是输出还是输入。输入0输出1
  3. PSR状态寄存器:功能和输入状态下的DR寄存器一样
  4. ICR1和ICR2寄存器:中断控制寄存器,ICR1用于配置低16个的GPIO,ICR2用于配置高16个的GPIO,00-低电平触发;01-高电平触发;10-上升沿触发;11-下降沿触发。举个例子:如果要设置GPIO1_IO15为上升沿触发中断,那么GPIO1.ICR1=2<<30
  5. IMR寄存器:用来控制GPIO的中断禁止和使能
  6. SIR寄存器:读取中断是否发生,类似于中断标志位,处理完中断后需要清除中断标志位。
  7. EDGE_SEL寄存器:设置边沿中断,会覆盖ICR1和2的设置。

标签:汇编,R0,R1,GPIO,Linux,指令,寄存器,LED,跳转
From: https://www.cnblogs.com/cjl520/p/16842254.html

相关文章

  • 第一章 Linux 基础
    第一章Linux基础1、Linux目录结构linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“​​/​​”,然后在此目录下再创建其他的目录。深刻理解lin......
  • 关于内联汇编中的分号;
    在内联汇编中常看到分号,尤其在Linux内核源码中,内联汇编中的分号经常出现,例如下面的代码片段.可以看到在vscode中,分号被错误地解析成了纯汇编中的注释符,而实际上分号是两条......
  • 虚拟文件系统 - Linux Kernel Development阅读笔记
    Linux将访问文件系统的接口统一为虚拟文件系统(VFS)接口,消除了文件系统间和硬件存储介质之间的差异。write()->sys_write()->filesystem'swritemethod->physicalme......
  • linux 中实现将fasta文件的碱基数目转换为指定的个数
     001、每行输出为4个碱基[root@pc1test]#lstest.fa[root@pc1test]#cattest.fa>chr1aattcctt>chr2ttggaacc>chr3TTCCGG[root@pc1test]#awk'{if($0~......
  • linux 安装软件学习
    1.适合小白Linux的第三节Linux软件安装适合小白Linux的第三节Linux软件安装_哔哩哔哩_bilibili2.Linux源码安装步骤Linux源码安装步骤-南极山-博客园(cnblogs.com)......
  • 汇编版俄罗斯方块
    得知汇编语言之母KathleenBooth,在加拿大去世,享年100岁。发一篇17年前的汇编语言作品,以表悼念!......
  • Linux Must-Learnt Commands
    Clearsuccessfulloginhistory:echo>/var/log/wtmpViewloginhistory:lastClearcommand'sinputhistory:history-c#temperarllysudoaptinstall-ywipewipe~/.......
  • Linux 测网速
    speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.6版本下均可运行。它基于speedtest.net的基础架构来测量网络的上/下行速率。下载:gitclonehttps:......
  • linux 内核的启动过程
           ......
  • 18.Linux系统总结
    Linux基础操作系统操作系统 OperatingSystem 简称 OS ,是软件的一部分,它是硬件基础上的第一层软件,是硬件和其它软件沟通的桥梁。操作系统会控制其他程序运行,管......