Linux 学习记录55(ARM篇)

Linux 学习记录55(ARM篇)

本文目录

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

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

1. 封装GPIO组寄存器

c 复制代码
#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模式以及相关配置

使用枚举封装

c 复制代码
/*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初始化结构体

c 复制代码
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

c 复制代码
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;
}
相关推荐
小张认为的测试2 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
打鱼又晒网10 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
biter008815 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
良许Linux24 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
蜜獾云35 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维36 分钟前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
bitcsljl1 小时前
Linux 命令行快捷键
linux·运维·服务器
ac.char1 小时前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习