#include "regs.h"

void enable_mmu(unsigned long ttb);

void init_ttb(unsigned long *ttb_base);

void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);

void memset(char *buf, char ch, int size);

void memcpy(char *dst, char *src, int size);

void do_irq(unsigned long regs[]);

void uart3_putc(unsigned char ch);

unsigned char uart3_getc(void);

void uart3_puts(char *s);

void uart3_gets(unsigned char *s);

void (*printf)(char *, ...) = 0x43e11434;

void main(void)

{    

    init_uart();

    uart3_puts("\n------------welcome--------------\n");

    while(1) {    

        unsigned char cmd[512];

        uart3_puts("[ Li Baizhang @Yogurt]# ");

        uart3_gets(cmd);

        uart3_puts(cmd);

        uart3_puts("is not supported.\n");

    }

}

void init_uart(void)

{

    //配置引脚

    GPA1CON     &= ~(0xff << 16);    

    GPA1CON  |=  (0x22 << 16);

    

    //SCLK_user_t == 800M

    //DIVuart3 = 7

    //SCLKuart3 = 800 / (7 + 1) == 100M

    ULCON3 = 3 ; //8N1

    UCON3 = 1 | ( 1 << 2); //接收和发送都设为1:中断或者轮询模式

    UFCON3 = 0;  //禁用FIFO

    // 54.25 - 1 = 53.3

    UBRDIV3 = 0x35;

    UFRACVAL3 = 0x4;    

}

void uart3_putc(unsigned char ch)

{

    while(!(UTRSTAT3 & ( 1 << 1)));

    UTXH3 = ch;

}

unsigned char uart3_getc(void)

{

    unsigned char ch;

    while(!(UTRSTAT3 & ( 1 << 0)));

    ch = URXH3;

    return ch;

}

void uart3_puts(char *s)

{

    while(*s) {

        uart3_putc(*s);

        if (*s == '\n') {

            uart3_putc('\r');

        }

        s ++;

    }

}

void uart3_gets(unsigned char *s)

{

    unsigned char ch = 0;

    while(1) {

        ch = uart3_getc();

        uart3_putc(ch);

        if ((ch == '\r')) {

            uart3_putc('\n');

            break;

        }

        *s = ch;

        s ++;

    }

    *s = 0;

}

void do_irq(unsigned long regs[])

{

    printf("PWM Timer0: Time Out\n");

    

    TINT_CSTAT |= (1 << 5);

}

void enable_mmu(unsigned long ttb)

{    

    unsigned long c1_flags;

    init_ttb(ttb);

    c1_flags = 1 | (1 << 3) | ( 1 << 11) | ( 1 << 13) |  (1 << 28);

    __asm__ __volatile__ (

        "mvn r0, #0 \n"            

        "mcr p15, 0, r0, c3, c0, 0\n"

        "mcr p15, 0, %1, c2, c0, 0\n" //configure ttb

        "mrc p15, 0, r0, c1, c0, 0\n"

        "orr %0, r0, %0\n"

        "mcr p15, 0, %0, c1, c0, 0\n" //enable mmu

        :

        : "r" (c1_flags), "r" (ttb)

        : "r0"

    );

}

void init_ttb(unsigned long *ttb_base)

{

    unsigned long va, pa;

    for (va = 0x00000000; va < 0x10000000; va += 0x100000) { //Others

        pa = va;

        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    

    }

    for (va = 0x10000000; va < 0x14000000; va += 0x100000) { //SFR

        pa = va;

        ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    

    }

    for (va = 0x40000000; va < 0x80000000; va += 0x100000) { //DRAM

        pa = va;

        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    

    }

    

}

void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa)

{

    ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    

}

void memset(char *buf, char ch, int size)

{

    int i;

    for (i = 0; i < size; i ++)

        buf[i] = ch;

}

void memcpy(char *dst, char *src, int size)

{

    int i;

    for (i = 0; i < size; i ++) 

        dst[i] = src[i];    

}

__asm__ (

"vectors:\n"

    "b reset\n"

    "b und\n"

    "b swi\n"

    "b pre_abt\n"

    "b dat_abt\n"

    ".word 0\n"

    "b irq\n"

    "b fiq\n"

"reset:\n"

"und:\n"

    "mov sp, #0x74000000\n"

    "stmfd sp!, {r0-r12, lr}\n"

    "mov r0, sp\n"

    "mov r3, #0x74000000\n"

    "ldr r3, [r3]\n"

    "blx r3\n"

    "mov sp, #0x74000000\n"

    "ldmea sp, {r0-r12, pc}^\n"

"swi:\n"

"pre_abt:\n"

"dat_abt:\n"

"fiq:\n"

"irq:\n"

    "mov sp, #0x75000000\n"

    "sub lr, lr, #4    \n"

    "stmfd sp!, {r0-r12, lr}\n"

    

    "mov r0, sp\n"

    "mov r3, #0x75000000\n"

    "ldr r3, [r3]\n"

    "blx r3\n"

    "mov sp, #0x75000000\n"

    "ldmea sp, {r0-r12, pc}^\n"

"EOV:\n"

"vectors_start:\n"

    ".word vectors\n"

"vectors_end:\n"

    ".word EOV\n"

);

===================================================================

Makefile文件:

default:

    arm-linux-gcc -c test.c  -o test.o

    arm-linux-ld  -Ttext=0x70003000  test.o  -o test

    arm-linux-objcopy  -O binary  test  test.bin

clean:

    rm -f test.o  test  test.bin   *~ 

==============================================================


关键字:Tiny4412  Uart操作 引用地址:Tiny4412的Uart操作

上一篇:Tiny4412的LCD操作
下一篇:Tiny4412中断控制器(GIC)之PWM

推荐阅读

在前边我们使用汇编完成了一个流水灯实验: Tiny4412汇编流水灯代码,Tiny4412裸机LED操作但是,汇编语言可读性太差,在这一节我们用 C语言来实现了同样的功能,而以后的试验也尽量用 C语言实现。我们在编写上位机程序时,C语言程序执行的第一条指令,并不在main函数中。生成一个 C程序的可执行文件时,编译器通常会在我们的代码中加上几个被称为启动文...
据外媒报道,虽然太阳能电池板非常有效,但是其主要缺点之一是,只会在白天产生能量,因此需要存储多余的能量以备夜间使用。不过现在,美国加州大学洛杉矶分校(UCLA)的工程师们研发出一种原型设备,与太阳能电池板工作原理几乎相反,该设备可以从寒冷的夜空中收集能量,被动为LED灯供电。该设备的工作遵循热电原理,即通过两个表面的温差而产生电流,最...
TDS2012C如何准确地测试纹波:TDS2000系列示波器是泰克入门级的唯一一款是终身保修的示波器,从带宽60-200MHZ在市场上已经存在从第一代到现在已经有10个年头了,这一款经典的示波器广泛使用在电源纹波测,一般示波器是使用带宽限制来测量纹波,以防止拾取并非真正存在的高频杂讯。示波器带宽设置为20M即可。去掉探头“帽子”和地线夹,以防止长地线形成的...
10月13日,全志科技发布2021 年前三季度业绩预告称,预计前三季度归属于上市公司股东的净利润为3.55亿至4.25亿元,同比增长101.77%至141.56%;扣除非经常性损益后的净利润为3.25亿至3.75亿元,同比增长208.83%至256.34%。其中,全志科技预计第三季度归属于上市公司股东的净利润为1.3亿至1.63亿元,同比增长44.62% 至81.33 %;扣除非经常性损益后的净利...

史海拾趣

问答坊 | AI 解惑

【Jack——PIC 单片机操作系统的优点与试用】

在单片机的开发中,软件的过程式开发(跟自顶向下的过程式语言有直接关系)是长久以来的软件开发方法,但不能否认的是,存在数十种为人所知和不知的 RTOS,甚至是开发人员自己动手构造一个简单的 RTOS 以提高工作效率和改善软件构建的复杂性,这也 ...…

查看全部问答∨

quartus2波形仿真问题

用quartus2进行波形仿真时,打不开仿真后的波形文件,是什么原因? 程序编译综合都没问题,加载网表也没出错。仿真提示也是成功的,但是在information里可以看到说波形文件里有错导致打不开仿真后的波形图。波形文件怎么会有错呢?…

查看全部问答∨

CAB安装包修改注册表问题

各位大虾,       小弟需要一个将一个.dll文件打包安装到设备,同时修改注册表.我的.inf文件已经写好了,能正确生成.cab文件, 现在就是不知道怎么才能修改注册表,那位兄弟能指点以下?谢了。…

查看全部问答∨

新手如何进入无线开发领域?

买一块GPRS的板子吗? 各位都是怎么学的? 能给在下一些建议吗,谢谢…

查看全部问答∨

www.kingofcoder.com 100MB 免費空間 + 100MB mysql 空間

www.kingofcoder.com 100MB 免費空間 + 100MB mysql 空間 大家快點來呀 JSP, PHP, oracle空間, 很快就會開通, 大家快點登記吧 http://www.kingofcoder.com匯集大量各種編程語言文章、提供免費asp、php、jsp空間、免費mysql、oracle數據庫空間 ...…

查看全部问答∨

起重变频调速系统中制动电阻功率的计算

1、 引言    起重机调速技术已有了较长的发展历史,从直流调速到交流调速,从AC定子调速技术到DC晶闸管调速装置,再发展到今天广泛应用的转子串电阻调速技术。但这些技术都存在着元件易损、维修不便、设备冲击大、调速范围小等许多缺点。 ...…

查看全部问答∨

德州仪器:怎样启动OMAP-L138

$(\'swf_G4i\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMjg0MzA0NDI4/v.sw ...…

查看全部问答∨

【低功耗】Virtex-6 FPGA Family

The Virtex®-6 FPGA family is the high-performance silicon foundation for Targeted Design Platforms. Consuming 50% lower power and delivering 20% lower cost than the previous generation, the new family is built with the ri ...…

查看全部问答∨

TI LM3S M3的供电设计概述

TI LM3S M3的供电共有4组:3.3V数字,用于I/O供电和内置LDO供电,一般标号为VDD,需要外置供电提供;1.8V,一般标号为VDDC,为内核和逻辑供电,一般由内置LDO提供,直接连接到LDO管脚。查看器件的Errata 表,有的M3的LDO有问题,不能稳定供电 ...…

查看全部问答∨

纠正错误:最权威的手机充电秘诀!

在微博上看到这个,不知道是不是真的,那为什么买笔记本买手机的时候,都要提醒开始要耗完电然后过充呢? 国外知名科技网站刊文指出,每次将电池电量充足,都会造成电池少许退化(充电98%-99%最佳);更关键的是,要想延长电池寿命,最好别让电池 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved