59 строки
		
	
	
	
		
			1,7 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			59 строки
		
	
	
	
		
			1,7 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
| // +build stm32f7x2
 | |
| 
 | |
| package machine
 | |
| 
 | |
| // Peripheral abstraction layer for the stm32f407
 | |
| 
 | |
| import (
 | |
| 	"device/stm32"
 | |
| )
 | |
| 
 | |
| func CPUFrequency() uint32 {
 | |
| 	return 216000000
 | |
| }
 | |
| 
 | |
| // Internal use: configured speed of the APB1 and APB2 timers, this should be kept
 | |
| // in sync with any changes to runtime package which configures the oscillators
 | |
| // and clock frequencies
 | |
| const APB1_TIM_FREQ = 54e6  // 54MHz
 | |
| const APB2_TIM_FREQ = 216e6 // 216MHz
 | |
| 
 | |
| //---------- UART related code
 | |
| 
 | |
| // Configure the UART.
 | |
| func (uart *UART) configurePins(config UARTConfig) {
 | |
| 	// enable the alternate functions on the TX and RX pins
 | |
| 	config.TX.ConfigureAltFunc(PinConfig{Mode: PinModeUARTTX}, uart.TxAltFuncSelector)
 | |
| 	config.RX.ConfigureAltFunc(PinConfig{Mode: PinModeUARTRX}, uart.RxAltFuncSelector)
 | |
| }
 | |
| 
 | |
| // UART baudrate calc based on the bus and clockspeed
 | |
| // NOTE: keep this in sync with the runtime/runtime_stm32f7x2.go clock init code
 | |
| func (uart *UART) getBaudRateDivisor(baudRate uint32) uint32 {
 | |
| 	var clock uint32
 | |
| 	switch uart.Bus {
 | |
| 	case stm32.USART1, stm32.USART6:
 | |
| 		clock = CPUFrequency() / 2 // APB2 Frequency
 | |
| 	case stm32.USART2, stm32.USART3, stm32.UART4, stm32.UART5:
 | |
| 		clock = CPUFrequency() / 8 // APB1 Frequency
 | |
| 	}
 | |
| 	return clock / baudRate
 | |
| }
 | |
| 
 | |
| // Register names vary by ST processor, these are for STM F7x2
 | |
| func (uart *UART) setRegisters() {
 | |
| 	uart.rxReg = &uart.Bus.RDR
 | |
| 	uart.txReg = &uart.Bus.TDR
 | |
| 	uart.statusReg = &uart.Bus.ISR
 | |
| 	uart.txEmptyFlag = stm32.USART_ISR_TXE
 | |
| }
 | |
| 
 | |
| //---------- I2C related code
 | |
| 
 | |
| // Gets the value for TIMINGR register
 | |
| func (i2c *I2C) getFreqRange() uint32 {
 | |
| 	// This is a 'magic' value calculated by STM32CubeMX
 | |
| 	// for 27MHz PCLK1 (216MHz CPU Freq / 8).
 | |
| 	// TODO: Do calculations based on PCLK1
 | |
| 	return 0x00606A9B
 | |
| }
 | 
