系統時鐘學習筆記

2021-09-01 17:16:10 字數 3095 閱讀 6065

12m晶振

----->pll------>cpu

mux多路選擇器

div分頻器

示例**如下:

彙編實現

.globlclock_init

clock_init:

/*1.設定

lock_time*/

ldrr0,=0x7e00f000/*apll_lock*/

ldrr1,=0x0000ffff

strr1,[r0]

strr1,[r0,#4] /*mpll_lock*/

strr1,[r0,#8] /*epll_lock*/

#defineothers 0x7e00f900

@setasyncmode/*當

cpu時鐘

!=hclk

時,要設為非同步模式*/

ldrr0,=others

ldrr1,[r0]

bicr1,#0xc0

strr1,[r0]

loop1: /*等待,直到

cpu進入非同步模式*/

ldrr0,=others

ldrr1,[r0]

andr1,#0xf00

cmpr1,#0

bneloop1

/*sync667*/

/*misc_con[19]=0*/

#definearm_ratio0/*armclk=doutapll/(arm_ratio+1)*/

#definehclkx2_ratio1/*hclkx2=hclkx2in/(hclkx2_ratio+1)*/

#definehclk_ratio1/*hclk=hclkx2/(hclk_ratio+1)*/

#definepclk_ratio3/*pclk=hclkx2/(pclk_ratio+1)*/

#definempll_ratio0/*doutmpll=moutmpll/(mpll_ratio+1)*/

ldrr0,=0x7e00f020/*clk_div0*/

ldrr1,=(arm_ratio)|(mpll_ratio<<4)|(hclk_ratio<<8)|(hclkx2_ratio<<9)|(pclk_ratio<<12)

strr1,[r0]

/*2.配置時鐘*/

/*2.1配置

apll*/

/*2.1.1設定

apll

*2.1.2muxapll

*2.1.3sync667

*2.1.4divapll

#defineapll_con_val((1<<31)|(266<<16)|(3<<8)|(1))

ldrr0,=0x7e00f00c

ldrr1,=apll_con_val

strr1,[r0] /*apll_con,foutapl=mdiv*fin/(pdiv*2^sdiv)=266*12/(3*2^1)=532mhz*/

/*2.2配置

mpll*/

/*2.2.1設定

mpll

*2.2.2muxmpll

*2.2.3syncmux

*2.2.4sync667

*2.2.5hclkx2_ratio

*2.2.6pclk_ratio

#definempll_con_val((1<<31)|(266<<16)|(3<<8)|(1))

ldrr0,=0x7e00f010

ldrr1,=mpll_con_val

strr1,[r0] /*mpll_con,foutmpl=mdiv*fin/(pdiv*2^sdiv)=266*12/(3*2^1)=532mhz*/

/*3.選擇

pll的輸出作為時鐘源*/

ldrr0,=0x7e00f01c

ldrr1,=0x03

strr1,[r0]

movpc,lr

c實現

#defineapll_lock(*((volatileunsignedlong*)0x7e00f000))

#definempll_lock(*((volatileunsignedlong*)0x7e00f004))

#defineepll_lock(*((volatileunsignedlong*)0x7e00f008))

#defineothers (*((volatileunsignedlong*)0x7e00f900))

#defineclk_div0(*((volatileunsignedlong*)0x7e00f020))

#definearm_ratio 0

#definehclkx2_ratio 4

#definehclk_ratio 0

#definepclk_ratio 1

#definempll_ratio 0

#defineapll_con(*((volatileunsignedlong*)0x7e00f00c))

#defineapll_con_val((1<<31)|(250<<16)|(3<<8)|(1))

#definempll_con(*((volatileunsignedlong*)0x7e00f010))

#definempll_con_val((1<<31)|(250<<16)|(3<<8)|(1))

#defineclk_src(*((volatileunsignedlong*)0x7e00f01c))

voidclock_init(void){

apll_lock=0xffff;

mpll_lock=0xffff;

epll_lock=0xffff;

/*當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;

STM32 學習筆記(4)系統時鐘

cortex m3中,有個systick 系統時鐘,systick 是cm3核心的外設,相關定義在core cm3.h中。系統定時器內嵌在nvic中,是24位的向下遞減的計數器,每記一次數的時間是1 sysclk。一般設定sysclk 72m。而系統時鐘一般用於作業系統產生時基。與systick相關...

STM學習 時鐘系統講解

主要內容 rcc apb2periphclockcmd rcc apb2periph gpioe rcc apb2periph gpioa,enable 使能pb,pe埠時鐘 void rcc apb2periphclockcmd uint32 t rcc apb2periph,functional...

STM32學習 時鐘系統

眾所周知,時鐘系統是 cpu 的脈搏,就像人的心跳一樣。所以時鐘系統的重要性就不言而 喻了。stm32 的時鐘系統 stm32 的時鐘系統比較複雜,不像簡單的 51 微控制器乙個系統時鐘就可以解決一切。於 是有人要問,採用乙個系統時鐘不是很簡單嗎?為什麼 stm32 要有多個時鐘源呢?因為首先 st...