简介:

  Tiny6410 时钟逻辑为整个芯片提供了3种时钟分别为FCLK、HCLK、PCLK有三个PLL 分别为APLL、MPLL、EPLL。
    APLL 专用于CPU
    MPLL 供AHB(存储/中断/LCD等控制器)/APB(看门狗、定时器,SD等)总线上的设备使用
    EPLL 供UART,IIC,IIS使用

Tiny6410时钟设置参考图

操作步骤:
第一步:设置锁定时间
  设置好PLL后,时钟从Fin提升到目标频率时需要一定的时间,这段时间称之为锁定时间一般来说只要设置好[X]PLL_LOCK寄存器的默认值就可以了
查看数据手册找到对应的[X]PLL_LOCK的寄存器地址


    REGISTER       ADDRSS      RESET VALUE
    APLL_LOCK     0x7E00_F000   0x0000_FFFF
    MPLL_LOCK    0x7E00_F004   0x0000_FFFF
    EPLL_LOCK     0x7E00_F008   0x0000_FFFF
第二步:设置为异步模式


  Tiny6410硬性规定,用MPLL作为HCLK和PCLK的Source需要设置成异步(ASYNC)模式,若使用APLL则设置为同步(SYNC)模式通过时序电路图可以知道控制同/异步模式的寄存器为OTHERS通过OTHERS寄存器各位的减少可以知道,当OTHERS的bit[7] 为1时表示同步模式,为0时表示异步模式bit[6]位为模式的选择使能。过设置同/异步模式只需要将OTHERS寄存器的地bit[6],bit[7]置1或者置0

第三步:设置分频系数


  FCLK、HCLK、PCLK三者的比例系数是可以改变的通过数据手册可以知道分频相关的就存器是CLK_DIV0地址是0x7E00_F020通过数据手册中给出的时钟设置参考值来设置CLK_DIV0对应的值(详细值见代码)
第四步:设置PLL

  由于在第三步设置中将APLL和MPLL的输出(Fout)都设置成了533MHZ 由上图Fout的公式和TargetFout的参考表可MDIV=226,PDIV=3,SDIV=2

实验现象:led灯跑得更加的快

代码实现:

汇编版:

 //启动的代码 start.S
.global _start
_start:
//把外设的基地址告诉CPU
ldr r0,=0x70000000
orr r0 ,r0, #0x13
mcr p15,,r0,c15,c2, //关看门狗
ldr r0, =0x7E004000
mov r1, #
str r1, [r0] //设置堆栈
ldr sp,=0x0c002000
////cache控制寄存器
ldr r0 =0x72000004
//开启 icaches
#ifdef CONFIG_SYS_ICACHE_OFF
bic r0,r0,#0x00001000
#else
orr r0,r0,#0x00001000
#endif
mcr p15,,r0,c1,c0,
//设置时钟
bl clock_init //调用C函数点灯
bl main halt:
b halt ///////////////////////////
//clock.S
//功能:使用汇编初始化时钟
.global clock_init clock_init:
//1.设置各PLL的LOCK_TIME,使用默认值 ldr r0,=0x7E00F000 //APLL_LOCK 供cpu使用
ldr r1,=0x0000FFFF
str r1,[r0] str r1,[r0,#] //MPLL_CLOCK 供AHB(存储、中断、lcd控制器) APB(看门狗、定时器、SD)总线上的设备使用
str r1,[r0,#] //EPLL 供UART、IIC、IIS使用
//2.设置为异步模式
ldr r0,=0x7E00F900
ldr r1,[r0]
bic r1,r1,#0xc0 //bit[6],bit[7]两位清零
str r1,[r0] loop:
ldr r0,=0x7E00F900
ldr r1,[r0]
and r1,r1,#0xf00
cmp r1,#
bne loop
// 3. 设置分频系数
#define ARM_RATIO 0 // ARMCLK = DOUTAPLL / (ARM_RATIO + 1) = 532/(0+1) = 532 MHz
#define MPLL_RATIO 0 // DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1) = 532/(0+1) = 532 MHz
#define HCLKX2_RATIO 1 // HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 532/(1+1) = 266 MHz
#define HCLK_RATIO 1 // HCLK = HCLKX2 / (HCLK_RATIO + 1) = 266/(1+1) = 133 MHz
#define PCLK_RATIO 3 // PCLK = HCLKX2 / (PCLK_RATIO + 1) = 266/(3+1) = 66.5 MHz ldr r0, =0x7E00F020 //CLK_DIV0
ldr r1, =(ARM_RATIO) | (MPLL_RATIO<<)|(HCLK_RATIO<<)|(HCLKX2_RATIO<<)|(PCLK_RATIO<<)
str r1,[r0] //4.设置PLL,放大时钟
//4.1配置APLL
#define APLL_CON_VAL ((1<<31)|(266<<16)|(3<<8)|(1))
ldr r0,=0x7E00F00C //APLL_CON
ldr r1, = APLL_CON_VAL //FOUT = MDIV * FIN /(PDIV * 2SDIV) = 266*12 /(3*2^1) = 532MHZ
str r1,[r0]
//4.2配置MPLL
#define MPLL_CON_VAL ((1<<31)|(266<<16)|(3<<8)|(1))
ldr r0,=0x7E00F010 //MPLL_CON
ldr r1,=MPLL_CON_VAL //FOUT = MDIV * FIN /(PDIV *2 SDIV) = 266*12 /(3*2^1) = 532MHZ str r1,[r0] #define MPLL_SEL 1
#define APLL_SEL 1 //5.选择APLL作为是时钟源
ldr r0,=0x7E00F00C
ldr r1,=(MPLL_SEL<<) | (APLL_SEL <<)
str r1,[r0] mov pc ,lr ////////////////////////////////////
//Tiny6410Addr.h
#ifndef _Tiny6410Addr_H
#define _Tiny6410Addr_H
//GPK
#define GPKIO_BASE (0x7F008800)
#define rGPKCON0 (*(volatile unsigned*)(GPKIO_BASE+0x00))
#define rGPKDAT (*(volatile unsigned*)(GPKIO_BASE+0x08)) #endif //////////////////////
//test.c
#include "Tiny6410Addr.h"
#define GPK4_OUT (1<<4*4)
#define GPK5_OUT (1<<4*5)
#define GPK6_OUT (1<<4*6)
#define GPK7_OUT (1<<4*7)
//延时函数
void delay()
{
volatile int i = 0x10000;
while (i--);
} int main()
{
unsigned int i = ;
//将GPK4-7设置为输出
rGPKCON0 = GPK4_OUT | GPK5_OUT |GPK6_OUT |GPK7_OUT;
//跑马灯式
while ()
{
rGPKDAT = i;
i++;
if(i == )
i=;
delay();
} return ;
}

汇编 Code

C语言版:

 //启动的代码
.global _start
_start:
//把外设的基地址告诉CPU
ldr r0,=0x70000000
orr r0 ,r0, #0x13
mcr p15,,r0,c15,c2, //关看门狗
ldr r0, =0x7E004000
mov r1, #
str r1, [r0] //设置堆栈
ldr sp,=0x0c002000
////cache控制寄存器
ldr r0 =0x72000004
//开启 icaches
#ifdef CONFIG_SYS_ICACHE_OFF
bic r0,r0,#0x00001000
#else
orr r0,r0,#0x00001000
#endif
mcr p15,,r0,c1,c0,
//设置时钟
bl clock_init //调用C函数点灯
bl main halt:
b halt //////////////////////////
//Tiny6410Addr.h
#ifndef _Tiny6410Addr_H
#define _Tiny6410Addr_H
//GPK
#define GPKIO_BASE (0x7F008800)
#define rGPKCON0 (*((volatile unsigned long*)(GPKIO_BASE+0x00)))
#define rGPKDAT (*((volatile unsigned long*)(GPKIO_BASE+0x08))) //CLOCK
#define APLL_LOCK (*((volatile unsigned long*)0x7E00F000))
#define MPLL_LOCK (*((volatile unsigned lomg*)0x7E00F004))
#define EPLL_LOCK (*((volatile unsigned long*)0x7E00F008))
#define OTHER (*((volatile unsigned long*)0x7E00F900))
#define CLK_DIV0 (*((volatile unsigned long*)0x7E00F020))
#define APLL_CON (*((volatile unsigned long*)0x7E00F00C))
#define MPLL_CON (*((volatile unsigned long*)0x7F00F010))
#define CLK_SRC (*((volatile unsigned long*)0x7E00F01C)) #endif /////////////////////////////////////////////
//clock.c
#include"Tiny6410Addr.h" #define ARM_RATIO 0 // ARMCLK = DOUTAPLL / (ARM_RATIO + 1) = 532/(0+1) = 532 MHz
#define MPLL_RATIO 0 // DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1) = 532/(0+1) = 532 MHz
#define HCLKX2_RATIO 1 // HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 532/(1+1) = 266 MHz
#define HCLK_RATIO 1 // HCLK = HCLKX2 / (HCLK_RATIO + 1) = 266/(1+1) = 133 MHz
#define PCLK_RATIO 3 // PCLK = HCLKX2 / (PCLK_RATIO + 1) = 266/(3+1) = 66.5 MHz #define APLL_CON_VAL ((1<<31)|(226<<16)|(3<<8)|(1))
#define MPLL_CON_VAL ((1<<31)|(226<<16)|(3<<8)|(1)) viod clock_init(void)
{
//设置各PLL的默认值 即锁定时间
APLL_LOCK = 0xFFFF;
MPLL_LOCK = 0xFFFF;
EPLL_LOCK = 0xFFFF; //设置为异步模式
OTHER &= ~0xc0;
while((OTHER & 0xF00) !=); //设置分屏系数
CLK_DIV0 = (ARM_RATIO)|(MPLL_RATIO<<)|(HCLK_RATIO<<)|(HCLKX2_RATIO<<)|(PCLK_RATIO<<); //设置PLL,放大系数
APLL_CON = APLL_CON_VAL;
MPLL_CON = MPLL_CON_VAL; //选择PLL的输出作为时钟源
CLK_SRC= 0x03;
} ////////////////////////////////////////
//Makefile
clock.bin : start.o clock.o main.o
arm-linux-ld -Ttext 0x50000000 -o clock.elf start.o clock.o main.o
arm-linux-objcopy -O binary clock.elf clock.bin
arm-linux-objdump -D clock.elf > clock.dis %.o : %.S
arm-linux-gcc -o $@ $< -c %.o : %.c
arm-linux-gcc -o $@ $< -c clean:
rm *.o *.elf *.bin *.dis

C Code

Tiny64140之初始化时钟的更多相关文章

  1. S5PV210初始化系统时钟

    S5PV210初始化系统时钟 S5PV210时钟体系S5PV210中包含3大类时钟domain,分别是主系统时钟domain (简称MSYS,下面将使用简称来进行相关讲解).显示相关的时钟domain ...

  2. dsPIC33EP 时钟初始化程序

    //文件名p33clk.h #ifndef _P33CLK_H_ #define _P33CLK_H_ //#include "p33clk.h" #define WDT_ENB ...

  3. STM32_3 时钟初始化分析

    在startup文件中,调用了2个函数,一个是System_Init, 另一个是main. System_Init()在system_stm32f10x.c 这个文件中,先看一下时钟树,再分析一下这个 ...

  4. STM32时钟初始化函数SystemInit()详解【转】

    花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出): 使用的是3.5的库,用的是STM32F107VC,开发环境RVM ...

  5. css3clock.js - 一个用CSS3与纯js实现的简单时钟

    前言 项目代码明细可以查看我Github上的源码:https://github.com/nelsonkuang/css3clock.js 实现思路 主要是用CSS3控制时针.分针和秒针旋转:时针每12 ...

  6. 转:Linux内部的时钟处理机制全面剖析

    Linux内部的时钟处理机制全面剖析 在 Linux 操作系统中,很多活动都和时间有关,例如:进程调度和网络处理等等.所以说,了解 Linux 操作系统中的时钟处理机制有助于更好地了解 Linux 操 ...

  7. 硬件初始化,nand flash固化操作,系统启动简单流程

    2015.3.27星期五 晴 链接脚本定义代码的排放顺序 硬件系统初始化:一:arm核初始化:(里面有指令)初始化ARM核的时候需要看arm核的手册指令:1.异常向量(最起码有个复位异常,初始化模式- ...

  8. c8051f320学习,单片机不外乎时钟、IO、串口、USB等外设用法

      时钟 IO(输入.输出,如何配置) IO   数字和模拟资源可以通过25个I/O 引脚(C805 1F3 2 0 ),每个端口引脚都可以被定义为 通用I/O(GPIO)或 0 模拟输入 所有端口I ...

  9. MINIX3 内核时钟分析

    MINIX3 内核时钟分析  4.1 内核时钟概要  先想想为什么 OS 需要时钟?时钟是异步的一个非常重要的标志,设想一下,如 果我们的应用程序需要在多少秒后将触发某个程序或者进程,我们该怎么做到? ...

随机推荐

  1. SVN 在 Xcode中的状态说明

    最近同事总是问我关于SVN状态的问题,‘C’是什么意思啦?‘A’是什么意思啦?等等一系列问题. 为了方便以后查阅,以及新同事的快速融入,特在此记录一下^_^. 当然了大家也可以google一下,一搜一 ...

  2. MVC3升级到MVC4模型验证信息显示为英文问题及解决方案

    最近把项目从mvc3升级到mvc4,部署到服务器上出现了一个小问题,就是在表单里字段验证时,验证显示信息为英文,如下: The field 平均租金 must be a number 而在本地是好的, ...

  3. Arduino 各种模块篇 粉尘传感器 dust sensor 空气质量检测

    Testing a sensor from here. http://www.seeedstudio.com/wiki/Grove_-_Dust_Sensor It's a dust sensor. ...

  4. 分享.net常见的内存泄露及解决方法

    分享.net常见的内存泄露及解决方法 关于内存泄漏的问题,之前也为大家介绍过,比如:<C++中内存泄漏的检测方法介绍>,是关于C++内存泄漏的.今天为大家介绍的是关于.NET内存泄漏的问题 ...

  5. git的初步使用---本地代码库的使用和提交

    git的初步使用---本地代码库的使用和提交 git是一个好东西,但对于新手来说,这个工具并不好使用,因为它里面涉及到很多东西,而这些东西新手一时间是无法理解的.不幸的是,本人就是新手一枚,所以,这里 ...

  6. 纯Java代码 图片压缩

    Java图片压缩代码 package com.img; import java.awt.Image; import java.awt.image.BufferedImage; import java. ...

  7. Python pandas 0.19.1 Intro to Data Structures 数据结构介绍 文档翻译

    官方文档链接http://pandas.pydata.org/pandas-docs/stable/dsintro.html 数据结构介绍 我们将以一个快速的.非全面的pandas的基础数据结构概述来 ...

  8. 本地Eclipse连接HDFS进行简单的文件操作

    昨天总结了一点自己在搭建Hadoop完全分布式环境过程中遇到的几个小问题以及解决方案,今天在搭建成功的环境中进行了简单的文件操作,包括:文件目录的创建.文件的创建.本地文件的上传.文件的重命名.文件的 ...

  9. ubuntu 服务版安装简易说明

    安装基本环境 1.ubuntu 下载 下载地址:http://releases.ubuntu.com/14.04.4/ 2.安装virtualBox 直接在软件管家中下载即可 3.安装ubuntu 注 ...

  10. Andrew Ng机器学习入门——线性回归

    本人从2017年起,开始涉猎机器学习.作为入门,首先学习的是斯坦福大学Andrew Ng(吴恩达)教授的Coursera课程 2 单变量线性回归 线性回归属于监督学习(Supervise Learni ...