tiny4412 时钟测试

发布者:SparkCrafter最新更新时间:2022-01-13 来源: eefocus关键字:tiny4412  时钟测试 手机看文章 扫描二维码
随时随地手机看文章

前面分析了 4412 时钟体系,本文来简单测试一下,参考韦东山老师的 Linux 应用完全开发手册4412 (上)


第一实验:


三星公司的BL1会将ARMCLK初始化为400MHz,我们关闭APLL,让 ARMCLK 工作在 24MHz,查看LED闪烁是否缓慢


start.S


.text  

.globl _start  

_start:  

    ldr sp, =0x02027800   

// 调用C函数之前必须设置栈,栈用于保存运行环境,给局部变量分配空间  

// 参考ROM手册P14, 我们把栈指向BL2上方1K处(1K已经够用),  

// 即:0x02020000 (iRAM基地址) + 5K(iROM代码用) + 8K(BL1用) + 16K(BL2用) + 1K(用作栈))  

  

    bl main  // 调用main函数(main这个名称不是固定的,可以随意改)  

  

halt_loop:  

  

    b halt_loop  


led.c


#define GPM4CON (*(volatile unsigned int *)0x110002E0)  

#define GPM4DAT (*(volatile unsigned int *)0x110002E4)  

void delay(volatile int time)  

{  

    for(; time > 0; time-- )  

        ;  

}  

int main(void)  

{  

    unsigned long tmp = 0;  

    int i = 0;  

/* 

 * GPM4_0-GPM4_3 设置为输出功能 

 */  

    tmp = GPM4CON;  

    tmp &= ~0xffff;  

    tmp |= 0x1111;  

    GPM4CON = tmp;   

/* 

 * 实现流水灯 

 */  

    system_clock_init();  

    while(1)  

    {  

        GPM4DAT = i;  

        if (++i == 16)  

            i = 0;  

        delay(9999999);  

    }  

    return 0;  

}  


clock_init.c


// CMU_CPU  

#define CLK_SRC_CPU (*(volatile unsigned int *)0x10044200)  

#define CLK_DIV_CPU0 (*(volatile unsigned int *)0x10044500)  

#define CLK_DIV_CPU1 (*(volatile unsigned int *)0x10044504)  

// CMU_DMC  

#define CLK_SRC_DMC (*(volatile unsigned int *)0x10040200)  

#define CLK_DIV_DMC0 (*(volatile unsigned int *)0x10040500)  

#define CLK_DIV_DMC1 (*(volatile unsigned int *)0x10040504)  

// CMU_TOP  

#define CLK_SRC_TOP0 (*(volatile unsigned int *)0x1003C210)  

#define CLK_SRC_TOP1 (*(volatile unsigned int *)0x1003C214)  

#define CLK_DIV_TOP (*(volatile unsigned int *)0x1003C510)  

// CMU_LEFTBUS  

#define CLK_SRC_LEFTBUS (*(volatile unsigned int *)0x10034200)  

#define CLK_DIV_LEFTBUS (*(volatile unsigned int *)0x10034500)  

// CMU_RIGHTBUS  

#define CLK_SRC_RIGHTBUS (*(volatile unsigned int *)0x10038200)  

#define CLK_DIV_RIGHTBUS (*(volatile unsigned int *)0x10038500)  

// locktime  

  

#define APLL_LOCK (*(volatile unsigned int *)0x10044000)  

#define MPLL_LOCK (*(volatile unsigned int *)0x10044008)  

#define EPLL_LOCK (*(volatile unsigned int *)0x1003C010)  

#define VPLL_LOCK (*(volatile unsigned int *)0x1003C020)  

  

// APLL  

#define APLL_CON1 (*(volatile unsigned int *)0x10044104)  

#define APLL_CON0 (*(volatile unsigned int *)0x10044100)  

  

// MPLL  

#define MPLL_CON0 (*(volatile unsigned int *)0x10040108)  

#define MPLL_CON1 (*(volatile unsigned int *)0x1004010c)  

  

// EPLL  

#define EPLL_CON2 (*(volatile unsigned int *)0x1003C118)  

#define EPLL_CON1 (*(volatile unsigned int *)0x1003C114)  

#define EPLL_CON0 (*(volatile unsigned int *)0x1003C110)  

  

// VPLL  

#define VPLL_CON0 (*(volatile unsigned int *)0x1003C120)  

#define VPLL_CON1 (*(volatile unsigned int *)0x1003C124)  

#define VPLL_CON2 (*(volatile unsigned int *)0x1003C128)  


/* 

 * 函数名: 

 * system_clock_init 

 * 功能: 初始化4412的系统时钟 

 */  

void system_clock_init(void)  

{  

 /* IROM或BL1设置了APLL, 

  * 本程序设置不启动APLL, 

  * 而是使在晶振时钟, 以体验一下LED闪灯变慢 

  */  

   CLK_SRC_CPU = 0x0;  

}  


Makfile


objs := start.o led.o clock_init.o  

led.bin : $(objs)  

    arm-linux-ld -Tled.lds -N -o led.elf $^  

    arm-linux-objcopy -O binary -S led.elf $@  

    arm-linux-objdump -D -m arm led.elf > led.dis  

%.o:%.c  

    arm-linux-gcc -Wall -marm -c -O2 -o $@ $<  

%.o:%.S  

    arm-linux-gcc -Wall -marm -c -O2 -o $@ $  

clean:  

    rm -f *.dis *.bin *.elf *.o  

led.lds


SECTIONS {    

. = 0x02023400;    

.text : { *(.text) }    

.rodata ALIGN(4) : {*(.rodata*)}    

.data ALIGN(4) : { *(.data*) }    

.bss ALIGN(4) : { *(.bss) *(COMMON) }    

}    


实验现象应该是相比 led.c 中不加 system_clock_init() 的时候,LED闪烁的非常缓慢。

第二个实验:


将 ARMCLK 提升到1400MHz ,观察LED闪烁是否变快。只更改 clock_init.c


// CMU_CPU  

#define CLK_SRC_CPU (*(volatile unsigned int *)0x10044200)  

#define CLK_DIV_CPU0 (*(volatile unsigned int *)0x10044500)  

#define CLK_DIV_CPU1 (*(volatile unsigned int *)0x10044504)  

  

// CMU_DMC  

#define CLK_SRC_DMC (*(volatile unsigned int *)0x10040200)  

#define CLK_DIV_DMC0 (*(volatile unsigned int *)0x10040500)  

#define CLK_DIV_DMC1 (*(volatile unsigned int *)0x10040504)  

  

// CMU_TOP  

#define CLK_SRC_TOP0 (*(volatile unsigned int *)0x1003C210)  

#define CLK_SRC_TOP1 (*(volatile unsigned int *)0x1003C214)  

#define CLK_DIV_TOP (*(volatile unsigned int *)0x1003C510)  

  

// CMU_LEFTBUS  

#define CLK_SRC_LEFTBUS (*(volatile unsigned int *)0x10034200)  

#define CLK_DIV_LEFTBUS (*(volatile unsigned int *)0x10034500)  

  

// CMU_RIGHTBUS  

#define CLK_SRC_RIGHTBUS (*(volatile unsigned int *)0x10038200)  

#define CLK_DIV_RIGHTBUS (*(volatile unsigned int *)0x10038500)  

  

// locktime  

#define APLL_LOCK (*(volatile unsigned int *)0x10044000)  

#define MPLL_LOCK (*(volatile unsigned int *)0x10044008)  

#define EPLL_LOCK (*(volatile unsigned int *)0x1003C010)  

#define VPLL_LOCK (*(volatile unsigned int *)0x1003C020)  

  

// APLL  

#define APLL_CON1 (*(volatile unsigned int *)0x10044104)  

#define APLL_CON0 (*(volatile unsigned int *)0x10044100)  

  

// MPLL  

#define MPLL_CON0 (*(volatile unsigned int *)0x10040108)  

#define MPLL_CON1 (*(volatile unsigned int *)0x1004010c)  

  

// EPLL  

#define EPLL_CON2 (*(volatile unsigned int *)0x1003C118)  

#define EPLL_CON1 (*(volatile unsigned int *)0x1003C114)  

#define EPLL_CON0 (*(volatile unsigned int *)0x1003C110)  

  

// VPLL  

#define VPLL_CON0 (*(volatile unsigned int *)0x1003C120)  

#define VPLL_CON1 (*(volatile unsigned int *)0x1003C124)  

#define VPLL_CON2 (*(volatile unsigned int *)0x1003C128)  


/* 

 * 函数名: 

 * system_clock_init 

 * 功能: 初始化4412的系统时钟 

 */  

  

void system_clock_init(void)  

{  

    /* 1. 在设置APLL之前, 先设置时钟源为晶振 */  

    CLK_SRC_CPU = 0x0;  

    /* 2. 设置APLL */  

    /* 2.1 设置锁定时间: APLL_CON0中PDIV=3, 所以APLL_LOCK = 270x3 */  

    APLL_LOCK = 270 * 3;  

    /* 2.2 设置分频参数 */  

    CLK_DIV_CPU0 = 0x00160760;  

    CLK_DIV_CPU1 = 0x00000106;  

  

    /* 2.3 设置控制参数并使能PLL */  

    /* 默认值 */  

    APLL_CON1 = 0x00803800;  

    /* 

     * 设置APLL的M,P,S值, APLL输出 = 0xAF x 24MHz / (3 x 2 ^ 0) = 1.4GHz 

     * 使能APLL 

     */  

    APLL_CON0 = (1<<31 | 0xAF<<16 | 3<<8 | 0x0);  

    /* 3. 设置MUX, 使用APLL的输出 */  

    CLK_SRC_CPU = 0x01000001;  

}  


一开始,测试时,我试图只把ARMCLK提升到1400MHz,其余寄存器都使用默认值,但是发现LED闪烁几下程序就会跑飞,根据下图采用默认值的情况下大部分DIV分频系数都是1,因此比如ACLK_COREM0等也都会是 1400MHz,但是它们是无法承受如此高的工作频率。

三星给出了 high-performance 状态下的频率值,我将 cpu 部分的频率配置到该表推荐值以下,程序就正常运行了。

关键字:tiny4412  时钟测试 引用地址:tiny4412 时钟测试

上一篇:tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及中断
下一篇:Tiny4412裸机程序,时钟操作

推荐阅读最新更新时间:2024-11-19 13:05

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 摘要 上一篇 博文在tiny4412上移植了MMA7660驱动程序,使用的是exynos4
[单片机]
基于<font color='red'>tiny4412</font>的Linux内核移植 -- MMA7660驱动移植(九-2)

推荐帖子

菜鸟向各位请教,bsp编译过程
dirmakefiledef和sources文件在编译时各起什么作用?菜鸟向各位请教,bsp编译过程应该先google一下,有什么不懂再问。。老帖也有很多这方面的内容
ling281021799 嵌入式系统
通用TFT液晶驱动!!!!
我们公司开发的m600驱动模组能驱动1024*768以下不同厂家不同分辨率的TFT。需要资料的可以跟我联系。boy_201a@163.com13501104029qq781558807张凯通用TFT液晶驱动!!!!顶~~~~怎么无人问津呢~~?我公司有1.3-15寸成套液晶终端产品。使用TFT通用真彩液晶驱动,特点如下1、使用M600开发真彩色显示产品,投入最低、开发进度最快-真正的低成本---零售价格人民币298.00元;2、采用串口(RS232/TTL)方式,
2019230 嵌入式系统
Helper2416-46——QT入门应用——控制LED
本帖最后由yuanlai2010于2014-9-2219:39编辑 QT入门应用——控制LED实现功能:简单Qt4应用程序控制LED的亮灭开发环境:fedora20+QtCreate+Qt4.8.6想不到的是到了最后一个学期课程还是那么多,所以用来学习这些东西的时间不多,进度有些慢,今天总算是把这个小应用做出来了。现在和大家分享以下!在开发板上的截图是这个样子,搞不懂阿!代码:
yuanlai2010 嵌入式系统
sockit加载wifi模块显示没有权限
请问一下,我使用使用开发板添加wifi模时,模块驱动加载成功,但是当我使用#ifconfigwlan0up时显示SIOCSIFFLAGS:Operationnotpermitted错误,请问怎么解决。求指导。Larkboard就能使用wifi,不知道是不是哪边设置出了问题。sockit加载wifi模块显示没有权限
AD_DA Altera SoC
放大器采用+12V单电源供电,所需其它电源电压自行转换
大家对这句话怎么理解,VCA821还能用吗放大器采用+12V单电源供电,所需其它电源电压自行转换以6V为参考电压,+6和-6就出来了loadinghl发表于2015-8-1216:28以6V为参考电压,+6和-6就出来了 能不能将12转换为正负5V供电呢看看Figure67就知道821不能用了千雪尘埃发表于2015-8-1221:02看看Figure67就知道821不能用了 何以见得啊,基础部分还是可以完成的,,你们电源的具体方案是怎样
sunshine_chen 电子竞赛
好心人发我imgdecmp.dll和ril.dll库,急!
看着自己PPC中有这样的dll,但折腾了半天也没取出来,提取rom和解压rom总出错。比较急,好心人有的话发给我一下,不胜感激!alex@su-fun.com好心人发我imgdecmp.dll和ril.dll库,急!我也要啊xingke@gmail.com晕死,这么老的帖子还活着~我有了,我记得的话到时发给你
magicflyinsky 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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