ARM系统时钟初始化

2440时钟体系,12MHz的晶振

6410时钟体系,12MHz的晶振

210时钟体系,24MHz晶振

时钟初始化:1、设置locktime  2、设置分频系数  4、设置CPU到异步工作模式  3、设置fclk

.text
.global _start
_start:
    b reset
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt:.word software_interrupt
_prefetch_abort:.word prefetch_abort
_data_abort:.word data_abort
_not_used:.word not_used
_irq:.word irq
_fiq:.word reset

undefined_instruction:
    nop

software_interrupt:
    nop

prefetch_abort:
    nop

data_abort:
    nop

not_used:
    nop

irq:
    nop

fiq:
    nop

reset:
    bl set_svc
    bl disable_watchdog
    bl disable_interrupt
    bl disable_mmu
    bl clock_init
    bl light_led

set_svc:
    mrs r0, cpsr
    bic r0, r0, #0x1f
    orr r0, r0, #0xd3
    msr cpsr, r0
    mov pc, lr

#define pwTCON 0x53000000
disable_watchdog:
    ldr r0, =pwTCON
    mov r1, #0x0
    str r1, [r0]
    mov pc, lr

disable_interrupt:
    mvn r1, #0x0
    ldr r0, =0x4a000008
    str r1,[r0]
    mov pc, lr    

disable_mmu:
    mcr p15,0,r0,c7,c7,0
    mrc p15,0,r0,c1,c0,0
    bic r0,r0,#0x00000007
    mcr p15,0,r0,c1,c0,0
    mov pc, lr

#define GPBCON 0x56000010
#define GPBDAT 0x56000014
light_led:
    ldr r0, =GPBCON
    ldr r1, =0x15400
    str r1,[r0]

    ldr r0, =GPBDAT
    ldr r1, =0x6bf
    str r1, [r0]
    mov pc, lr

#define CLKDIVN 0x4c000014
#define MPLLCON 0x4c000008
#define MPLL_405MHZ ((127<<12)|(2<<4)|(1<<0))
clock_init:
    ldr r0, =CLKDIVN
    mov r1, #0x5
str r1, [r0]

    mrc p15,0,r0,c1,c0,0
    orr r0,r0,#0xc0000000
    mcr p15,0,r0,c1,c0,0

    ldr r0, =MPLLCON
    ldr r1, =MPLL_405MHZ
    str r1, [r0]

    mov pc, lr

黄色部分就是时钟初始化,中间一段绿色的是HDIVN不是0的时候,CPU要设置成异步模式,看下面这个

但是在6410里面,设置成异步模式看这个寄存器

第7位设置是否为异步模式,所谓代码里要用bic来清除。第六位是设置是否用PLL之后产生的时钟来提供时钟源

就这图中的这个

代码如下

.text
.global _start
_start:
    b reset
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt:.word software_interrupt
_prefetch_abort:.word prefetch_abort
_data_abort:.word data_abort
_not_used:.word not_used
_irq:.word irq
_fiq:.word reset

undefined_instruction:
    nop

software_interrupt:
    nop

prefetch_abort:
    nop

data_abort:
    nop

not_used:
    nop

irq:
    nop

fiq:
    nop

reset:
    bl set_svc
    bl set_peri_port
    bl disable_watchdog
    bl disable_interrupt
    bl disable_mmu
    bl clock_init
    bl light_led

set_svc:
    mrs r0, cpsr
    bic r0, r0, #0x1f
    orr r0, r0, #0xd3
    msr cpsr, r0
    mov pc, lr

set_peri_port:
    ldr r0,=0x70000000
    orr r0,r0,#0x13
    mcr p15,0,r0,c15,c2,4
    mov pc,lr    

#define pwTCON 0x7e004000
disable_watchdog:
    ldr r0, =pwTCON
    mov r1, #0x0
    str r1, [r0]
    mov pc, lr

disable_interrupt:
    mvn r1, #0x0
    ldr r0, =0x71200014
    str r1,[r0]
    mov pc, lr

    ldr r0, =0x71300014
    str r1, [r0]
    mov pc, lr    

disable_mmu:
    mcr p15,0,r0,c7,c7,0
    mrc p15,0,r0,c1,c0,0
    bic r0,r0,#0x00000007
    mcr p15,0,r0,c1,c0,0
    mov pc, lr

#define CLK_DIV0 0X7e00f020
#define OTHERS     0x7e00f900
#define MPLLCON  0x7e00f010
#define APLLCON  0x7e00f0c0
#define CLK_SRC     0x7e00f01c
#define PLL_VAL  ((1<<31)|(266<<16)|(3<<8)|(1<<0))
#define DIV_VAL     ((0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12))
clock_init:
    ldr r0, =CLK_DIV0
    ldr r1, =DIV_VAL
    str r1, [r0]

    ldr r0, = OTHERS
    ldr r1, [r0]
    bic r1, r1, #0xc0
    str r1, [r0]

    ldr r0, =MPLLCON
    ldr r1, =PLL_VAL
    str r1,[r0]

    ldr r0, =CLK_SRC
    mov r1, #0x3
    str r1, [r0]
    mov pc, lr

#define GPBCON 0x7f008820
#define GPBDAT 0x7f008804
light_led:
    ldr r0, =GPBCON
    ldr r1, =0x1111
    str r1,[r0]

    ldr r0, =GPBDAT
    ldr r1, =0xe
    str r1, [r0]
    mov pc, lr
    

黄色部分就是设置时钟的,能看懂手册,就能写代码。

原文地址:https://www.cnblogs.com/sanshijvshi/p/8353657.html

时间: 2024-07-29 20:42:14

ARM系统时钟初始化的相关文章

中颖系统时钟初始化

/*1:中颖79f系列有4中振荡类型,4个震荡IO,可以从4中振荡类型中产生1种或者2 中时钟. 2:4种振荡类型:32.768KHZ,晶振谐振器,陶瓷谐振器,内服RC(12M/128K/12.3M )振荡器. 3:编程时,振荡类型由编译选项选择确定. 4:系统时钟控制器 CLKCON 具体资料可看datasheet 5:具体操作如下:*/ //====时钟分频===== #define CLK_DIV1 0X00 #define CLK_DIV2 0X01 #define CLK_DIV4 0

LPC1788系统时钟初始化

#ifndef __SYS_H_ #define __SYS_H_ #include "common.h" #define SystemCoreClock  120000000  //cpu时钟频率,计算时有用 #define ApbClock        120000000   //120M #define EmcClock        60000000    //60M #define UsbClock        48000000    //48M void SystemI

28.时钟初始化

28.时钟初始化 ARM系统时钟初始化: 这就需要知道什么是时钟脉冲信号,什么是时钟频率,什么是时钟源. 时钟脉冲信号: 时钟脉冲信号:按一定的电压幅度,一定的时间间隔连续发出的脉冲信号.时钟脉冲信号是时序逻辑的基础,它用于决定逻辑单元中的状态何时更新.数字芯片中众多的晶体管都工作在开关状态,它们的导通和关断动作无不是按照时钟信号的节奏进行的 时钟脉冲图解: 1.2时钟脉冲频率: 时钟脉冲频率:就是在单位时间,如1秒,内产生的时钟脉冲个数. 1.3信号产生: 如何产生时钟信号:1.晶振2.锁相环

8.时钟初始化

ARM系统时钟初始化: ????这就需要知道什么是时钟脉冲信号,什么是时钟频率,什么是时钟源. 时钟脉冲信号: 时钟脉冲信号:按一定的电压幅度,一定的时间间隔连续发出的脉冲信号.时钟脉冲信号是时序逻辑的基础,它用于决定逻辑单元中的状态何时更新.数字芯片中众多的晶体管都工作在开关状态,它们的导通和关断动作无不是按照时钟信号的节奏进行的 时钟脉冲图解: ? ? ? ? ? ????1.2时钟脉冲频率: 时钟脉冲频率:就是在单位时间,如1秒,内产生的时钟脉冲个数. ????1.3信号产生: 如何产生时

X-005 FriendlyARM tiny4412 uboot移植之时钟初始化

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  开发环境:

【转】OAL之系统时钟

1. 系统时钟与内核的关系 WinCE 5.0采用基于时间片的抢占式多任务的实时内核,而且每个线程可以根据需要自行设定线程时间片的大小(参考CeSetThreadQuantum函数),默认为100ms,这个默认值dwDefaultThreadQuantum也可以在OEMInit()时自行设定.在内核源文件中,与单词Quantum有关的变量名一般是指时间片,WinCE内核定义了几个与时钟有关的全局变量,他们也是内核与OAL接口的一部分: 1) dwReschedTime,这个变量在内核的调度程序中

6.SysTick系统时钟滴答实验(stm32中断入门)

系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难度并不高,但是理解起来还是比较复杂的,我会在本文中从实际应用出发去说明,当然最好去仔细研读宋岩翻译的<Cortex-M3权威指南>第八章,注意这不是一本教你如何编写STM32代码的工具书,而是阐述Cortex-M3内核原理的参考书,十分值得阅读. SysTick系统时钟的核心有两个,外设初始化和S

Zephyr学习(四)系统时钟

每一个支持多进程(线程)的系统都会有一个滴答时钟(系统时钟),这个时钟就好比系统的“心脏”,线程的休眠(延时)和时间片轮转调度都需要用到它. Cortex-M系列的内核都有一个systick时钟,这个时钟就是设计用来支持操作系统的,是一个24位的自动重装载向下计数器,中断入口就位于中断向量表里面,定义在zephyr-zephyr-v1.13.0\arch\arm\core\cortex_m\vector_table.S: 1 SECTION_SUBSEC_FUNC(exc_vector_tabl

认识STM32的系统时钟

STM32共有五个时钟源,分别是: HSI是高速内部时钟.RC振荡器,频率为8MHz: HSE是高速外部时钟,频率范围为4~6MHz; (可接石英/陶瓷谐振器或者接外部时钟源) LSI是低速内部时钟,频率40kHz; (独立看门狗时钟源.可作RTC时钟源) LSE是低速外部时钟,频率为32.768kHz石英晶体; (主要RTC时钟源) PLL是锁相环倍频输出,频率可选择为HSI/2.HSE或者HSE/2.倍频可选择2~16倍,但其输出频率最大不超过72MHz: 此处重点介绍系统时钟,一般其他所有