历史上的今天

今天是:2024年10月11日(星期五)

正在发生

2018年10月11日 | OK6410裸机学习之串口实验

发布者:廿由人 来源: eefocus关键字:OK6410  裸机  串口实验 手机看文章 扫描二维码
随时随地手机看文章

start.S文件:

.globl _start

_start:

// 硬件相关的设置 

    // Peri port setup 

    ldr r0, =0x70000000

    orr r0, r0, #0x13

    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)

    

// 关看门狗 

    // 往WTCON(0x7E004000)写0 

    ldr r0, =0x7E004000

    mov r1, #0

    str r1, [r0]

    

    // 设置栈 

    ldr sp, =8*1024

    // 设置时钟 

    bl clock_init

    bl main

halt:

    b halt    

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

clock.c源码:

#define APLL_LOCK (*((volatile unsigned long *)0x7E00F000))

#define MPLL_LOCK (*((volatile unsigned long *)0x7E00F004))

#define EPLL_LOCK (*((volatile unsigned long *)0x7E00F008))

#define OTHERS    (*((volatile unsigned long *)0x7e00f900))

#define CLK_DIV0  (*((volatile unsigned long *)0x7E00F020))

#define ARM_RATIO    0   // ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    

#define HCLKX2_RATIO 4   // HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 100MHz 

#define HCLK_RATIO   0   // HCLK = HCLKX2 / (HCLK_RATIO + 1)   = 100MHz       

#define PCLK_RATIO   1   // PCLK   = HCLKX2 / (PCLK_RATIO + 1) = 50MHz    

#define MPLL_RATIO   0   // DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     

#define APLL_CON  (*((volatile unsigned long *)0x7E00F00C))

#define APLL_CON_VAL  ((1<<31) | (250 << 16) | (3 << 8) | (1))  

#define MPLL_CON  (*((volatile unsigned long *)0x7E00F010))

#define MPLL_CON_VAL  ((1<<31) | (250 << 16) | (3 << 8) | (1))

#define CLK_SRC  (*((volatile unsigned long *)0x7E00F01C))

//MDIV=250 对应: ARMCLK = 500MHz, HCLK = 100MHz, PCLK = 50MHZ 

//MDIV=266 对应: ARMCLK = 532MHz, HCLK = 133MHz, PCLK = 66.5MHZ 

void clock_init(void)

{

    APLL_LOCK = 0xffff;

    MPLL_LOCK = 0xffff;

    EPLL_LOCK = 0xffff;

    // set async mode 当CPU时钟 != HCLK时,要设为异步模式 

    OTHERS &= ~0xc0;

    while ((OTHERS & 0xf00) != 0);

    CLK_DIV0 = (ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12);

    

    APLL_CON = APLL_CON_VAL;    // 500MHz 

    MPLL_CON = MPLL_CON_VAL;  // 500MHz 

    CLK_SRC = 0x03;

}

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

uart.c源码:

#define ULCON0     (*((volatile unsigned long *)0x7F005000))

#define UCON0      (*((volatile unsigned long *)0x7F005004))

#define UFCON0     (*((volatile unsigned long *)0x7F005008))

#define UMCON0     (*((volatile unsigned long *)0x7F00500C))

#define UTRSTAT0   (*((volatile unsigned long *)0x7F005010))

#define UFSTAT0    (*((volatile unsigned long *)0x7F005018))

#define UTXH0      (*((volatile unsigned char *)0x7F005020))

#define URXH0      (*((volatile unsigned char *)0x7F005024))

#define UBRDIV0    (*((volatile unsigned short *)0x7F005028))

#define UDIVSLOT0  (*((volatile unsigned short *)0x7F00502C))

#define GPACON     (*((volatile unsigned long *)0x7F008000))

void init_uart(void)

{

    GPACON &= ~0xff;

    GPACON |= 0x22;

    

    // ULCON0 

    ULCON0 = 0x3;  // 数据位:8, 无较验, 停止位: 1, 8n1 

    UCON0  = 0x5;  // 使能UART发送、接收 

    UFCON0 = 0x01; // FIFO ENABLE 

    UMCON0 = 0;

    

    // 波特率 

    // DIV_VAL = (PCLK / (bps x 16 ) ) - 1 

    // bps = 57600

    // DIV_VAL = (66500000 / (115200 x 16 ) ) - 1 

    //         = 35.08

     

    UBRDIV0   = 35;

    // x/16 = 0.08

    // x = 1

     

    UDIVSLOT0 = 0x1;

    

}

char getchar(void)

{

    while ((UFSTAT0 & 0x7f) == 0);                           //判断接收缓存区是否为空

    return URXH0;

}

void putchar(char c)

{

    while (UFSTAT0 & (1<<14));                                //判断发送缓存区是否已满

    UTXH0 = c;

}

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

main.c源码:

#include "uart.h"

int main()

{

    char c;

    

    init_uart();

    

    while (1)

    {

        c = getchar();

        putchar(c+1);

    }

    

    return 0;

}

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

Makefile:

uart.bin: start.o main.o uart.o clock.o

    arm-linux-ld -Ttext 0 -o uart.elf $^

    arm-linux-objcopy -O binary uart.elf uart.bin

    arm-linux-objdump -D uart.elf > uart.dis

%.o : %.S

    arm-linux-gcc -o $@ $< -c

%.o : %.c

    arm-linux-gcc -o $@ $< -c -fno-builtin-putc   //-fno-builtin-putc避免putc函数名冲突

clean:

    rm *.o uart.elf uart.bin uart.dis


关键字:OK6410  裸机  串口实验 引用地址:OK6410裸机学习之串口实验

上一篇:OK6410启动分析
下一篇:OK6410裸机学习之时钟设置-C语言

推荐阅读

start.S源码:.globl _start_start:// 硬件相关的设置 // Peri port setup ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff) // 关看门狗 // 往WTCON(0x7E004000)写0 ldr r0, =0x7E004000 mov r1, #0 str r1, [r0] // 设置栈 ldr ...
(文章来源:中科罗伯特机器人学院) 中国是众所周知的制造业大国,但是在我国制造业中一旦涉及到有难度的核心技术,几乎都被国外垄断了,特别是工业机器人产业。随着国内机器人市场的不断步发展,更多的资本和企业将进入到机器人领域。我国机器人产业市场空间巨大,但从这也反映出我国工业机器人产业的发展还将面临的更多的挑战。 核心零部件是工业...
市调机构Canalys的最新报告显示,持续受益于疫情,全球PC市场在2020年第三季度出货7920万台,同比增长12.7%,创近十年来最高增速。图源:Canalys从厂商排名来看,联想以11.4%的增长率重新夺回PC市场的头把交椅,出货量逾1900万台。惠普以1870万台的出货量排名第二,同比增长11.9%。戴尔位列第三,出货量较去年同期小幅下降0.5%。苹果和宏碁并列第五,分...
Messages 信息应用和平台是苹果在 iOS 15 发布时推出的一项功能更新,用户可将信息与其他苹果应用的深度整合,如 Apple News、音乐和照片,推动这些连接的新功能被称为 “与你分享”。  根据 MacRumors 报道,多名用户反馈,iOS 15 Messages App 中的一个 Bug 可能会导致一些保存的照片被删除。  该 Bug 的具体表现为,如果用户从 M...

史海拾趣

问答坊 | AI 解惑

用于机顶盒设计的高性能模拟开关

引言随着机顶盒的设计加入更多新兴功能,如作为录象程序的硬盘、紧凑型闪存接口和视频点播 (VOD) 机器,模拟开关在这类应用中继续得以广泛采用。选用正确的开关,设计人员不仅能缩短产品面市时间来改善设计,还可以解决重要的设计难题如维持 ...…

查看全部问答∨

问下路过的高手哈,DXP中编整合库,原理图和PCB怎么对上的

我想了两天没整,明白就是如果原理图多一张或PCB多一张怎么办…

查看全部问答∨

怎么样在这里发帖时添加附件啊

我想上传东西但是不知道怎么添加附件…

查看全部问答∨

gooogleman大侠,求助!

就32分了! 请问大侠当时用9650采集图像时采集到的数据格式是什么(rgb,ycbcr?),当时大侠把它转化成图片了吗?是什么格式的?bmp,jpeg? 是怎么做的?谢谢了!…

查看全部问答∨

图形绘制

请依照如下要求设计 1、设计显示图形:自己的中文名字; 2、设计显示程序; 3、调试通过。 …

查看全部问答∨

谁有CUnit方面的资料啊?

要做毕业设计,网上关于CUnit方面的资料挺少的,哪位能否给我一些资料或者建议?…

查看全部问答∨

8bit轉32bit的疑問

一個32位的單片機器,是不是說 int32_t c, b, a; c = a + b 和unsigned char c, b, a; c = b + a; 一樣快? 是不是在程序中應該儘量使用32 bit 整數類型。…

查看全部问答∨

GC5016

本人最近正在用GC5016做下变频,以前没搞过,用FPGA产生了控制寄存器的写时序,但是当把用cmd5016产生的h文件写入时,只有[A-D]CK能出来,[A-D]FS出不来,也检查了TXT文件,没找到错误,求用过的兄弟姐妹分享一下在使用过程中的经验!…

查看全部问答∨

有关于FPGA方面的吗?分享分享

本帖最后由 paulhyde 于 2014-9-15 09:06 编辑 如题  …

查看全部问答∨

嵌入式Linux系统开发模式

嵌入式系统通常为一个资源受限的系统。直接在嵌入式系统的硬件平台上编写软件比较困难,有时甚至是不可能的。下面由卓跃教育为您介绍嵌入式系统开发模式。    第一步,建立嵌入式Linux交叉开发环境。目前,常用的交叉开发环境主要有开放和商业 ...…

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

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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