【LV12 DAY12-13 GPIO & C 语言与寄存器封装】

发布时间:2024年01月10日

GPIO
通用型输入输出,GPIO可以控制连接在其引脚实现信号的输入和输出
芯片的引脚和外部设备相连从而实现与外部硬件的通讯,控制,信号采集的功能。

在这里插入图片描述
控制CHG_COK引脚输出为高电平,LED亮,输出为低电平,LED熄灭。
查找CHG_COK引脚由GPX2_7控制器控制。
在这里插入图片描述
接着查询怎么控制GPX2_7寄存器
在这里插入图片描述
第28-32位控制GPX2_7是输入/输出模式,不能控制发出的是高电平还是低电平

在这里插入图片描述
当配置为输出端口时,引脚状态应该与相应的位相同。
也就是说第7位设置为1,那么GPX2_7引脚输出即为1高电平
使用汇编语言控制寄存器



.text
_start:

MAIN:
	BL LED_CONFIG
LOOP:
	BL LED_ON
	BL DELAY
	BL LED_OFF
	BL DELAY
	B LOOP

LED_CONFIG:
	LDR R2,=0x11000c40
	LDR R1,=0x10000000
	STR R1,[R2]
	MOV PC,LR

LED_ON:
	LDR R2,=0x11000c44
	LDR R1,=0x00000080
	STR R1,[R2]
	MOV PC,LR

LED_OFF:
	LDR R2,=0x11000c44
	LDR R1,=0x00000000
	STR R1,[R2]
	MOV PC,LR

DELAY:
	LDR R1,=1000000000
L:
	SUB R1,R1,#1
	CMP R1,#0
	BNE L
	MOV PC,LR

STOP:
   B STOP
.end

/*

  • 一.汇编语言访问存储器
  • 1.读存储器
  •  LDR R1,[R2]
    
  • 2.写存储器
  •  STR R1,[R2]
    
  • 二.C语言访问存储器
  • 1.读存储器
  •  data = *ADDR
    
  • 2.写存储器
  •  *ADDR = data
    

*/

使用C语言控制寄存器

void Delay(unsigned int Time)
{
	while(Time --);
}

#if 0
int main()
{
	/*通过设置GPX2CON寄存器来将GPX2_7引脚设置成输出功能*/
	*(unsigned int *)0x11000c40 = 0x10000000;

	while(1)
	{
		/*点亮LED2*/
		*(unsigned int *)0x11000c44 = 0x00000080;
		/*延时*/
		Delay(1000000);
		/*熄灭LED2*/
		*(unsigned int *)0x11000c44 = 0x00000000;
		/*延时*/
		Delay(1000000);
	}
	return 0;
}
#endif

#if 0
#define GPX2CON (*(unsigned int *)0x11000c40)
#define GPX2DAT (*(unsigned int *)0x11000c44)

int main()
{
	GPX2CON = 0x10000000;

	while(1)
	{
		/*点亮LED2*/
		GPX2DAT = 0x00000080;
		/*延时*/
		Delay(1000000);
		/*熄灭LED2*/
		GPX2DAT = 0x00000000;
		/*延时*/
		Delay(1000000);
	}
	return 0;
}
#endif

#if 0
typedef struct
{
	unsigned int CON;
	unsigned int DAT;
	unsigned int PUD;
	unsigned int DRV;
}gpx2;

#define GPX2 (*(gpx2 *)0x11000c40)

int main()
{
	GPX2.CON = 0x10000000;

	while(1)
	{
		/*点亮LED2*/
		GPX2.DAT = 0x00000080;
		/*延时*/
		Delay(1000000);
		/*熄灭LED2*/
		GPX2.DAT = 0x00000000;
		/*延时*/
		Delay(1000000);
	}
	return 0;
}
#endif

#if 0
#include "exynos_4412.h"

int main()
{
	GPX2.CON = 0x10000000;

	while(1)
	{
		/*点亮LED2*/
		GPX2.DAT = 0x00000080;
		/*延时*/
		Delay(1000000);
		/*熄灭LED2*/
		GPX2.DAT = 0x00000000;
		/*延时*/
		Delay(1000000);
	}
	return 0;
}
#endif


#include "exynos_4412.h"

int main()
{
	GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);

	while(1)
	{
		/*点亮LED2*/
		GPX2.DAT = GPX2.DAT | (1 << 7);
		/*延时*/
		Delay(1000000);
		/*熄灭LED2*/
		GPX2.DAT = GPX2.DAT & (~(1 << 7));
		/*延时*/
		Delay(1000000);
	}
	return 0;
}

Tips:

/*
 * 1.unsigned int a; 将a的第3位置1,其他位保持不变
 * 	******** ******** ******** ********
 * 	******** ******** ******** ****1***
 * 	00000000 00000000 00000000 00001000
 *
 * 	a = a | (1 << 3);
 *
 * 2.unsigned int a; 将a的第3位置0,其他位保持不变
 * 	******** ******** ******** ********
 * 	******** ******** ******** ****0***
 * 	11111111 11111111 11111111 11110111
 *
 * 	a = a & (~(1 << 3));
 *
 * 	3.unsigned int a; 将a的第[7:4]位置为0101,其他位保持不变
 * 	******** ******** ******** ********
 * 	******** ******** ******** 0101****
 *
 * 	1).先清零
 * 	11111111 11111111 11111111 00001111
 * 	00000000 00000000 00000000 11110000
 *  00000000 00000000 00000000 00001111
 *
 * 	a = a & (~(0xF << 4));
 *
 * 	2).再置位
 * 	00000000 00000000 00000000 01010000
 * 	00000000 00000000 00000000 00000101
 *
 * 	a = a | (0x5 << 4);
 *
 * 	=> a = a & (~(0xF << 4)) | (0x5 << 4);
 */
文章来源:https://blog.csdn.net/m0_46112340/article/details/135465103
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。