这里博主以cortex_A9来举例:下面是我使用的开发板的图片介绍:
图中详细标注了开发板中的部件及接口,下面我将通过对LED进行点灯操作,来简单介绍我们使用开发板进行裸机开发的一个基本流程是怎样的。
首先我们需要在提供的开发板资料电路图中找到我们需要进行操作的设备。并且了解它运行的原理,比如我们要对开发板上的LED灯进行点亮操作,首先我们在提供的开发板资料中找到它的电路原理图如下:
我们来分析以下,要使我们的发光二极管导通,那么我们对应的引脚需要给三极管的基极提供一个高电平,这样才能使二极管导通,让led点亮,图中两个电阻分别保护我们的芯片和发光二极管。三极管类型为NPN。
那么我们在芯片原理图册中找到对应的控制模块,LED灯的控制管脚如GPX2_7,如下图
可以看到资料给我们提供了寄存器的起始地址等信息,我们需要芯片输出一个高电平那么我们需要选择模式为OUTput输出模式,那么这就是我们下一步要做的事!看控制寄存器。
a.定义我们要控制的寄存器的宏(与手册里的寄存器地址对应)
b.设备初始化。(比如在我们点亮LED这个操作中,我们就需要设置它为输出状态,也就是将31-28位设置为0x01)
c.将功能分成最基本的小块,比如我们要实现led灯的顺序点亮熄灭,那么我们要先点亮灯,然后灭灯,加上延时,闪烁最后我们就完成了一个跑马灯的功能。
那么我们展示两段代码来展示点亮灯的操作,一个是用的汇编指令,一个使用我们的C语言来实现,在一般的裸机开发中一般我们都使用c语言。
汇编指令完成灯的点亮:
@GPX2CON 寄存器地址:0x11000000+0x0c40
.text
ldr r0,=0x11000c40 @将寄存器地址搬移到R0,那么R0就代表GPX2CON
ldr r1,[r0]
bic r1,#0xf0000000 @将28-31号比特位清零
orr r1,#0x10000000 @将28号比特位置为1,其他比特位不动,设置GPX2_7输出功能
str r1,[r0]
ldr r0,=0x114001e0 @将GPF3C0N寄存器搬移到R0
ldr r1,[r0]
bic r1,#0xf0000 @将19-16号比特位清零
orr r1,#0x10000 @将16号比特位置为1,其他比特位不动,设置GPX3-4为输出功能
str r1,[r0]
@亮灯
while:
ldr r2,=0x11000c44 @将寄存器GPX2DAT寄存器地址搬移到R2
ldr r3,[r2]
orr r3,#0x80 @将GPX2DAT的7号位置1
str r3,[r2]
ldr r2,=0x114001e4
ldr r3,[r2]
orr r3,#0x10 @将GPX3DAT的4号位置1
str r3,[r2]
bl delay_1ms
@灭灯
ldr r2,=0x11000c44
ldr r3,[r2]
bic r3,#0x80
str r3,[r2]
ldr r2,=0x114001e4
ldr r3,[r2]
bic r3,#0x10
str r3,[r2]
bl delay_1ms
b while
delay_1ms:
ldr r5,=0x4fff0000
loop:
cmp r5,#0
subgt r5,#1
bgt loop
mov pc,lr
.end
C语言:
#define GPX2CON *(volatile unsigned int*)0x11000c40
#define GPX2DAT *(volatile unsigned int*)0x11000c44
void led2_init()
{
GPX2CON =GPX2CON &(~(0xf<<28))|(1<<28);
}
void led2_on()
{
GPX2DAT=GPX2DAT|(1<<7);
}
void led2_off()
{
GPX2DAT=GPX2DAT &(~(1<<7));
}
void delay()
{
int i,j;
for(i=0;i<10000;i++)
for(j=0;j<256;j++);
}
int main()
{
led2_init();
while(1)
{
led2_on();
delay();
led2_off();
delay();
}
}
重点就是找到对应的模块注意观察控制寄存器,通过修改控制寄存器,来实现我们的功能。