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