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

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

你可能感兴趣的:(第一次开始尝试写,当记录自己的学习状态吧(学习驱动之史))