linux驱动学习(二)之点灯

 需要板子一起学习的可以这里购买(含资料):点击跳转

  • 如何实现对硬件控制

分析硬件原理图(开发板的原理图)----> 分析硬件的控制方法 ---> 控制硬件时,所要用到的寄存器 ----> 了解控制硬件寄存器的流程 ----> 实现对硬件的控制和访问

  • 分析原理图以及控制的方法

(本文以GPIO13为例来控制灯的亮灭)

  • 控制硬件时,所对应的寄存器

要控制GPIO口所要用到的主要寄存器:X是一个未知数:A B C D E 比如:GPIOEOUT

1、GPIOXALTFN0和 GPIOXALTFN1 --- 配置引脚的功能

GPIOXALTFN0(32位) ---- 控制GPIO的0-15脚

GPIOXALTFN1(32位) ---- 控制GPIO的16-31脚

ALT FunctionX 具体意义

比如:GPIOE13 ---- > GPIO使用

GPIOEALTFN0_13 -----[27:26] ----> 00

2、GPIOXOUTENB ------>设置GPIO的模式:输入或者输出模式

3、GPIOXOUT---> 设置GPIO为值:低电平(0)或者高电平(1)

4、GPIOXPAD ---->读取寄存器上值

编写代码如下:

/*
裸机程序特点:
1)直接下载的内存,运行,不运行在操作系统上,不在使用标准库,无main
2)裸机入口函数:
	void _start(void)
	{
		
	}
	必须是源文件中的第一个函数,在该函数之前不能有其他函数的定义
*/

//以GPIOE13为例: GPIOEOUT,GPIOEOUTENB,GPIOEALTFN0
#define GPIOEOUT *((volatile unsigned int*)0xC001E000)
#define GPIOEOUTENB *((volatile unsigned int*)0xC001E004)
#define GPIOEALTFN0 *((volatile unsigned int*)0xC001E020)
void delay(int delay);

void _start(void)
{
	//GPIOE13
	//[1] 配置GPIO的功能----用来做GPIO使用  GPIOEALTFN0[27:26] ---> 00  --->清零
	GPIOEALTFN0 &= (~(3<<26));
	//[2] 配置GPIO的模式 ---- 输出模式 GPIOEOUTENB[13] ---->1 --->置"1"
	GPIOEOUTENB |= (1<<13);
	//[3] 给寄存器的某一位赋值为0或者1 ---GPIOEOUT
	while(1)
	{
		//低电平  GPIOEOUT[13] --->0
		GPIOEOUT &= (~(1<<13));
		//睡眠1s
		delay(0x4000000); //1s
		//高电平  GPIOEOUT[13] --->1
		GPIOEOUT |= (1<<13);
		//睡眠1s
		delay(0x4000000); //1s
	}
}

void delay(int delay)
{
	volatile int i = delay;
	
	while(i--);
}

1、对于一个int变量a,将第20位清零,其他位保持不变:

a &= ~(1<<20);

2、对于一个int变量a,将第10位置1,其他位保持不变

 a |= (1<<10);

3、对于一个int变量a,将第30位取反,其他位保持不变:

a ^= (1<<30);

4、对于一个int变量a,判断其第15位是否为1

if(a & (1<<15))
    printf("a的第15位为1");
else
    printf("a的第15位为0");

5、对于一个地址0xc0000000,如何读写该地址的内容

*((unsinged int*)0xc0000000) = 0x123456; ---->写内存
int i = *((unsinged int*)0xc0000000);----> 读内存
printf(“%d\n”,*((unsinged int*)0xc0000000) );
  • 下载及调试程序并运行

1、配置网络环境

X6818# printenv

gatewayip=192.168.27.1

ipaddr=192.168.27.3

netmask=255.255.255.0

qtcrc=1446511370

serverip=192.168.27.2

修改开发板网络配置:

X6818# setenv gatewayip 192.168.13.1

X6818# setenv ipaddr 192.168.13.3

X6818# setenv serverip 192.168.13.2

X6818# save/saveenv   

Saving Environment to MMC...

Writing to MMC(2)... done

开发板ping pc机

X6818# ping 192.168.13.2

dwmac.c0060000 Waiting for PHY auto negotiation to complete...... done

dwmac.c0060000: No link.

ping failed; host 192.168.13.2 is not alive

X6818# ping 192.168.13.2

Speed: 1000, full duplex

Using dwmac.c0060000 device

host 192.168.13.2 is alive -------> ok

2、下载程序

X6818# tftp 0x40000000 led.bin --->下载led.bin到内存上,0x40000000为内存的起始地址

Speed: 1000, full duplex

Using dwmac.c0060000 device

TFTP from server 192.168.13.2; our IP address is 192.168.13.3

Filename 'led.bin'.

Load address: 0x40000000

Loading: #

         16.6 KiB/s

done

Bytes transferred = 156 (9c hex)

3、运行程序 --- go

X6818# go 0x40000000 ---> 跳到指定的内存地址上执行程序

## Starting application at 0x40000000 ...

注意:

  1. 在u-boot上运行裸机程序,用go
  2. 裸机程序一旦执行,不能通过ctrl+c来终止程序
  3. 由于执行程序是下载到内存上,所以,重启开发板,则程序丢失

觉得有帮助的话,打赏一下呗。。

           

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于如何在Arch Linux上编写自己的第一个module

前一段时间一直想深入学习编写一个module插入到自己的内核当中&#xff0c;但是网上的资料基本上全都针对的Ubuntu和Debian等流行的Linux发行版&#xff0c;这里打算简单的记录一波博客。 啥是Module?(着急可不看) 众所周知&#xff1a;现代宏内核架构的操作系统都会借鉴微内核…

【stableDiffusion】HuggingFace模型下载(只要知道url,就直接开始下载)

一、方法 有人说&#xff0c;那我怎么知道 huggingface 上面我想要的资源的url&#xff0c;去哪儿找啊&#xff1f; 那就涉及到一些魔法手段了&#xff0c;或者你能在其他人的博客或者百度上搜索到合适的url。 我这个办法是用来节约我的魔法的流量的。 1.迅雷 1.1 打开迅雷&…

【Kotlin】简单介绍与使用kotlin

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Kotlin ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 特点 变量和常量 数据类型和类型推断 函数 字符串模板 条件表达式 空安全 when 表达式 循环 我的其他博客 前言 Kotlin是…

PostgreSQL基础(六):PostgreSQL基本操作(二)

文章目录 PostgreSQL基本操作(二) 一、字符串类型 二、日期类型 三、

比较与深浅克隆

1.比较 &#xff08;1&#xff09;Comparable接口&#xff1a;&#xff08;重写compareTo方法&#xff09; 由于它是一个接口&#xff0c;而且在这个接口中只有一个compareTo方法&#xff0c;所以所有实现该接口的类都需要重写。这个compareTo方法相当于制定一个比较标准&…

Raid的全局热备和独立热备

目录 Hot Spare背景: 1.定义与功能 2.数据存储与容量 3.配置模式 4.数量限制&#xff1a; 5.数据重建: 6.管理与维护 实操全局热备和独立热备&#xff1a; 配置全局热备: 配置独立热备: Hot Spare背景: 在RAID配置中&#xff0c;Hot Spare(热备)是一个非常重要的概念…

【数据结构与算法 | 二叉树篇】二叉树的前中后序遍历(递归版本)

1. 二叉树的概念 (1). 二叉树的结构 借用了一下力扣的模板 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.righ…

【C++】list的使用(上)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f308;关于list&#x1f525;默认成员函数构造函数&#xff08;constructor&#xff09;析构函数&#xff08;destructor&#xff09;赋值运算符重载 &#x1…

第十六课,海龟画图:设置画笔颜色、宽度函数,移动画笔函数

一&#xff0c;turtle.color()&#xff1a;画笔颜色函数 这个函数能设置画笔画出来的颜色&#xff0c;当然&#xff0c;使用它之前你需要认识有哪些“颜料”可供你选择&#xff0c;turtle库的color()函数可以选择以下颜色&#xff1a; "white" 白色&#xff08;建议…

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

Linux系统编程(七)网络编程TCP、UDP

本文目录 一、基础知识点1. IP地址2. 端口3. 域名4. 网络协议类型5. IP协议类型6. 字节序7. socket套接字 二、常用API1. socket套接字描述符2. bind套接字绑定3. listen设置客户端连接个数4. accept接收客户端请求5. connect连接服务端 三、编程流程1.TCP编程 在学习本章之前&…

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…

[AI Google] Google I/O 2024: 为新一代设计的 I/O

编辑注&#xff1a;以下是 Sundar Pichai 在 I/O 2024 上讲话的编辑版&#xff0c;并包含了更多在舞台上宣布的内容。查看我们收藏中的所有公告。 Google 完全进入了我们的 Gemini 时代。 在开始之前&#xff0c;我想反思一下我们所处的这一刻。我们已经在 AI 上投资了十多年…

【LeetCode 101】对称二叉树

1. 题目 2. 分析 这道题比较经典。我又一次做错了&#xff0c;这次是花了20min都没有做出来。 最开始我的思想就是&#xff0c;递归比较左根节点的左子树和右根节点的右子树是否对称即可&#xff0c;然后觉得能解决问题了&#xff0c;便动手coding。哪知道&#xff0c;又碰到了…

23.Labview中的数值类型讨论 ---- 位(bit)、字节(byte)、I8、U8、单双精度、复数

hello&#xff0c;大家好&#xff0c;本篇向大家介绍一个最常用但最容易让人忽略和最容易犯错的知识&#xff1a;数值。 “数值” 这个概念在Labview中被涉及的还是很多的&#xff0c;几乎任何一个程序都无可避免的会用到&#xff0c;但我相信大家绝大多数人对数值这个概念应用…

CentOS8安装opensips 3.5

环境&#xff1a;阿里云 操作系统CentOS8.5 依赖包安装&#xff1a; libmicrohttpd cd /usr/local/src wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-latest.tar.gz tar vzxf libmicrohttpd-latest.tar.gz cd libmicrohttpd-1.0.1/./configure make make …

【CVPR_2024】:逐元素乘积为什么会产生如此令人满意的结果?

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言论文重写星形运算一层网络推广多层网络特殊情况 W 1 W_1 W1​和/或 W 2 W_2 W2​…

Python-3.12.0文档解读-内置函数sorted()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 Python-3.12.0文档解读详细说明 功能描述 参数说明 用法示例 备注 进阶用法 参考…

集合操作进阶:关于移除列表元素的那点事

介绍 日常开发中&#xff0c;难免会对集合中的元素进行移除操作&#xff0c;如果对这方面不熟悉的话&#xff0c;就可能遇到 ConcurrentModificationException&#xff0c;那么&#xff0c;如何优雅地进行元素删除&#xff1f;以及其它方式为什么不行&#xff1f; 数据初始化…

力扣--双指针15.三数之和

详细思路 排序数组&#xff1a;首先对数组 nums 进行排序&#xff0c;目的是为了方便后续使用双指针查找和避免重复结果。遍历数组&#xff1a;使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素&#xff1a;如果当前元素 nums[i] 与前一个元素…