第四步:串口(基于飞凌6410的开发板)

来源:互联网 发布:C语言unlink函数 编辑:程序博客网 时间:2024/05/06 02:49

串口

通过这个程序就可以实现串口通信,在终端上实现控制了(现在还不能,还没添加),初步就显示自己的信息把!!!

一: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显示


原创粉丝点击