bluepill: GPIO PinInputPullup / PinInputPulldown
Other chips support explicit control of pull-up vs pull-down for GPIO input. Support that with bluepill also. PinInputPullUpDown is maintained for back-compat. It is implicit pull-down.
Этот коммит содержится в:
родитель
d62a9e24e5
коммит
c017ed2242
1 изменённых файлов: 56 добавлений и 0 удалений
|
@ -37,6 +37,11 @@ const (
|
||||||
PinOutputModeGPOpenDrain PinMode = 4 // Output mode general purpose open drain
|
PinOutputModeGPOpenDrain PinMode = 4 // Output mode general purpose open drain
|
||||||
PinOutputModeAltPushPull PinMode = 8 // Output mode alt. purpose push/pull
|
PinOutputModeAltPushPull PinMode = 8 // Output mode alt. purpose push/pull
|
||||||
PinOutputModeAltOpenDrain PinMode = 12 // Output mode alt. purpose open drain
|
PinOutputModeAltOpenDrain PinMode = 12 // Output mode alt. purpose open drain
|
||||||
|
|
||||||
|
// Pull-up vs Pull down is not part of the CNF0 / CNF1 bits, but is
|
||||||
|
// controlled by PxODR. Encoded using the 'spare' bit 5.
|
||||||
|
PinInputPulldown PinMode = PinInputModePullUpDown
|
||||||
|
PinInputPullup PinMode = PinInputModePullUpDown | 0x10
|
||||||
)
|
)
|
||||||
|
|
||||||
// Pin constants for all stm32f103 package sizes
|
// Pin constants for all stm32f103 package sizes
|
||||||
|
@ -157,6 +162,16 @@ func (p Pin) Configure(config PinConfig) {
|
||||||
} else {
|
} else {
|
||||||
port.CRH.ReplaceBits(uint32(config.Mode), 0xf, pos)
|
port.CRH.ReplaceBits(uint32(config.Mode), 0xf, pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If configured for input pull-up or pull-down, set ODR
|
||||||
|
// for desired pull-up or pull-down.
|
||||||
|
if (config.Mode & 0xf) == PinInputModePullUpDown {
|
||||||
|
var pullup uint32
|
||||||
|
if config.Mode == PinInputPullup {
|
||||||
|
pullup = 1
|
||||||
|
}
|
||||||
|
port.ODR.ReplaceBits(pullup, 0x1, pin)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Pin) getPort() *stm32.GPIO_Type {
|
func (p Pin) getPort() *stm32.GPIO_Type {
|
||||||
|
@ -215,6 +230,47 @@ func enableAltFuncClock(bus unsafe.Pointer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p Pin) registerInterrupt() interrupt.Interrupt {
|
||||||
|
pin := uint8(p) % 16
|
||||||
|
|
||||||
|
switch pin {
|
||||||
|
case 0:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI0, func(interrupt.Interrupt) { handlePinInterrupt(0) })
|
||||||
|
case 1:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI1, func(interrupt.Interrupt) { handlePinInterrupt(1) })
|
||||||
|
case 2:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI2, func(interrupt.Interrupt) { handlePinInterrupt(2) })
|
||||||
|
case 3:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI3, func(interrupt.Interrupt) { handlePinInterrupt(3) })
|
||||||
|
case 4:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI4, func(interrupt.Interrupt) { handlePinInterrupt(4) })
|
||||||
|
case 5:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI9_5, func(interrupt.Interrupt) { handlePinInterrupt(5) })
|
||||||
|
case 6:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI9_5, func(interrupt.Interrupt) { handlePinInterrupt(6) })
|
||||||
|
case 7:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI9_5, func(interrupt.Interrupt) { handlePinInterrupt(7) })
|
||||||
|
case 8:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI9_5, func(interrupt.Interrupt) { handlePinInterrupt(8) })
|
||||||
|
case 9:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI9_5, func(interrupt.Interrupt) { handlePinInterrupt(9) })
|
||||||
|
case 10:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI15_10, func(interrupt.Interrupt) { handlePinInterrupt(10) })
|
||||||
|
case 11:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI15_10, func(interrupt.Interrupt) { handlePinInterrupt(11) })
|
||||||
|
case 12:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI15_10, func(interrupt.Interrupt) { handlePinInterrupt(12) })
|
||||||
|
case 13:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI15_10, func(interrupt.Interrupt) { handlePinInterrupt(13) })
|
||||||
|
case 14:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI15_10, func(interrupt.Interrupt) { handlePinInterrupt(14) })
|
||||||
|
case 15:
|
||||||
|
return interrupt.New(stm32.IRQ_EXTI15_10, func(interrupt.Interrupt) { handlePinInterrupt(15) })
|
||||||
|
}
|
||||||
|
|
||||||
|
return interrupt.Interrupt{}
|
||||||
|
}
|
||||||
|
|
||||||
//---------- UART related code
|
//---------- UART related code
|
||||||
|
|
||||||
// Configure the TX and RX pins
|
// Configure the TX and RX pins
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче