Linux 学习记录55(ARM篇)

Linux 学习记录55(ARM篇)

在这里插入图片描述

本文目录

  • Linux 学习记录55(ARM篇)
  • 一、使用C语言封装GPIO函数
    • 1. 封装GPIO组寄存器
    • 2. 封装GPIO模式以及相关配置
    • 3. 封装GPIO初始化结构体
    • 4. 使用自己的封装配置GPIO

一、使用C语言封装GPIO函数

1. 封装GPIO组寄存器

#define GPIOA               ((GPIO_TypeDef *) 0x50002000)
#define GPIOB               ((GPIO_TypeDef *) 0x50003000)
#define GPIOC               ((GPIO_TypeDef *) 0x50004000)
#define GPIOD               ((GPIO_TypeDef *) 0x50005000)
#define GPIOE               ((GPIO_TypeDef *) 0x50006000)
#define GPIOF               ((GPIO_TypeDef *) 0x50007000)
#define GPIOG               ((GPIO_TypeDef *) 0x50008000)
#define GPIOH               ((GPIO_TypeDef *) 0x50009000)
#define GPIOI               ((GPIO_TypeDef *) 0x5000A000)
#define GPIOJ               ((GPIO_TypeDef *) 0x5000B000)
#define GPIOK               ((GPIO_TypeDef *) 0x5000C000)

2. 封装GPIO模式以及相关配置

使用枚举封装

/*GPIO模式*/
typedef enum
{GPIO_Mode_IN = 0,	//输入GPIO_Mode_OUT,		//输出GPIO_Mode_AF,		//复用GPIO_Mode_AN		//模拟
}GPIOMode_TypeDef;/*GPIO引脚速度*/typedef enum
{GPIO_Low_Speed = 0,	//低速GPIO_Medium_Speed,	//中速GPIO_Fast_Speed,	//快速GPIO_High_Speed		//高速
}GPIOSpeed_TypeDef;/*GPIO输出模式*/typedef enum
{GPIO_OType_PP = 0,	//推挽GPIO_OType_OD,		//开漏
}GPIOOType_TypeDef;/*GPIO上下拉设置*/
typedef enum{GPIO_PuPd_NOPULL = 0,	//推挽GPIO_PuPd_UP,			//上拉GPIO_PuPd_DOWN,			//下拉
}GPIOPuPd_TypeDef;

3. 封装GPIO初始化结构体

typedef struct
{unsigned int MODER;   unsigned int OTYPER; unsigned int OSPEEDR; unsigned int PUPDR; unsigned int IDR; unsigned int ODR;   
}GPIO_TypeDef;typedef struct
{unsigned int GPIO_Pin;		// Pin脚GPIOMode_TypeDef GPIO_Mode;	//模式GPIOSpeed_TypeDef GPIO_Speed;	//速度GPIOOType_TypeDef GPIO_OType;	//输出模式GPIOPuPd_TypeDef GPIO_PuPd;	//上下拉
}GPIO_InitTypeDef;

4. 使用自己的封装配置GPIO

void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_init)
{/*初始化GPIOE模式*/GPIOx->MODER &= ~(0x3 << (GPIO_init->GPIO_Pin*2));GPIOx->MODER |= GPIO_init->GPIO_Mode << (GPIO_init->GPIO_Pin*2);/*初始化GPIOE输出模式*/GPIOx->OTYPER &= ~(GPIO_init->GPIO_OType << GPIO_init->GPIO_Pin);/*初始化GPIOE速度*/GPIOx->OSPEEDR &= ~(0x3 << (GPIO_init->GPIO_Pin*2));GPIOx->OSPEEDR |= GPIO_init->GPIO_Speed << (GPIO_init->GPIO_Pin*2);/*初始化GPIOE上下拉设置*/GPIOx->PUPDR &= ~(0x3 << (GPIO_init->GPIO_Pin*2));GPIOx->PUPDR |= GPIO_init->GPIO_PuPd << (GPIO_init->GPIO_Pin*2);
}/*LED控制*/
#define ledE_on(x) GPIOE->ODR |= 0x1 << x
#define ledE_off(x) GPIOE->ODR &= ~(0x1 << x)
#define ledF_on(x) GPIOF->ODR |= 0x1 << x
#define ledF_off(x) GPIOF->ODR &= ~(0x1 << x)void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);
}int main()
{RCC_MP_AHB4_ENSETR |= (0x3 << 4);/*GPIO初始化*/GPIO_InitTypeDef  GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = 10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOE, &GPIO_InitStructure);while(1){ledE_on(8);ledE_on(10);ledF_on(10);delay_ms(500);ledE_off(8);ledE_off(10);ledF_off(10);delay_ms(500);}return 0;
}

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

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

相关文章

刷题日记09《图论基础》

图的存储结构 对于图结构而言&#xff0c;常见的存储结构主要有两种&#xff1a;邻接表和邻接矩阵&#xff1a; 邻接表很直观&#xff0c;我把每个节点 x 的邻居都存到一个列表里&#xff0c;然后把 x 和这个列表关联起来&#xff0c;这样就可以通过一个节点 x 找到它的所有相邻…

rust持续学习Box::leak

Box就是unique_ptr 这个函数的功能是消费box返回一个全局变量&#xff01; 写一个函数&#xff0c;想要真的返回全局变量&#xff0c;感觉用这个是个好的做法 fn Foo()->Option<&static mut A> {let a Box::new(A());Some(Box::leak(a)) }这样就能当真拿到这个全…

【算法与数据结构】222、LeetCode完全二叉树的节点个数

文章目录 一、题目二、一般遍历解法三、利用完全二叉树性质四、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、一般遍历解法 思路分析&#xff1a;利用层序遍历&#xff0c;然后用num记录节点数量。其他的例如…

家庭网络设计方案

网络设计方案1 设备清单&#xff1a; 设备类型数量安装位置设备作用设备连接关系AC1二楼客厅提供无线网络覆盖和管理连接到路由器AP5一楼三个房间、三楼小厅、四楼大房间扩展无线网络覆盖&#xff0c;通过POE方式供电连接到AC或交换机交换机1一楼车库连接所有有线网络接口&am…

视频增强技术-去噪

本文介绍了关于视频增强技术的相关方法包括传统方法和基于深度学习的方法&#xff0c;并给出了他们的对比实验结果&#xff0c;最后对它们简单的做了总结&#xff0c;文中有一些图片和总结来自于网上其他博主的文章&#xff0c;已在文中标记并给出了相关的原文链接&#xff0c;…

一文掌握如何前后端分离?

随着科技的进步和发展&#xff0c;低代码开发产品拥有广阔的市场前景。前后端分离似乎早已经是发展趋势了&#xff0c;因为做好前后端分离对于前后端的工程师而言是非常有利的&#xff0c;这样也有利于提升办公协作效率。那么&#xff0c;如何前后端分离&#xff1f;分别都有哪…

【期刊征稿】2区遥感类SCI,自引率低,检索稳定,3个月左右录用~

一、期刊简介 2区遥感类SCI 【期刊概况】3.0-4.0↑, JCR2区&#xff0c;中科院4区&#xff1b; 【终审周期】走期刊部系统&#xff0c;3个月左右录用&#xff1b; 【检索情况】SCI在检&#xff0c;正刊&#xff1b; 【版面情况】5-10篇版面&#xff1b; 二、征稿范围 基…

【机器学习】支持向量机SVM入门

优化目标 相较于之前学习的线性回归和神经网络&#xff0c;支持向量机&#xff08;Supprot Vector Machine&#xff0c;简称SVM&#xff09;在拟合复杂的非线性方程的时候拥有更出色的能力&#xff0c;该算法也是十分经典的算法之一。接下来我们需要学习这种算法 首先我们回顾…

小米路由器简单救砖

最近在将小米路由器CR8808刷机时&#xff0c;不小心操作失败&#xff0c;路由器成砖头了。好消息是&#xff0c;按reset可以进入openwrt 恢复控制台&#xff1b;坏消息是&#xff0c;通过恢复控制台上传的所有的固件&#xff0c;都提示无效固件。简单记录下成砖过程和救砖过程。…

正则表达式之子表达式与分组替换

参考地址 一、正则表达式元字符 字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如&#xff0c;’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 \\ 匹配 “\” 而 "\(" 则匹配 “(“。^匹配输入字符串的开…

“使用Spring Boot构建微服务应用的最佳实践“

标题&#xff1a;使用Spring Boot构建微服务应用的最佳实践 摘要&#xff1a;本文将介绍如何使用Spring Boot构建微服务应用的最佳实践。我们将讨论微服务架构的概念、Spring Boot的优势以及一些最佳实践&#xff0c;同时提供示例代码帮助读者更好地理解和实践。 正文&#x…

关于Docker的基本概念和使用

关于Docker的基本概念和使用 一、Docker 概述1、Dcker的概念2、容器的优势3、Docker与虚拟机的区别4、容器在内核中支持2种重要技术5、Docker核心概念 二、安装 Docker1、安装依赖包2、设置阿里云镜像源3、安装 Docker-CE并设置为开机自动启动3、查看 docker 版本信息4、docker…

AI智能化技术对项目管理的挑战与应对︱腾讯CSIG能源行业总经理王磊

腾讯CSIG能源行业总经理王磊先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;AI智能化技术对项目管理的挑战与应对。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 自从DALLE、Midjourney、…

sql关键字和字段冲突

问题描述&#xff1a;包含key字段名的条件查询sql语句执行居然报错 select * from goods_table where key"apple";执行报错&#xff1a; 报错原因 sql语句的字段和关键字发生冲突&#xff0c;导致无法解析sql 报错解决 key加反引号后&#xff0c;即可解决 sele…

程序员面试系列,docker常见面试题

原文链接 什么是Docker&#xff1f;它的主要作用是什么&#xff1f;Docker和虚拟机之间有什么区别&#xff1f;Docker的主要组件有哪些&#xff1f;Docker镜像和容器的区别是什么&#xff1f;如何构建Docker镜像&#xff1f;请简要描述构建过程。如何创建和启动一个Docker容器…

linux升级mysql

linux升级mysql 一.介绍二.下载三.文件配置1.查找删除mysql2.解压配置 四.修改配置五.初始化mysql服务六.启动mysql七.配置数据库七.测试 一.介绍 由于最近业务需要&#xff0c;不得不将之前的mysql5.7.26升级到mysql8.0加了 Linux安装mysql&#xff08;5.7.26&#xff09;&…

flask结合mysql实现用户的添加和获取

1、数据库准备 已经安装好数据库&#xff0c;并且创建数据库和表 create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci; CREATE TABLE admin( id int not null auto_increment primary key, username VARCHAR(16) not null, password VARCHAR(64) not null…

初识 Spring (存储和获取 bean)

目录 初识 Spring总结 DI&#xff08;依赖注入&#xff09;Spring 项目的创建创建一个 Maven 项目添加 Spring 框架支持添加启动类 存储 bean 对象创建 bean将 bean 注册到容器中 获取并使用 bean 对象获取 bean 的方法一获取 bean 的方法二获取 bean 的方法三 ApplicationCont…

(Chrome Ext)谷歌扩展程序-谷歌插件渗透测试方法记录

文章目录 前言一、本地获取谷歌插件/扩展程序源码二、工具化信息收集总结 前言 在工作岗位变更之后&#xff0c;越来越多“奇奇怪怪”的东西要去渗透和测试&#xff0c;在我之前干安服的时候&#xff0c;最多的就是测一下web&#xff0c;极少情况下测测app&#xff0c;但是现在…

Langchain 的 Conversation buffer memory

Langchain 的 Conversation buffer memory 本笔记本展示了如何使用 ConversationBufferMemory 。该存储器允许存储消息&#xff0c;然后将消息提取到变量中。 我们可以首先将其提取为字符串。 示例代码&#xff0c; from langchain.memory import ConversationBufferMemorym…