裸机开发(一)

nanoPc T2裸机开发

Posted by logicic on May 6, 2018

参考:

http://wiki.friendlyarm.com/wiki/index.php/NanoPC-T2/zh#.E7.BC.96.E8.AF.91U-Boot

开发板是使用友善之臂的nanoPc T2,Soc是S5P4418,其他的外设自己看wiki吧,上面都有。我觉得挺不错的,虽然我就只用过这家的,但是用起来还是不错的。

—————————-正文

我们需要知道我们现在要做的是一个什么样的事情,要有个概念。如果你看了迪卡大佬的文章,他的题目就是,像玩51一样玩s5p4418,这也就是说,我们可以能够用s5p4418来点灯啊,设置按键啊,加个1602啊,加个12864啊,撸个中断来跑定时器啊,这种和学51时相同的功能。(什么?居然还能这么玩?)这是肯定的,原理都是相同的,只是一个更复杂,功能更多了,运用场景更广阔而已。

ok,比如说,我们要拿他来点灯。回想一下51的时候,我们是怎么做的?

1.包含头文件,reg51.h这不能少吧,(这一步IDE已经帮我们做好了,我只需要include就好)

2.撸功能函数

3.编译生成hex或者bin文件

4.下载到目标机中(即51单片机)

非常简单对吧,那么对应到我们的手头这块nanoPc T2应该怎么做呢?

1《========》我们也需要一个头文件,这个头文件和reg51.h的功能相同的,但是我们得自己写。

2《========》撸功能函数

3《========》编译生成hex或者bin文件(我只试了生成bin)

4《========》下载到目标机中(即s5p4418)

其实都一样的步骤,但是我们缺少了IDE的帮忙,略显得麻烦而已,我没有试过keil能不能用,我此行的目的是为了理解他的一整个流程,而不是仅仅是跑出个结果而已,所以参照迪卡大佬的程序,理解。

那么具体怎么做呢?

1.头文件形成,看了迪卡大佬的文章,他对51的理解非常深,我学的时候仅仅是停留在用而已,他已经看到了本质。一整个系统都是0 1的“世界”,一层层地搭建起来的。最底层的世界就是许多电平信号的传输。那么,回来,51的头文件,上面有很多sfr sbit定义的东西,后面接着一串16进制数,那是什么?那就是寄存器的绝对地址,前面的字符串就是这些地址的代号,比方说,sfr P0 0x80; 你可以由0x80这个地址找到这个寄存器,而P0则是我们在上层交流的暗语,最后汇编的时候他会还原成绝对地址的。

也就是说,我们要给s5p4418分配暗语代号,目的是为了更好的交流。ok,知道我们要做的事情是什么了之后,还要解决我们如何得知他们寄存器等的地址在哪呢?查芯片的datasheet,上面写得还挺详细的,(虽然我也没有对比,但是看着挺多页的。。。)什么?你不会?不要紧,先看一下别人写的源代码,看一下别人是怎么写的,然后再思考为什么这么写,上面的信息我可以在哪查得到。由于我用的是迪卡大佬的代码,所以我就不放上来了,你们想要的话,可以去微博联系他,(我还没有微博。。。。)

2.假设我们已经看明白了头文件,我们以点灯为例,我们需要操作的就是GPIO接口,那么我们需要操作的就是GPIO,gpio有那么多,我们选哪一个?img点击并拖拽以移动

这是datasheet上截的图,下面还有很多。这就是他比51强大的原因了,他强大的地方就是他功能强且多,而空间有限,引脚不够怎么办?引入了引脚复用的机制。下图我们可以看到他的封装图,

img点击并拖拽以移动

他的bga封装引出的引脚,对于他的功能来说,其他不算多,正因为引脚复用,才拓展了他。下图是他的复用映射图,

img点击并拖拽以移动

A1 A2 A3….对应着他的引脚,但是他引脚的功能是什么,需要寄存器来设置。

img点击并拖拽以移动这就是我们需要控制gpio的寄存器,来达到我们想要的功能。

ok,我们现在已经知道了,我们操作寄存器的目的是什么了,现在我们就可以来配置寄存器来达到我们的目的。

我们的目的是点亮led,那么我们要查原理图,什么引脚控制的led,这个就不贴图了。我的这块板子,是GPIOB12控制的led0的。所以,我们需要GPIOB12,ok,在引脚复用寄存器那里查看,我们应该怎么操作才能得到GPIOB12。

img点击并拖拽以移动这两个是配置复用的寄存器,ALTFN0是0-15引脚的,ALTFN1是31-16引脚的。我需要的是12,那么,看12img点击并拖拽以移动

好像并没有什么GPIOB12的字眼出现,我们再看刚才的引脚分配图,

img点击并拖拽以移动

看到了吗,ALT Function0 ,1,2,3是配置他们的功能引脚的。GPIOB12是2,所以赋值10.

即,GPIOBALTFN0 = (0X2«24);或者你写成16进制也行。ok,这样之后这个引脚就是GPIOB12了。但是我们控制LED,是要让引脚输出电压,所以还需配置为输出模式,这个也是一样的,配置相应的寄存器就ok了,很简单的。输出也有相应的控制,所以,非常简单就能达到我们的要求了。至此,我们的功能函数也就撸完了。