拿到一款陌生的MCU,通常想的是先跑跑裸机。……通常第一件事是观摩GPIO寄存器。
OK6410开发板电路图。
6410的IO口资源……
想关的寄存器地址
GPMCON:IO口配备寄存器。
GPMDAT与GPLPUD寄存器。
通常,接触一款新的MCU。个人喜好写一个构件库(观摩完所有的寄存器后,构件就全部写好了)。调用自己写好的构件会很方便。
创建init.s汇编代码
关看门狗 设置堆栈 设置CPU基地址
IMPORT main
AREA init,CODE,READONLY
PRESERVE8
ENTRY
LDR R0, =0x70000000
ORR R0, r0, #0x13
MCR p15,0,R0,c15,c2,4
LDR R0, =0x7E004000
MOV R1, #0
STR R1, [r0]
ldr SP, =8*1024
BL main
END
复制代码
创建LED.h文件
#define GPMCON (*(unsigned long volatile *)0x7F008820)
#define GPMDAT (*(unsigned long volatile *)0x7F008824)
#define GPMPUD (*(unsigned long volatile *)0x7F008828)
#define LED1(Switch) if(!Switch)
GPMDAT |= 0x01;
else
GPMDAT &= ~0x01
#define LED2(Switch) if(!Switch)
GPMDAT |= 0x02;
else
GPMDAT &= ~0x02
#define LED3(Switch) if(!Switch)
GPMDAT |= 0x04;
else
GPMDAT &= ~0x04
#define LED4(Switch) if(!Switch)
GPMDAT |= 0x08;
else
GPMDAT &= ~0x08
extern void Delay(long);
extern void LED_init(void);
创建LED.c文件
#include 'LED.h'
void Delay(long count)
{
int i;
while(count--)
for(i=0;i<100;i++);
}
void LED_init(void)
{
GPMCON &= 0xffff1111; //001:output
GPMDAT = 0xffffffff;
}
main.c主函数文件
#include 'LED.h'
void Main(void)
{
LED_init();
while(1)
{
LED1(1);
LED4(0);
Delay(100000);
LED1(0);
LED2(1);
Delay(100000);
LED3(1);
LED2(0);
Delay(100000);
LED3(0);
LED4(1);
Delay(100000);
}
}
一个简单的流水灯程序。。和以前一样,用jlink烧至MCU。