串口
通过这个程序就可以实现串口通信,在终端上实现控制了(现在还不能,还没添加),初步就显示自己的信息把!!!一:start.S代码如下:
#include"myuboot.h".global _start
_start:
b reset
b undefined_instruction
b software_interrupt
b prefetch_abort
b data_abort
b not_used
b irq
b fiq
reset:
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15, 0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
/* Disable Watchdog */
ldr r0, =WTCON
mov r1, #0
str r1, [r0]
mov sp, #8*1024 //设置堆栈,否着后面c不能用
bl led
bl system_clock_init
bl gequ
bl memory_init
ldr sp, =0x57000000 //初始化内存后就可以把sp移到这里了,然后在用一个歌曲测试一下,如果没成功的话,歌曲是不会播放出来的
bl gequ
bl uart_init
undefined_instruction:
software_interrupt:
prefetch_abort:
data_abort:
not_used:
irq:
fiq:
二:uart_init代码如下:
typedef volatile unsigned int u32;
typedef volatile unsigned short u16;
typedef volatile unsigned char u8;
#define GPACON *(u32 *)0x7F008000
#define ULCON0 *(u32 *)0x7F005000
#define UCON0 *(u32 *)0x7F005004
#define UTRSTAT0 *(u32 *)0x7F005010
#define UTXH0 *(u8 *)0x7F005020
#define URXH0 *(u8 *)0x7F005024
#define UBRDIV0 *(u32 *)0x7F005028
#define UDIVSLOT0 *(u32 *)0x7F00502C
void putchar(char data);
void puts(char *data);
char getchar();
int gets(char *data);
int strcmp(char *src1, char *src2);
void printf(char *, ...);
void _start()
{
GPACON &= ~0xff;
GPACON |= 0x22;
ULCON0 = 3;
UCON0 = (2 << 10)|5;
UBRDIV0 = 34;
UDIVSLOT0 = 0xdddd;
///
char buf[512];
int ret;
while (1)
{
printf("myboot # ");
ret = gets(buf);
if (ret <= 0)
continue;
if (strcmp(buf, "exit") == 0)
break;
printf("%s\n", buf);
}
}
void print_int(int val)
{
if (val <= 0)
return;
print_int(val/10);
putchar(val%10 + '0');
}
void print_hex(int val)
{
int i, tmp;
putchar('0');
putchar('x');
for (i = 7; i >= 0; i--)
{
tmp = (val >> (i * 4)) & 0xf;
if (tmp < 10)
putchar('0' + tmp);
else
putchar('a' + tmp -10);
}
}
void printf(char *cmd, ...)
{
int *addr = (void *)&cmd;
int num = 0;
while (*cmd)
{
while (*cmd && (*cmd != '%'))
putchar(*cmd++);
if (*cmd == '\0')
break;
cmd++;
num++;
switch (*cmd)
{
case 'c': putchar(*(char *)(addr+num));
break;
case 's': puts((char *)*(addr+num));
break;
case 'd': print_int(*(addr+num));
break;
case 'p': print_hex(*(addr+num));
break;
}
cmd++;
}
}
void putchar(char data)
{
while (!(UTRSTAT0 & (1 << 1)))
;
UTXH0 = data;
if (data == '\n')
putchar('\r');
}
void puts(char *data)
{
while (*data)
putchar(*data++);
}
char getchar()
{
char tmp;
while (!(UTRSTAT0 & 1))
;
tmp = URXH0;
if (tmp == '\r')
tmp = '\n';
putchar(tmp);
return tmp;
}
int gets(char *data)
{
char tmp, *p = data;
while (1)
{
tmp = getchar();
if (tmp == '\n')
break;
*data++ = tmp;
}
*data = 0;
return data-p;
}
int strcmp(char *src1, char *src2)
{
while (*src1 && *src2)
{
if (*src1++ != *src2++)
return 1;
}
if (*src1 || *src2)
return 1;
return 0;
}
三:测试结果如图:
打印出自己的标志!!后续添加命令都考这个了,目前不做命令的添加,还有其他模块没有添加进去!!!
下期预告:
lcd显示