01. 汇编LED驱动实验

01. 汇编LED驱动实验

  • 汇编原理分析
    • 为什么要学习Cortex—A汇编
    • STM32IO初始化流程
    • IMX6UL初始化流程
  • 汇编基础
    • 处理器内部数据传输指令
    • 存储器访问指令
  • 编写驱动
  • 编译程序
  • 烧写bin文件

汇编原理分析

为什么要学习Cortex—A汇编

  1. 需要用汇编初始化一些SOC外设
  2. 使用汇编初始化DDR,I.MX6U不需要
  3. 设置SP指针,一般指向DDR,设置好C语言运行环境

ALPHA开发板LED原理图

而LED0是接在GPIO1_3,下面一个LED灯是电源指示灯
在这里插入图片描述

STM32IO初始化流程

  1. 使能GPIO时钟
  2. 设置IO复用,将其复用为GPIO
  3. 配置GPIO电气属性
  4. 使用GPIO输出高低电平

IMX6UL初始化流程

  1. 使能时钟,CCGR0-CCGR6这七个寄存器控制着6ULL所有外设时钟的使能。为了简单,将这七个寄存器全部设置为0xffffffff,相当于使能所有外设时钟
  2. IO复用,寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03。这个寄存器的0-3位是复用位,将这4位设置为0101,这样就是复用为GPIO
    在这里插入图片描述
  3. 配置电气属性,寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置电气属性,包括压摆率、速度、驱动能力、开漏、上下拉等。
    在这里插入图片描述
    在这里插入图片描述
  4. 配置GPIO功能,设置输入输出。设置GPIO1_GDIR寄存器,设置GPIO1_IO03为输出,也就是为1;设置GPIO1_DR数据寄存器的bit3,为1表示输出高电平。

汇编基础

处理器内部数据传输指令

  1. mov指令
    用于将数据从一个寄存器拷贝到另一个寄存器,或者将一个立即数传递到寄存器里面
mov R0, R1 @将寄存器R1中的数据传递给R0
mov R0, #0x12 @将立即数0x12传递给R0寄存器
  1. mrs指令
    用于将特殊寄存器(如CPSR和SPSR)中的数据传递给通用寄存器
mrs R0, CPSR
  1. msr指令
    将普通寄存器的数据传递给特殊寄存器
msr CPSR, R0

存储器访问指令

ARM不能直接访问存储器,比如RAM中的数据。I.MX6UL中的寄存器就是RAM类型的,我们用汇编来配置时许哟啊借助寄存器访问指令,一般先要将要配置的值写入到Rx(x=0~12)寄存器中,然后借助存储器访问指令将Rx中的数据写入到I.MX6UL寄存器中,读取也是一样的。
在这里插入图片描述

  1. LDR指令
    用于从存储器加载数据到寄存器Rx中,也可以将一个立即数加载到寄存器中,加载立即数时需要用=,而不是#。
    在这里插入图片描述
    上述代码的offset是0
  2. STR指令
    将数据写入到存储器中
    在这里插入图片描述

编写驱动

.global _start @全局标号,_start是程序的入口_start:/* 使能所有外设时钟 */ldr r0, =0x020c4068 @CCGR0的地址ldr r1, =0xffffffff @要向CCGR0写入的数据str r1, [r0]		@将r1写入到r0中ldr r0, =0x020c406cstr r1, [r0]ldr r0, =0x020c4070str r1, [r0]ldr r0, =0x020c4074str r1, [r0]ldr r0, =0x020c4078str r1, [r0]ldr r0, =0x020c407cstr r1, [r0]ldr r0, =0x020c4080str r1, [r0]ldr r0, =0x020c4084str r1, [r0]/* 配置GPIO1_IO03的复用为GPIO,也就是设置为5 */ldr r0, =0x020e0068 @地址ldr r1, =0x05str r1, [r0] /* 配置GPIO1_IO03的电器属性,地址是0x020e02f4*bit0:    0低速率*bit5:3:  110 R0/6驱动能力*bit7:6:  10 100MHz速度*bit11:   0关闭开路输出*bit12:   1 使能pull/kepper*bit13:   0 kepper*bit15:14: 00 100k下拉*bit16:   0 关闭hys*/ldr r0, =0x020e02f4 @地址ldr r1, =0x10b0str r1, [r0] /* 设置GPIO1_GDIR寄存器,设置GPIO_GPIO03为输出 */ldr r0, =0x0209c004ldr r1, =0x08str r1, [r0] /* 打开LED,也就是设置GPIO_IO03为低电平*GPIO_DR的地址为0x0209c000*/ldr r0, =0x0209c000ldr r1, =0x00str r1, [r0]loop:b loop @死循环,防止程序结束

编译程序

  1. 使用arm-linux-gnueabihf-gcc -g -c led.s led.o将.c 和.s 文件变为.o
  2. 使用arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf将.o文件链接为elf格式的可执行文件,链接时需要指定链接的起始地址。对于6ULL,链接其实地址应该指向RAM地址,而不是存在内部flash。RAM分为内部0x900000~0x91ffff,也可以是外部DDR,对于ALPHA,选择0x87800000。要使用DDR,必须要初始化DDR。对于IMX,bin文件不能直接烧写到SD卡、EMMC、NAND等外置存储中,然后从这些外置存储中启动运行,需要添加一个头部,这个头部包含了DDR的初始化参数
  3. 使用arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin将elf文件转为bin文件
  4. 使用arm-linux-gnueabihf-objdump -D led.elf > led.dis将elf文件转为汇编、反汇编文件

可以直接编写makefile文件,直接通过make指令编译,这里就不详细说明makefile文件的使用

led.bin:led.sarm-linux-gnueabihf-gcc -g -c led.s -o led.oarm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:rm -rf *.o led.bin led.elf led.dis

烧写bin文件

烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡的绝对路径下。而且对于IMX,不能直接烧写bin问价,需要使用imxdownload软件。使用方法:确定要烧写的SD卡文件,给予imxdownload可执行权限chmod 777 imxdownload。然后就./imxdownload led.bin /dev/sdf。会向led.bin添加一个头部,并且生成一个新的imx文件,将新的文件烧写到SD卡中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139130.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【mfc/VS2022】计图实验:绘图工具设计知识笔记2

按钮添加处理程序 1.类视图找到对应类右击,类向导 2. 找到对应的的按钮id 如何将画出的两个相交的圆都显示出来,而不是重叠(如下图)隐藏了一条圆弧 问题如图: 因为矩形和圆心其实是个背景色的封闭图形,所…

如何修复-谷歌浏览器-打开任何一个网页都显示崩溃

早上上班,一如既往的使用谷歌浏览器时,发现异常。 首先是,右下角有个弹窗提示某某插件需要点击更新,然后点了也没用,然后就是打开任何网页都提示‘喔唷 崩溃了’的字眼。 奇怪呀,咱也是第一次碰见这种问题…

树叶识别系统python+Django网页界面+TensorFlow+算法模型+数据集+图像识别分类

一、介绍 树叶识别系统。使用Python作为主要编程语言开发,通过收集常见的6中树叶(‘广玉兰’, ‘杜鹃’, ‘梧桐’, ‘樟叶’, ‘芭蕉’, ‘银杏’)图片作为数据集,然后使用TensorFlow搭建ResNet50算法网络模型,通过对…

中小企业实现项目管理数字化的关键步骤

在当今竞争激烈的商业环境中,中小企业及初创团队面临着多重项目管理挑战,传统的手动管理方式已经无法满足高效率、高质量的项目执行需求。 那么中小型及成长性企业在项目管理方面,往往会遇到哪些困境呢? 首先,资源浪…

GitHub仓库的README文件无法显示图片问题-非域名污染原因

之前上自己仓库就偶然发现图片不显示现象,当时以为是网络问题就没有留意这事。但是一直不显示就有问题了!于是网上搜了一遭,看见大家遇到此现象的原因普遍归于DNS污染1而我的问题原来是MarkDown格式! 在图片语法前不要加分区语法…

【数据结构】栈(C语言实现)

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 栈 1.栈1.1栈的概念及结构…

python每日一练(9)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

SpringBoot实现SSMP整合

一、整合JUnit 1、Spring 整合 JUnit 核心注解有两个: RunWith(SpringJUnit4ClassRunner.class) 是设置Spring专用于测试的类运行器(Spring程序执行程序有自己的一套独立的运行程序的方式,不能使用JUnit提供的类运行方式)Conte…

CICD:Circle CI 实现CICD

持续集成解决什么问题 提高软件质量效率迭代便捷部署快速交付、便于管理 持续集成(CI) 集成,就是一些孤立的事物或元素通过某种方式集中在一起,产生联系,从而构建一个有机整体的过程。 持续,就是指长期…

【k8s总结】

资源下载:http://www.ziyuanwang.online/912.html Kubernetes(K8s) 一、Openstack&VM 1、认识虚拟化 1.1、什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的…

网工记背配置基本命令(5)----SNMP配置

目录 1.配置设备使用SNMPv1与网管通信 2.配置设备SNMPv2与网管通信 3.配置设备使用SNMPv3与网管通信 1.在大型网络中,设备发生故障时,由于设备无法主动上报故障,导致网络管理员无法及时感知、及 时定位和排除故障,从而导致网络…

centos离线安装telnet、traceroute工具

安装包下载地址 安装包下载地址在这里 直接输入包名,筛选系统,根据自己系统版本确定该下哪个包 centos离线安装telnet 准备三个安装包 xinetd-2.3.15-14.el7.x86_64.rpmtelnet-server-0.17-65.el7_8.x86_64.rpmtelnet-0.17-65.el7_8.x86_64.rpm 三个…