LED是SOC芯片与PCB结合的外部硬件设备,按照整个章节的梳理不应该放在开始位置。但实际在知识学习过程中需要结合实际的动手编程才能将内容学好学扎实,所以将当前的这个章节放在前面将我们整个开发流程梳理清楚。程序开发过程中,入门通过hello world程序打印来完成某种语言学习。对于ARM裸机和汇编语言,没有显示器进行数据打印,也没有串口进行信息回写,只能通过LED来进行代码流程的查看。当然一般情况下,开发板的第一个驱动程序自然是串口驱动,以方便进行后期代码调试和故障定位。
通过LED简单驱动开发,可以梳理出裸机驱动开发流程。开发过程设计目标输入或输出设备物理规格和功能规格说明文档、开发板原理图、SOC芯片手册。各项材料的说明如下:
1. 设备说明书。给定了一个硬件设备的物理规格、电气属性和操作实现接口说明。对于简单的物理设备(LED),不会有复杂的物理说明书,其底层的物理原理也不需要说明。稍微复杂一些物理设备,相关专业的人会有做过一些简单的物理设备,其内部具体的实现原理有一定的经验。对于复杂的硬件设备(数电/模电),例如DDR,自然不会给定其内部实现物理原理,只会给定功能模块的UL,并大概给定逻辑模块的衔接关系,主要是给定其按照协议实现的接口和接口控制逻辑。
2. 协议(接口)。对于较为复杂的设备,开发过程都是针对接口编程,硬件开发两端都按照协议说明进行各自硬件设计,软件开发人员也是根据协议给定的进行软件概念抽象,并实现相应的协议逻辑。对于简单的元器件当然也不需要复杂的逻辑说明。
3. 开发板原理图。开发板原理图是PCB的接口抽象,给定了元器件和核心SOC的硬件接口链接关系,实际上是协议规定的电器属性的物理接口链接关系。
4. 芯片手册。核心控制单元都是在SOC上面,芯片手册给定了如何控制实现需要控制元器件对应接口的寄存器设定规则。
1. LED物理原理
LED是普通的二极管,类似于初中物理中的点灯,输入两个引脚存在电压差满足点亮需要时,既可以点亮LED灯管。对于复杂的硬件设备,对外硬件接口时很多的,设备相应的协议中也是给定类似状态机或者是硬件操作思绪的高层协议说明,这些都是需要软件开发人员作为核心参考进行代码编写与开发的。
2. 开发板原理图
开发板原理图中搜索LED,确认其与芯片GPF4接口链接,进一步通过芯片原理图确定实际芯片的参数配置。
3. 芯片手册
I/O引脚GPF4包含配置和数据两个寄存器,配置寄存器设定引脚GPF4是输入还是输出,数据给定芯片引脚的数据输出。
4. 闪烁LED1
根据以上三步,确认LED1与GPF4链接,需要设定其为配置为输出,然后通过循环配置数据引脚为高低电平,进而实现LED灯的闪烁。如上这句话就是讲实际协议、开发板原理图和芯片手册三者联系在一起产生一个整体的读写控制(硬件驱动基本读写接口),最后在这个读写控制上加入了循环闪烁的逻辑处理流程(完全是软件算法概念)。
/*
* 点亮并闪烁LED1: gpf4
*/
.text
.global _start
#define GPF4CON 0x56000050
#define GPF4DAT 0x56000054
.macro DELAY TIMECNT
ldr r8, =\TIMECNT
DELAYLOOPSTART:
sub r8, r8, #1
cmp r8, #1
nop
blt DELAYLOOPEND
b DELAYLOOPSTART
DELAYLOOPEND:
.endm
_start:
/* 关闭看门狗 */
ldr r3, =0x53000000
ldr r4, =0
str r4, [r3]
/* 配置GPF4为输出引脚
* 把0x100写到地址0x56000050
*/
ldr r3, =GPF4CON
ldr r4, =0x100 /* mov r4, #0x100 */
str r4, [r3]
/* 设置GPF4输出高电平,点亮LED
* 把0写到地址0x56000054
*/
ldr r3, = GPF4DAT
ldr r4, =0 /* mov r4, #0 */
str r4, [r3]
flashlights:
/* 延时固定时间 */
DELAY 100000
/* 切换开关 */
str r4, [r3]
/* 进行输出高低电平判定,进而实现输出电平修改 */
cmp r4, #0
beq turnoff
b turnon
turnoff:
mov r4, #16
b flashlights
turnon:
mov r4, #0
b flashlights