欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第一次开始尝试写,当记录自己的学习状态吧(学习驱动之史)

程序员文章站 2022-06-20 08:40:24
...

#gec6818开发板之跑马灯
#今年寒假异常难过,不如我们一起来学习吧!这两天开始重新学习,突然感觉敲代码的日子可真美好,人都快憋坏咯

学习驱动的第一个关键,你得先知道开发板的启动过程,对于嵌入式Linux操作系统来说,先上电,然后进入到uboot中,加载Linux内核后,挂载根文件系统,最后才开始会执行自启动应用程序。

今天学的是如何让6818上的LED闪亮起来,在学过51单片机的基础上,对引脚之类的概念还是有些帮助的,但此次代码中却有了一个较大的区别,之前我们每次接触的C文件都会有一个头文件,以保证能成功调用各种库函数,但今天的学习内容我们用的是寄存器,来完成我们的任务,所以代码中没有任何头文件的出现。

怎么办呢,一个小白不知道接下来该怎么写了,直接码起来算了:

//跑马灯
//1.定义寄存器
//D7->GPIOE13
#define GPIOEOUT    (*(volatile unsigned int *)0xC001E000)
#define GPIOEOUTENB (*(volatile unsigned int *)0xC001E004)
#define GPIOEALTFN0 (*(volatile unsigned int *)0xC001E020)
#define GPIOEALTFN1 (*(volatile unsigned int *)0xC001E024)

//D8->GPIOC17
//D9->GPIOC8
//D10->GPIOC7
#define GPIOCOUT    (*(volatile unsigned int *)0xC001C000)
#define GPIOCOUTENB (*(volatile unsigned int *)0xC001C004)
#define GPIOCALTFN0 (*(volatile unsigned int *)0xC001C020)
#define GPIOCALTFN1 (*(volatile unsigned int *)0xC001C024)

//2/c程序的入口函数_start,不使用标准c的库
//(省略了很多复杂的配置,例如半主机模式的配置、重新配置堆)

static void delay(void);

void _start(void)
{
	//配置GPIOE13为GPIO功能,将[27:26]bit清零
	GPIOEALTFEN0 &=~(3<<26);
	//配置GPIOE13为输出模式,将[13]bit设置为1
	GPIOEOUTENB |=1<<13;
	
	//配置GPIOC17为GPIO功能,将[3:2]bit设置为01
	GPIOEALTFEN1 &=~(3<<2);//将[3:2]bit清零
	GPIOEALTFEN1 |=1<<2;//将[2]bit设置为1
	//配置GPIOC17为输出模式,将[17]bit设置为1
	GPIOEOUTENB |=1<<17;
	
	//配置GPIOC8、GPIOC7为GPIO功能,将[17:16]、[15:14]bit设置为01
	GPIOCALTFEN0 &=~(15<<14);//将[17:16]、[15:14]bit清零
	GPIOCALTFEN0 |=5<<14;//将[16]bit、[14]bit设置为1
	//配置GPIOC8、GPIOC7为输出模式,将[8][7]bit设置为1
	GPIOCOUTENB |=3<<7;
	
	while(1)
	{
		//点亮D7,GPIOE13输出低电平,将GPIOEOUT的[13]bit清零		
		GPIOEOUT &=~(1<<13);
		GPIOCOUT |=1<<17;//熄灭D8
		GPIOCOUT |=3<<7;//熄灭D9D10
		//延时
		delay();
		
		//点亮D8,GPIOC17输出低电平,将GPIOCOUT的[17]bit清零		
		GPIOCOUT &=~(1<<17);
		GPIOEOUT |=1<<13;//熄灭D7
		GPIOCOUT |=3<<7;//熄灭D9D10		
		//延时
		delay();

		//点亮D9,GPIOC8输出低电平,将GPIOCOUT的[8]bit清零		
		GPIOCOUT &=~(1<<8);
		GPIOEOUT |=1<<13;//熄灭D7
		GPIOCOUT |=1<<7;//熄灭D8	
		GPIOCOUT |=1<<17;//熄灭D10
		//延时
		delay();
		
		//点亮D10,GPIOC7输出低电平,将GPIOCOUT的[7]bit清零		
		GPIOCOUT &=~(1<<7);
		GPIOEOUT |=1<<13;//熄灭D7
		GPIOCOUT |=1<<8;//熄灭D8
		GPIOCOUT |=1<<17;//熄灭D9		
		//延时
		delay();			
	}	
}

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

??思考为什么要加volatile,如果不加,出现什么现象

在写这段代码中我的所有同学都入了一个坑,不是所有的复用功能都是选择Function 0
第一次开始尝试写,当记录自己的学习状态吧(学习驱动之史)
这个就得来说说原理图及数据手册的重要性了,首先要在数据手册中查找引脚的作用描述
第一次开始尝试写,当记录自己的学习状态吧(学习驱动之史)
在这里才能真正的知道该引脚所对应的功能,刚开始学习寄存器肯定会有很多懵逼的地方,这些我也还要再多多学习,代码虽然出来了,但是我还要在开发板上测试啊啊啊啊!!!!我的开发板现在还在调试中,我走了,我得加班弄我的板子了,等我弄完再上图吧