正点原子学习笔记之汇编LED驱动实验

1 汇编LED原理分析

  为什么要写汇编
    需要用汇编初始化一些SOC外设
    使用汇编初始化DDR、I.MX6U不需要
    设置sp指针,一般指向DDR,设置好C语言运行环境

1.1 LED硬件分析

在这里插入图片描述
  可以看到LED灯一端接高电平,一端连接了GPIO_3上面,GPIO_3如果为低电平,LED灯亮,为高则LED灯灭。
  STM32的IO初始化流程
    使能GPIO时钟
    设置IO复用,将其复用为GPIO
    配置GPIO的电气属性
    使用GPIO,输出高低电平

  I.MX6U的IO初始化
    使能时钟CCGR0~CCGR6这七个寄存器控制着所有外设时钟,为了简单设置所有的寄存器全部为1,相当于使能所有外设时钟
    设置IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3~0设置为0101,即复用为GPIO模式
    将寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。
    配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3,设置为输出模式。

2 编写驱动

2.1 手册解读

2.2 驱动代码

.global _start @全局标号_start:/*使能所有外设时钟 */ldr r0, =0x020c4068 @CCGR0ldr r1, =0xffffffff @要向CCGR0写入的数据str r1, [r0]        @将0xffffffff写入CCGR0中ldr r0, =0x020c406c @CCGR1str r1, [r0]        @将0xffffffff写入CCGR1中 ldr r0, =0x020c4070 @CCGR2str r1, [r0]        @将0xffffffff写入CCGR2中 ldr r0, =0x020c4074 @CCGR3str r1, [r0]        @将0xffffffff写入CCGR3中 ldr r0, =0x020c4078 @CCGR4str r1, [r0]        @将0xffffffff写入CCGR4中 ldr r0, =0x020c407c @CCGR5str r1, [r0]        @将0xffffffff写入CCGR5中 ldr r0, =0x020c4080 @CCGR6str r1, [r0]        @将0xffffffff写入CCGR6中 ldr r0, =0x020c4084 @CCGR7str r1, [r0]        @将0xffffffff写入CCGR7中 /*配置GPIO1_IO03 PIN的复用为GPIO,也就是设置*IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=5*IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的寄存器地址为0x020E0068*/ldr r0, =0x020E0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03ldr r1, =0x5        @写入的数据str r1, [r0]        @写入 /*配置GPIO1_IO03的电气属性 也就是寄存器*IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03*IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的寄存器地址为0x020e02f4**bit0:         0低速率*bit[5:3]:     110 R0/6驱动能力*bit[7:6]:     10  100MHz速度*bit11   :     0   关闭开路输出*bit12   :     1   使能pull/kepper*bit13   :    0   kepper*bit15:14:     00  默认100K下拉   *bit16   :     0   关闭hys  */    ldr r0, =0x020e02f4 @IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03ldr r1, =0x10b0     @写入的数据str r1, [r0]        @写入   /*设置GPIO功能*设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出*GPIO1_GDIR寄存器地址为0x0209c004,设置GPIO1_GDIR寄存器bit3为1,*也就是设置GPIO1_IO03为输出*/   ldr r0, =0x0209c004ldr r1, =0x8str r1, [r0]/*打开LED 也就是设置GPIO1_IO03为0 *GPIO1_DR寄存器地址为0x0209c000  */ldr r0, =0x0209c000ldr r1, =0str r1, [r0]loop:b loop

2.3 编译程序

  将.c .s文件变为 .o

arm-linux-gnueabihf-gcc -c leds.s -o led.o

  arm-linux-gnueabihf-ld连接文件,用来将 众多的.o文件连接到一个指定的链接位置,就是将所有.o文件链接在一起,并且链接到指定地方。所以就要指定一个起始地址,本实验指定的链接起始地址就是代码开始运行的地址。对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为外部RAM和内部RAM,外部RAM也就是DDR,内部RAM地址范围是0x900000~0x91FFFF,也可以放在外部DDR中,对于I.MX6U-ALPHA开发板,512MB字节DDR版本的核心板,DDR范围就是0x80000000到0xA0000000
  本系列视频,裸机代码的链接起始地址为0x87800000,因为后面uboot的链接起始地址也是0x87800000。要使用DDR,那么 必须要初始化DDR,这个头部信息包含了DDR的初始化参数,I.MX系列SOC内部boot rom会从SD卡、EMMC等外置存储中读取头部,然后初始化DDR,并且将bin文件拷贝到指定地方。
  Bin的运行地址一定要和链接地址一致。位置无关代码除外。

2.4 烧写bin文件

  STM32烧写到内部FLAHS
  6ULL支持SD卡、EMMC、NAND、nor、SPI flash等启动,裸机例程选择烧写到SD卡里面。
  在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡的指定绝对地址上,。而且对于I.MX而言,不能直接烧写bin文件,必须先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。
  6ULL支持JTAG,因为没有烧写算法,所以无法烧写
  但是可以通过JTAG将bin文件下载到内部ram
  6ULL的JTAG口竟然和SAI复用,SAI连接了WM8960音频DAC,为啥不用跳线帽,不懂
  在嵌入式Linux开发中基本不使用JLINK,普通开发者。
  调试代码一般点灯、串口来调试程序。

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

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

相关文章

C# WinForm实现画笔签名及解决MemoryBmp格式问题

目录 需求 实现效果 开发运行环境 设计实现 界面布局 初始化 画笔绘图 清空画布 导出位图数据 小结 需求 我的文章 《C# 结合JavaScript实现手写板签名并上传到服务器》主要介绍了 web 版的需求实现,本文应项目需求介绍如何通过 C# WinForm 通过画布画笔…

Appium环境搭建、Appium连接真机

文章目录 一、安装Android SDK二、安装Appium-desktop三、安装Appium Inspector 一、安装Android SDK 首先需要安装jdk,这里就不演示安装jdk的过程了 SDK下载地址:Android SDK 下载 1、点击 Android SDK 下载 -> SKD Tools 2、选择对应的版本进行下…

SpringBoot基础(五):集成JUnit5

SpringBoot基础系列文章 SpringBoot基础(一):快速入门 SpringBoot基础(二):配置文件详解 SpringBoot基础(三):Logback日志 SpringBoot基础(四):bean的多种加载方式 SpringBoot基础(五):集成JUnit5 目录 一、JUnit…

前端开发设计模式——组合模式

目录 一、组合模式的定义和特点 1.定义 2.特点: 二、组合模式的实现方式 1.定义抽象组件类 2.创建叶节点类 3.创建组合类: 三、组合模式的应用场景 1.界面布局管理 2.菜单系统构建 3.组件库开发 四、组合模式的优点 1.简化客户端代码 2.增…

GO网络编程(七):海量用户通信系统5:分层架构

P323开始(尚硅谷GO教程)老韩又改目录结构了,没办法,和之前一样,先说下目录结构,再给代码,部分代码在之前讲过,还有知识的话由于本人近期很忙,所以这些就不多赘述了&#…

【C++】12.string类的使用

文章目录 1. 为什么学习string类?1.1 C语言中的字符串1.2 两个面试题(暂不做讲解) 2. 标准库中的string类2.1 string类(了解)2.2 auto和范围for 3. 查看技术文档4. string的访问5. 如何读取每个字符呢?6. auto语法糖(C11)7. 范围f…

浅析主流监控告警系统基本架构和原理

浅析主流监控告警系统基本架构和原理 一,监控系统的作用和目前主流监控系统 1,作用:监控系统一般有以下这几个作用 实时采集监控数据:包括硬件、操作系统、中间件、应用程序等各个维度的数据。实时反馈监控状态:通过…

【目标检测】集装箱缺陷检测数据集1476张5类缺陷VOC+YOLO格式

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1476 标注数量(xml文件个数):1476 标注数量(txt文件个数):1476 标注…

ubuntu下打开摄像头

ubuntu下打开摄像头 在Ubuntu下,你可以使用cheese,这是一个开源的摄像头应用程序。如果你还没有安装它,可以通过以下命令安装: sudo apt-get updatesudo apt-get install cheese 安装完成后,你可以通过命令行启动它: cheese 或者,你也可以使用ffmpeg来打开摄像头并进…

MATLAB - 机器人机械臂设计轨迹规划器

系列文章目录 前言 本示例介绍了一种设计抓取和轨迹规划器的方法,该规划器可用于垃圾箱拣选系统。 在机器人技术中,垃圾箱拣选包括使用机械手从垃圾箱中取出物品。智能垃圾箱拣选是这一过程的高级版本,具有更强的自主性。使用摄像系统感知部件,规划器生成与场景相适应的无碰…

Telegram——Bot 机器人/小程序入门指南

一、Bot 介绍 在 TG 中,机器人可以用于接收和发送消息、管理群组(在有权限的情况下可以封禁用户、删除消息、置顶消息等)、通过API进行编程操作、使用 Inline 查询功能在不同的聊天室中提供查询服务、创建自定义键盘按钮、发出账单并收款、接入小程序游戏等。 然而,Bot 默…

智汇云舟亮相WAFI世界农业科技创新大会,并参编数字农业产业图谱

10月10日,2024WAFI世界农业科技创新大会农食行业创新与投资峰会在北京金海湖国际会展中心举行。中国农业大学MBA教育中心主任、教授付文阁、平谷区委常委、统战部部长刘堃、华为公共事业军团数字政府首席专家刘丹、荷兰瓦赫宁根大学前校长Aalt Dijkhuizen、牧原食品…

免费送源码:Java+Springboot+MySQL 水环境检测系统的设计与实现 计算机毕业设计原创定制

摘 要 在我国,水源的污染是不可忽视的问题。对于水质监测进行数据的采集工作,目前主要通过人工实现。因此,部分地区的采集工作,实施起来难度很大,比如恶劣环境和偏僻山区等地。所以,目前对于水质监测的研究,主导方向是建立更加高效完善,智能化的水质监测系统。近几年,无线传感器…

RWKV-CHN模型部署教程

一、模型介绍 RWKV 语言模型(用纯 100%RNN 达到 GPT 能力,甚至更强),该项目旨在通过为您自动化所有事情来消除使用大型语言模型的障碍。您需要的是一个只有几兆字节的轻量级可执行程序。此外,该项目还提供了一个接口兼…

计算机网络——p2p

流媒体是指在网络上以流式传输技术实时播放的多媒体内容,如音频、视频等。以下是关于流媒体的详细介绍: 一、工作原理 数据分割与传输: 流媒体技术将多媒体文件分割成较小的数据包。这些数据包按照特定的顺序进行编号,然后通过网络…

[单master节点k8s部署]40.安装harbor

harbor 是私有镜像仓库,用来存储和分发镜像的 。docker 还有一个官方的镜像仓库 docker hub,免费用户只能简单的使用,创建一个私有镜像仓库,存储镜像,付费用户才可以拥有更多权限,默认 docker pull 拉取镜像…

网络学习第二篇

认识网关和路由器 这里大家先了解一下什么三层设备。 三层设备 三层设备是指在网络架构中能够工作在第三层(网络层)的设备,通常包括三层交换机和路由器。这些设备可以根据IP地址进行数据包的转发和路由选择,从而在不同的网络之间…

<<迷雾>> 第11章 全自动加法计算机(5)--顺序取数 示例电路

顺序地从存储器里取数的电路方案. info::操作说明 在开始之前, 地址计数器 AC 需要清零, 以指向地址 0000. 按一下开关 KAR, 将 AC 当前的地址锁存到 AR 地址寄存器. 按住 KRD, 不要松开(注: 系统中使用的是普通开关, 无需按住), 再按一下 KDR, 数据保存到寄存器 DR 中, 最后,…

Unity3D 观察者模式

Unity3D 泛型事件系统 观察者模式 观察者模式是一种行为设计模式,通过订阅机制,可以让对象触发事件时,通知多个其他对象。 在游戏逻辑中,UI 界面通常会监听一些事件,当数据层发生变化时,通过触发事件&am…

多人播客的生成#使用OpenAI Swarm框架

使用Swarm来写多智能体的代码,非常简洁高效。 什么是Swarm? Swarm是由OpenAI开发的一个实验性多代理系统框架,旨在探索多代理系统的高效接口。该框架注重轻量级、可控性高且易于测试,主要用于展示代理之间的交接与例行操作模式。S…