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...