正点原子学习笔记之汇编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,普通开发者。
调试代码一般点灯、串口来调试程序。
相关文章:

正点原子学习笔记之汇编LED驱动实验
1 汇编LED原理分析 为什么要写汇编 需要用汇编初始化一些SOC外设 使用汇编初始化DDR、I.MX6U不需要 设置sp指针,一般指向DDR,设置好C语言运行环境 1.1 LED硬件分析 可以看到LED灯一端接高电平,一端连接了GPIO_3上面…...

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

一些小结汇总
1.常用浏览器及对应内核 Safari浏览器(苹果浏览器):Webkit内核 Google浏览器:Blink内核 Firefox:Gecko内核 Edge浏览器:Chromium内核 IE浏览器:Trident内核 2.10个块标签和10个行标签 …...

20240720 科大讯飞 笔试
文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.122、编程题2.12.22.33、选择题(Linux 选做)3.13.23.34、选择题(C++ 选做)4.14.24.34.44.54.64.75、选择题(数据库选做)5.15.25.3岗位:嵌入式开发工程师 题型: 必做:12 道选择题,3 道编程题 选做:Linux(3…...

【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯CoT思维链概述💯CoT思维链在大型语言模型中的应用💯CoT思维链改变对模型推理能力的理解和改进方式多样化应用场景挑战与未来发展总结 Ὂ…...

一、安装VMWARE和CentOS
一、安装VMware 1、基本说明 学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习 先安装virtual machine 15.5再安装Linux(CentOS 7.6/centos8.1)原理示意图 2、vmware15.5下载 官方地址:https://www.vmware.com/…...

岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类
岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类 岩石分类检测数据集 (Rock Classification and Detection Dataset) 描述: 本数据集旨在支持对不同类型的岩石进行自动分类和检测,特别适用于地质勘探、矿物识别、环境监测等领域。通过使用该数据集训练的模…...

电脑基础知识:mfc110.dll丢失的解决方法
1.mfc110.dll 丢失常见原因 mfc110.dll 文件的丢失或损坏是Windows系统中常见的问题,它可能由多种原因引起,以下是一些主要的因素: 不完全的软件卸载 在卸载程序时,如果相关的 DLL 文件没有被正确移除,可能会导致文件…...

Lua 协同程序(coroutine)
Lua 协同程序(coroutine) 概述 Lua 语言以其轻量级和易于嵌入的特点,在游戏开发、脚本编写等领域广受欢迎。Lua 中的协同程序(coroutine)是其并发编程的核心特性之一。协同程序提供了一种不同于多线程的并发执行方式,它允许多个代码段交替执行,而不是同时执行。这种机制…...

NASA:ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型,以及相关的大气数据
目录 简介 信息 代码 引用 网址推荐 知识星球 机器学习 MISR L2 FIRSTLOOK Aerosol Product subset for the ARCTAS region V001 简介 这是 ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型,以及相关的大气数据,…...

go clean command
文章目录 1.简介2.格式3.选项4.示例5.应用场景6.小结参考文献 1.简介 在 Go 语言的开发过程中,管理依赖和构建缓存是非常重要的。随着项目的迭代,旧的缓存和不再需要的依赖可能会影响构建的效率和准确性。 Go 提供了一个非常实用的命令 go clean&#…...

鸿蒙NEXT开发-动画(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

HTML 入门
1. 什么是 HTML HTML(Hyper Text Markup Language),超文本标记语言 超文本:比文本要强大,通过链接和交互方式来组织和呈现信息的文本形式,不仅有文本,还可能包含图片、音频、或者自己已经审阅…...

前端面试题(十五)
83. ES6 中的 let 和 const let 和 const 的区别是什么? let 和 const 是 ES6 引入的用于声明变量的新方式,相比于传统的 var,它们具有以下特性: 块级作用域:let 和 const 声明的变量在其所在的块级作用域内有效&…...

如何成为 Rust 核心贡献者?Rust 开发的核心是什么?Rust 重要技术专家揭秘
10 月 17 - 18日,由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会,本次活动邀请了 60 多位国际开源专家,汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…...

springboot + nacos + sofarpc 整合后报错403
springboot版本 2.2.2 nacos 版本 1.4.2 rpc-sofa-boot 版本 3.2.0 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent>…...

小米路由器R3Gv2安装openwrt记录
前言 小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致,但bootloader有所不同,因此openwrt的固件不要互刷。另外,R3Gv2和R3G、4A百兆版是不同的设备,切勿混淆。 硬件信息 OpenWrt参数页-Xiaomi MiWiFi 3G v2 CPU:…...

记录一下,android studio 登录不上github的问题
android studio 2023.3.1.18 版本的编译器,出现问题,之前连接过的项目可以正常提交和拉取到github。 但是新建立的项目无法上传到github,提示错误cannot load information for github.com/:request response;access to this site,…...

springcloud之基于github webhook动态刷新服务配置
前言 在实际开发中经常会有一个叫做配置中心的服务,这个服务经过变更参数来动态刷新线上业务数据行为配置。比如;行为开关、活动数据、黑白名单、本地/预发/线上环境切换等等,这些配置信息往往需要在我们不重启系统的时候就可以被更新执行。那…...

qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形
1 首先qt 已经封装了opengl,那么我们就可以直接用了,这里面有三个函数需要继承 virtual void initializeGL() override; virtual void resizeGL(int w,int h) override; virtual void paintGL() override; 这三个函数是实现opengl的重要函数。 2 我们…...

【动态规划】子数组系列(下)
1. 等差数列划分 413. 等差数列划分 状态表示:以 i 位置为结尾时的等差数列的个数 状态转移方程:由于至少需要三个元素才符合题目中等差数列的要求,所以需要判断 i - 2,i - 1,i 三个元素,当这三个元素符合…...

macos mendeley Unable to install the Microsoft Word Plugin 解决
windows也是相似的原理,这里主要说macos, 本质是 找到mendeley的插件启动项,放在word启动目录下, GPT-o1的解决方案: 3. Manual Installation (If Automatic Installation Fails) If the automatic installation doe…...

【Linux进程间通信】Linux信号机制深度解析:保存与处理技巧
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux进程间通信 📒1. 信号的保存🌊在内核中的表示🍂sigs…...

常见开源组件的详解
文章目录 RPCRPC架构和工作流程为什么有了HTTP还要用RPC底层协议数据格式连接管理错误处理 使用场景常见的RPC框架 Web应用框架主要功能常见的Web应用框架Spring Boot (Java)Django (Python)Express.js (Node.js) Redis主要特点应用场景缓存问题Redis集群架构主从复制Redis Clu…...

rust使用教程详解
欢迎来到 Rustlings。该项目包含一些小练习,让您习惯阅读和编写 Rust 代码。这包括阅读和响应编译器消息! 建议在阅读Rust 官方书籍(学习 Rust 最全面的资源)的同时做 Rustlings 练习 📚️ Rust By Example是另一个推…...
并查集的实现(朴素版)
这是C算法基础-数据结构专栏的第二十九篇文章,专栏详情请见此处。 由于作者即将参加CSP,所以到比赛结束前将不再发表文章! 引入 并查集是一种可以快速合并查找集合的一种数据结构,这次我们将通过三道题来详细讲解并查集ÿ…...

WPF 为button动态设置不同的模板
有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容,比如Button未点击安装显示: 安装后显示: 可以通过设置button的content,通过content来设置不同的模板来实现功能,以下是代码: MainWi…...

【C++贪心 DFS】2673. 使二叉树所有路径值相等的最小代价|1917
本文涉及知识点 C贪心 反证法 决策包容性 CDFS LeetCode2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子…...

虚幻引擎GAS入门学习笔记(一)
虚幻引擎GAS入门(一) Gameplay Ability System(GAS) 是一个模块化且强大的框架,用于管理虚幻引擎中的游戏玩法逻辑。它的核心组成部分包括 Gameplay Ability(定义和执行能力)、Gameplay Effect(应用和管理…...

Excel:vba实现合并工作表(表头相同)
这个代码应该也适用于一些表头相同的工作表的汇总,只需要修改想要遍历的表,适用于处理大量表头相同的表的合并 这里的汇总合并表 total 是我事先创建的,我觉得比用vba代码创建要容易一下,如果不事先创建汇总表就用下面的代码&…...