參考資料:
http://nano.lichee.pro/
https://mangopi.org/mangopi_r
VCC_CORE電壓足夠,才可以做超頻的動作,VCC_CORE是由EA3036供電,目前是1.2V
電壓計算方式如下,從公式可以得知,只要把R13改成75K,輸出電壓就可以變成 0.6 * (150K / 75K) + 0.6 = 1.8V
絲印位置
開發板
焊接
確定電壓是1.8V
CPU速度計算公式
PLL = (24MHz*N*K)/(M*P) N = 13 K = 4 M = 1 P = 1 PLL = (24MHz*13*4)/(1*1) = 1248MHz
main.s
.global _start .equiv CCU_BASE, 0x01c20000 .equiv GPIO_BASE, 0x01c20800 .equiv PLL_CPU_CTRL_REG, 0x0000 .equiv PLL_PERIPH_CTRL_REG, 0x0028 .equiv AHB_APB_HCLKC_CFG_REG, 0x0054 .equiv BUS_CLK_GATING_REG2, 0x0068 .equiv BUS_SOFT_RST_REG2, 0x02d0 .equiv PD, (0x24 * 3) .equiv PORT_CFG0, 0x00 .equiv PORT_CFG1, 0x04 .equiv PORT_CFG2, 0x08 .equiv PORT_DATA, 0x10 .equiv PORT_PUL0, 0x1c .equiv PORT_PUL1, 0x20 .arm .text _start: .long 0xea000016 .byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0' .long 0, __spl_size .byte 'S', 'P', 'L', 2 .long 0, 0 .long 0, 0, 0, 0, 0, 0, 0, 0 .long 0, 0, 0, 0, 0, 0, 0, 0 _vector: b reset b . b . b . b . b . b . b . reset: ldr r4, =CCU_BASE ldr r1, =(1 << 31) | (12 << 8) | (3 << 4) str r1, [r4, #PLL_CPU_CTRL_REG] 0: ldr r1, [r4, #PLL_CPU_CTRL_REG] tst r1, #(1 << 28) beq 0b ldr r1, =(1 << 31) | (1 << 18) | (31 << 8) str r1, [r4, #PLL_PERIPH_CTRL_REG] 0: ldr r1, [r4, #PLL_PERIPH_CTRL_REG] tst r1, #(1 << 28) beq 0b ldr r1, =(3 << 12) str r1, [r4, #AHB_APB_HCLKC_CFG_REG] ldr r4, =GPIO_BASE mov r1, #1 str r1, [r4, #(PD + PORT_CFG0)] 0: eor r1, #1 str r1, [r4, #(PD + PORT_DATA)] b 0b .end
接著測量一下I/O速度
I/O速度為2.8MHz,不過CPU速度已經可以跑到1.2GHz,如果電壓再繼續增加,司徒相信CPU還可以操到更高,因為官方說最高可以到2.6GHz
既然官方說最高可以超頻到2.6GHz,那最高到底可以超到多少呢?基於這個好奇心,司徒決定研究一下超頻,於是找來幾塊開發板
首先測試的開發板
由於司徒並沒有太多精密電阻做分壓測試,因此,使用簡易的電源供應器
果然不是精準的電源供應器
遺憾的是,司徒手上剛好沒有溫度測量器,因此,只好用手測試
固定輸出1.2V
接著,司徒開始從1.8V測試
啟動後,吃掉0.05V
確定LED可以閃爍,代表此時的CPU頻率是可以工作的
測試程式
.global _start .equiv CCU_BASE, 0x01c20000 .equiv GPIO_BASE, 0x01c20800 .equiv PLL_CPU_CTRL_REG, 0x0000 .equiv PLL_PERIPH_CTRL_REG, 0x0028 .equiv AHB_APB_HCLKC_CFG_REG, 0x0054 .equiv BUS_CLK_GATING_REG2, 0x0068 .equiv BUS_SOFT_RST_REG2, 0x02d0 .equiv PA, (0x24 * 0) .equiv PORT_CFG0, 0x00 .equiv PORT_DATA, 0x10 .arm .text _start: .long 0xea000016 .byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0' .long 0, __spl_size .byte 'S', 'P', 'L', 2 .long 0, 0 .long 0, 0, 0, 0, 0, 0, 0, 0 .long 0, 0, 0, 0, 0, 0, 0, 0 _vector: b reset b . b . b . b . b . b . b . reset: ldr r4, =CCU_BASE ldr r1, =(1 << 31) | (20 << 8) | (3 << 4) str r1, [r4, #PLL_CPU_CTRL_REG] 0: ldr r1, [r4, #PLL_CPU_CTRL_REG] tst r1, #(1 << 28) beq 0b ldr r0, =GPIO_BASE ldr r1, =0x1000 str r1, [r0, #(PA + PORT_CFG0)] 0: eor r1, #8 str r1, [r0, #(PA + PORT_DATA)] ldr r2, =1000000 1: subs r2, #1 bne 1b b 0b .end
P.S. 在最早的測試,司徒忘記N最大只有到31,因此,在此次測試,司徒先把K設定成3,然後依序調整N,上面的程式:24MHz * N * K = 24MHz * 21 * 4 = 2016MHz
接著就開始慢慢調整電壓測試,找出該CPU頻率下,最低可以接受的電壓
持續量測溫度
最後,司徒測試發現,電壓2.4V時,CPU可以超頻到2016MHz,此時CPU還可以正常運作,不過已經呈現發燙的狀態,可以加上散熱片使用,而電壓再往上增加時,CPU已經無法運作
因此,司徒整理一下F1C100S超頻表格
CORE電壓 | CPU頻率 | 人體溫度量測 | CPU設定 |
---|---|---|---|
1.20v | 480MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (4 << 8) | (3 << 4) |
1.20v | 576MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (5 << 8) | (3 << 4) |
1.20v | 672MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (6 << 8) | (3 << 4) |
1.20v | 768MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (7 << 8) | (3 << 4) |
1.20v | 864MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (8 << 8) | (3 << 4) |
1.20v | 960MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (9 << 8) | (3 << 4) |
1.20v | 1056MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (10 << 8) | (3 << 4) |
1.30v | 1152MHz | 正常 | PLL_CPU_CTRL_REG = (1 << 31) | (11 << 8) | (3 << 4) |
1.35v | 1248MHz | 微微溫 | PLL_CPU_CTRL_REG = (1 << 31) | (12 << 8) | (3 << 4) |
1.45v | 1344MHz | 微微溫 | PLL_CPU_CTRL_REG = (1 << 31) | (13 << 8) | (3 << 4) |
1.55v | 1440MHz | 微微溫 | PLL_CPU_CTRL_REG = (1 << 31) | (14 << 8) | (3 << 4) |
1.65v | 1536MHz | 微微溫 | PLL_CPU_CTRL_REG = (1 << 31) | (15 << 8) | (3 << 4) |
1.75v | 1632MHz | 微微溫 | PLL_CPU_CTRL_REG = (1 << 31) | (16 << 8) | (3 << 4) |
1.95v | 1728MHz | 微微溫 | PLL_CPU_CTRL_REG = (1 << 31) | (17 << 8) | (3 << 4) |
2.00v | 1824MHz | 微溫 | PLL_CPU_CTRL_REG = (1 << 31) | (18 << 8) | (3 << 4) |
2.20v | 1920MHz | 溫~燙 | PLL_CPU_CTRL_REG = (1 << 31) | (19 << 8) | (3 << 4) |
2.40v | 2016MHz | 發燙 | PLL_CPU_CTRL_REG = (1 << 31) | (20 << 8) | (3 << 4) |
最後,四塊開發板依然完好
幸好手指也平安無事
F1C200S在2.0GHz下,I/O速度可以多快呢?答案是7MHz
同場加映,司徒決定測試一下F1C100S超頻的耐久度,於是,司徒找來幾顆精密電阻,0.6 * (464K / 150K) + 0.6 = 2.456V
2.456V,雖然多了0.056V,不過應該差不多,這個電壓是司徒之前測試,F1C100S最大可以承受的電壓
開發板
移除R12、R13
0.6 * (464K / 150K) + 0.6 = 2.456V,司徒焊接一顆LED做測試
司徒這次要換另一根手指測試溫度
避免炸裂,司徒決定使用這個杯子保護
開始測驗,CPU=2016MHz
LED開始閃爍
6秒後,開發板掛掉了,再怎麼連接USB,都無法進入燒錄模式
於是,司徒找來另外的精密電阻,442K電阻配上160K電阻,0.6 * (442K / 160K) + 0.6 = 2.2575V
0.6 * (442K / 160K) + 0.6 = 2.2575V
開始測試
CPU=2016MHz,10秒後掛點,不過插入USB,還是可以進入燒錄模式,因此,電壓2.2575V是不會燒毀F1C100S的保險電壓,而司徒測試CPU=1920MHz
60秒後,果然會燙
司徒臨時找不到散熱片...
那就只好電風扇伺候...
測量溫度,果然還是有點燙,不過,CPU=1920MHz,跑了三分鐘,依然沒有問題,因此,司徒覺得1920MHz,加上散熱片,應該是可以拿來使用的
僅存的開發板
結論:
CPU=2016MHz,需要找出臨界電壓,容易燒毀,不建議使用
CPU=1920MHz,F1C100S加上散熱片,可以跑,不過目前只有測試Toggle I/O