历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2018年10月14日 | Tiny4412的Uart操作

2018-10-14 来源:eefocus

#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   *~ 

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


推荐阅读

史海拾趣

American Custom Components公司的发展小趣事

近年来,电子行业面临着原材料价格上涨、市场竞争激烈等挑战。American Custom Components公司也不例外,面临着成本压力和市场份额的下降。为了应对这些挑战,公司采取了一系列措施,包括优化生产流程、降低生产成本、加强研发创新等。同时,公司还积极拓展新的应用领域和市场,寻找新的增长点。这些努力使得公司在行业竞争中保持了一定的优势。

EM Microelectronic-Marin SA公司的发展小趣事

多年来,EM Microelectronic-Marin始终保持着对技术的热爱和追求。公司不断投入资源进行研发,推动电子技术的持续发展。在未来,随着物联网、人工智能等技术的不断兴起,EM Microelectronic-Marin将继续致力于技术创新和产品升级,为电子行业的发展贡献自己的力量。

星海公司的发展小趣事

随着国内市场的饱和,星海公司开始实施国际化战略,积极拓展海外市场。公司积极参加国际展览和比赛,展示星海钢琴的品质和实力。同时,星海公司还与国际知名音乐院校和乐团建立合作关系,推动星海钢琴在国际市场的知名度和影响力。目前,星海钢琴已出口到世界60多个国家和地区,成为国际市场上备受瞩目的中国品牌。

C-TON Industries公司的发展小趣事

随着国内市场的饱和,C-TON开始将目光投向国际市场。公司制定了全球化的发展战略,通过设立海外分公司、参加国际展会等方式,积极开拓海外市场。同时,C-TON还加强了与国际同行的交流与合作,学习借鉴他们的先进经验和技术。这些举措使得C-TON的产品逐渐在国际市场上占据了一席之地,公司的业务范围也得到了极大的拓展。

CMD公司的发展小趣事

CMD公司在数据存储领域不断创新,推出了一系列高性能的产品。其微开放系统、高性能工作站等产品为LAN和PC提供了先进的数据存储技术。同时,CMD还致力于发展、生产、销售高性能ASIC和板级产品,其IDE/UltraATA芯片在全球范围内得到了广泛应用。

ERGOBAHCO公司的发展小趣事

进入21世纪后,电子行业面临着技术更新换代的巨大变革。ERGOBAHCO公司敏锐地捕捉到了这一变革带来的机遇和挑战,开始加大在新技术、新产品的研发力度。公司通过与高校、科研机构等合作,成功推出了一系列符合市场需求的智能化、绿色化的电子产品。这些产品不仅为公司带来了丰厚的利润回报,也进一步巩固了公司在行业内的领先地位。

问答坊 | AI 解惑

控制阀的选型

1. 概述 控制阀安装在工艺过程自动控制系统中,直接控制控制工艺介质。多年以来,控制阀被认为是低技术含量产品,事实上控制阀往往要控制高温、高压、高压差、高粘度或含有固体颗粒、强腐蚀性和闪蒸的流体,工作条件非常恶劣,从而导致调节阀使用 ...…

查看全部问答>

TCRT5000_红外反射式光电传感器_反射型光电开关_光电对管_寻迹小车专用

TCRT5000_红外反射式光电传感器_反射型光电开关_光电对管_寻迹小车专用…

查看全部问答>

问一下关于如何让板子脱机运行的问题~

最近在研究一块板子,就是用书上说的tftp、nfs之类的方法,现在把文件系统已经移到了SD卡上,但板子加电启动的时候中间还是要经过漫长的一段过程……最后再找SD卡挂载上面得fs…… Sending DHCP requests ...eth0: no IPv6 routers present ... t ...…

查看全部问答>

有谁在 vista x64 下 安装过 passthru 驱动的,来指点下

我使用微软提供的 WDK 6000 bindview 程序(超级用户权限, X64的版本)在 vista x64 下安装 passthru 驱动 发现,只有使用 pncClassSetup->SelectAndInstall 方法才能反复安装成功, pncClassSetup->Install 只能在没安装过 自己驱动的机器上安装 ...…

查看全部问答>

Cyclone 1 (EP1C12) 输出接OC门怎么设置

如题,选用的是Altera的Cyclone芯片,具体型号是EP1C12,有点搞不清楚IO输出电平,看资料好像有LVTTL,LVCMOS等形式的,我的电路输出接口要求是用OC门输出,打算加入一篇74LS06或者74LS04,但是不知道输入的电平是否匹配。 有人用过FPGA输出OC门么 ...…

查看全部问答>

wince下宽字符的中英文字符怎么辨别呢?

如果不是宽字符可以用长度辨别 但是在宽字符下不管是中文还是英文都是 长度都是1 这个怎么辨别是中文呢? 还有 如果我要出字符串中搜索到是否含有某个汉字 这个是通过怎么搜呢? 我在 edit控件中输入 方   然后把这个方放入wchar_t *st ...…

查看全部问答>

wince 5/6能访问asp的商务网站么?

wince   5/6能访问asp的商务网站么?有可能么? 我想在以下的开发板上跑wince   5或6,做商务网站客户端    通过有线或无线网卡浏览asp的商务网站可行不? 硬件平台: arm   2410 sdram  &nb ...…

查看全部问答>

求LM3S EPI模块的外设驱动库使用指南

如题,EPIAddressMapSetEPIConfigSDRAMSetEPIAddressMapSet这些函数的使用说明找不到啊。请有的兄弟给分享下。先谢过了。…

查看全部问答>

小弟我虚心请教,跪求各位高手解答!在线等!!!!!!! 在线等!!!!!!!

小弟我虚心请教,跪求各位高手解答。我想用单片机实现电压的转换。大致要求如下: 输出端有2个:x和y.  输入端为p1到p9.   p1,p2,p3为一组,p4,p5,p6为一组,p7,p8,p9为一组。p1端输入5v电压时,x端输出5v,y端输出0v;p3端输入5v时,x端输 ...…

查看全部问答>

求MSP430G2553的寄存器介绍

由于刚接触这芯片,对于寄存器很不熟悉,希望各位大虾能指点一下,给我点资料…

查看全部问答>