1:時鐘問題, 以前總是一知半解,這次徹底搞明白了,2440的pll分為兩種,mpll和upll,mpll用來做系統時鐘,upll則是usb時鐘(必須為48m),兩種時鐘的計算方法一樣:
mpll=(m×fosc
×2)÷(p×2^s) 記住是2的s次冪 2410 不必乘2
m=mdiv+8
p=pdiv+2
s=sdiv
upll=(m×fosc
×2)÷(p×2^s)
這裡的m,p,s 分別都在mpllcon 暫存器的[19:12],[9:4],[1:0]或upllcon暫存器的[19:12],[9:4],[1:0]裡進行設定,他們的取值詳見官方的推薦表:
mpllcon和upllcon的值根據上面的兩個公式計算而來,而這兩個暫存器的設定值決定了系統的工作主頻,和usb的主時鐘分頻前的頻率。
如果用到usb或串列埠的話,那就需要小心的設定clkdivn暫存器了,這個暫存器的divn_upll位決定了usb的時鐘,且必須為48m,
例如:你的upll設定為48m時 則不需要分頻,divn_upll位為0就可以了,反之,如果你的upll設定為96m時,為保持usb時鐘為48m,這裡的divn_upll必須設定為1.
hdivn設定則要稍微複雜些,需要根據camdivn[9]來綜合決定,原則是首先確定你想要的hclk頻率,然後再結合系統的頻率限制合理的來設定。
pdivn設定直接決定你的串列埠能否正常工作了,同樣舉個例子:
當前系統的主頻為mpll 為400m ,upll為48m,camdivn[9]位為0,那麼想得到115200的波特率,clkdivn暫存器應該設定為多少?首先可以確定divn_upll位為0,解釋見上面,接下來確定hdivn和pdivn了,s3c24x0的波特率計算公式為
ubrdiv=pclk/(baudrate×16)-1
波特率直接和pclk有關,假設ubrdiv設定為0x1a,則pclk為50m,是pclk的1/8,所以hdivn=2 pdivn=1。
在smdk2410基礎上進行2440的移植時鐘部分要注意兩個地方,第乙個是start.s裡關於時鐘的設定,還有乙個是speed.c裡get_hclk函式和get_pllclk函式。需要你根據相應的時鐘暫存器進行修改。
2440 移植u boot 是串列埠亂碼問題
1.按照韋東山的書移植u boot 到jz2440 2.移植到get hclk get pclk 按照書上所說燒到nor 串列埠就能列印了 3.但是使用的時候一直亂碼 網上查了查也沒解決 4.嘗試重新移植.比較 就是不行,5.又copy補丁檔案的配置還是亂碼,6.考慮是串列埠壞掉?燒寫光碟提供u b...
移植u boot啟動時串列埠出現亂碼
用的是tx2440的板子。u boot 2010.06 speed.c中的get fclk,get pclk等函式都修改好了,可是串列埠一直出現亂碼。檢視mpllcon,clkdivn,暫存器的值都是正確,就是ubrdiv0不正確,源 找了好久都找不到錯來。這問題一直糾纏了好幾天。後來發現是在get...
Arduino 串列埠亂碼解決辦法
最近在做畢設,需要實現兩塊arduino板之間的通訊,兩板晶元都是atmega328p。藍芽模組用的spp ca。第一塊主控制板接藍芽,我需要將手機傳送給藍芽的資料傳送到第二塊板 舵機控制板 這樣我就能實現用手機控制舵機 其實就是機械臂 抓取動作。在第一塊主機板程式裡模擬了兩個軟串列埠,乙個是blu...