fe310: increase CPU frequency from 16MHz to 320MHz

This chip can run so much faster! Let's update the default frequency.

Also, change the UART implementation to be more fexible regarding the
clock frequency.
Этот коммит содержится в:
Ayke van Laethem 2021-10-20 02:14:49 +02:00 коммит произвёл Ron Evans
родитель a5d905f19b
коммит 3f89fa0bee
2 изменённых файлов: 18 добавлений и 10 удалений

Просмотреть файл

@ -9,7 +9,7 @@ import (
) )
func CPUFrequency() uint32 { func CPUFrequency() uint32 {
return 16000000 return 320000000 // 320MHz
} }
const ( const (
@ -61,9 +61,17 @@ var (
) )
func (uart *UART) Configure(config UARTConfig) { func (uart *UART) Configure(config UARTConfig) {
// Assuming a 16Mhz Crystal (which is Y1 on the HiFive1), the divisor for a if config.BaudRate == 0 {
// 115200 baud rate is 138. config.BaudRate = 115200
sifive.UART0.DIV.Set(138) }
// The divisor is:
// fbaud = fin / (div + 1)
// Restating to get the divisor:
// div = fin / fbaud - 1
// But we're using integers, so we should take care of rounding:
// div = (fin + fbaud/2) / fbaud - 1
divisor := (CPUFrequency()+config.BaudRate/2)/config.BaudRate - 1
sifive.UART0.DIV.Set(divisor)
sifive.UART0.TXCTRL.Set(sifive.UART_TXCTRL_ENABLE) sifive.UART0.TXCTRL.Set(sifive.UART_TXCTRL_ENABLE)
sifive.UART0.RXCTRL.Set(sifive.UART_RXCTRL_ENABLE) sifive.UART0.RXCTRL.Set(sifive.UART_RXCTRL_ENABLE)
sifive.UART0.IE.Set(sifive.UART_IE_RXWM) // enable the receive interrupt (only) sifive.UART0.IE.Set(sifive.UART_IE_RXWM) // enable the receive interrupt (only)

Просмотреть файл

@ -79,12 +79,12 @@ func handleInterrupt() {
// initPeripherals configures periperhals the way the runtime expects them. // initPeripherals configures periperhals the way the runtime expects them.
func initPeripherals() { func initPeripherals() {
// Make sure the HFROSC is on // Configure PLL to output 320MHz.
sifive.PRCI.HFROSCCFG.SetBits(sifive.PRCI_HFROSCCFG_ENABLE) // R=2: divide 16MHz to 8MHz
// F=80: multiply 8MHz by 80 to get 640MHz (80/2-1=39)
// Run off 16 MHz Crystal for accuracy. // Q=2: divide 640MHz by 2 to get 320MHz
sifive.PRCI.PLLCFG.SetBits(sifive.PRCI_PLLCFG_REFSEL | sifive.PRCI_PLLCFG_BYPASS) // This makes the main CPU run at 320MHz.
sifive.PRCI.PLLCFG.SetBits(sifive.PRCI_PLLCFG_SEL) sifive.PRCI.PLLCFG.Set(sifive.PRCI_PLLCFG_PLLR_R2<<sifive.PRCI_PLLCFG_PLLR_Pos | 39<<sifive.PRCI_PLLCFG_PLLF_Pos | sifive.PRCI_PLLCFG_PLLQ_Q2<<sifive.PRCI_PLLCFG_PLLQ_Pos | sifive.PRCI_PLLCFG_SEL | sifive.PRCI_PLLCFG_REFSEL)
// Turn off HFROSC to save power // Turn off HFROSC to save power
sifive.PRCI.HFROSCCFG.ClearBits(sifive.PRCI_HFROSCCFG_ENABLE) sifive.PRCI.HFROSCCFG.ClearBits(sifive.PRCI_HFROSCCFG_ENABLE)