mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-16 02:33:28 +00:00
machine/nrf: refactor to use volatile package/API
Signed-off-by: Ron Evans <ron@hybridgroup.com>
This commit is contained in:
@@ -15,8 +15,8 @@ func (p GPIO) getPortPin() (*nrf.GPIO_Type, uint8) {
|
||||
}
|
||||
|
||||
func (uart UART) setPins(tx, rx uint32) {
|
||||
nrf.UART0.PSELTXD = nrf.RegValue(tx)
|
||||
nrf.UART0.PSELRXD = nrf.RegValue(rx)
|
||||
nrf.UART0.PSELTXD.Set(tx)
|
||||
nrf.UART0.PSELRXD.Set(rx)
|
||||
}
|
||||
|
||||
//go:export UARTE0_UART0_IRQHandler
|
||||
@@ -25,8 +25,8 @@ func handleUART0() {
|
||||
}
|
||||
|
||||
func (i2c I2C) setPins(scl, sda uint8) {
|
||||
i2c.Bus.PSELSCL = nrf.RegValue(scl)
|
||||
i2c.Bus.PSELSDA = nrf.RegValue(sda)
|
||||
i2c.Bus.PSELSCL.Set(uint32(scl))
|
||||
i2c.Bus.PSELSDA.Set(uint32(sda))
|
||||
}
|
||||
|
||||
// SPI
|
||||
@@ -40,9 +40,9 @@ func (spi SPI) setPins(sck, mosi, miso uint8) {
|
||||
if miso == 0 {
|
||||
miso = SPI0_MISO_PIN
|
||||
}
|
||||
spi.Bus.PSEL.SCK = nrf.RegValue(sck)
|
||||
spi.Bus.PSEL.MOSI = nrf.RegValue(mosi)
|
||||
spi.Bus.PSEL.MISO = nrf.RegValue(miso)
|
||||
spi.Bus.PSEL.SCK.Set(uint32(sck))
|
||||
spi.Bus.PSEL.MOSI.Set(uint32(mosi))
|
||||
spi.Bus.PSEL.MISO.Set(uint32(miso))
|
||||
}
|
||||
|
||||
// InitADC initializes the registers needed for ADC.
|
||||
@@ -89,53 +89,53 @@ func (a ADC) Get() uint16 {
|
||||
return 0
|
||||
}
|
||||
|
||||
nrf.SAADC.RESOLUTION = nrf.SAADC_RESOLUTION_VAL_12bit
|
||||
nrf.SAADC.RESOLUTION.Set(nrf.SAADC_RESOLUTION_VAL_12bit)
|
||||
|
||||
// Enable ADC.
|
||||
nrf.SAADC.ENABLE = (nrf.SAADC_ENABLE_ENABLE_Enabled << nrf.SAADC_ENABLE_ENABLE_Pos)
|
||||
nrf.SAADC.ENABLE.Set(nrf.SAADC_ENABLE_ENABLE_Enabled << nrf.SAADC_ENABLE_ENABLE_Pos)
|
||||
for i := 0; i < 8; i++ {
|
||||
nrf.SAADC.CH[i].PSELN = nrf.SAADC_CH_PSELP_PSELP_NC
|
||||
nrf.SAADC.CH[i].PSELP = nrf.SAADC_CH_PSELP_PSELP_NC
|
||||
nrf.SAADC.CH[i].PSELN.Set(nrf.SAADC_CH_PSELP_PSELP_NC)
|
||||
nrf.SAADC.CH[i].PSELP.Set(nrf.SAADC_CH_PSELP_PSELP_NC)
|
||||
}
|
||||
|
||||
// Configure ADC.
|
||||
nrf.SAADC.CH[0].CONFIG = ((nrf.SAADC_CH_CONFIG_RESP_Bypass << nrf.SAADC_CH_CONFIG_RESP_Pos) & nrf.SAADC_CH_CONFIG_RESP_Msk) |
|
||||
nrf.SAADC.CH[0].CONFIG.Set(((nrf.SAADC_CH_CONFIG_RESP_Bypass << nrf.SAADC_CH_CONFIG_RESP_Pos) & nrf.SAADC_CH_CONFIG_RESP_Msk) |
|
||||
((nrf.SAADC_CH_CONFIG_RESP_Bypass << nrf.SAADC_CH_CONFIG_RESN_Pos) & nrf.SAADC_CH_CONFIG_RESN_Msk) |
|
||||
((nrf.SAADC_CH_CONFIG_GAIN_Gain1_5 << nrf.SAADC_CH_CONFIG_GAIN_Pos) & nrf.SAADC_CH_CONFIG_GAIN_Msk) |
|
||||
((nrf.SAADC_CH_CONFIG_REFSEL_Internal << nrf.SAADC_CH_CONFIG_REFSEL_Pos) & nrf.SAADC_CH_CONFIG_REFSEL_Msk) |
|
||||
((nrf.SAADC_CH_CONFIG_TACQ_3us << nrf.SAADC_CH_CONFIG_TACQ_Pos) & nrf.SAADC_CH_CONFIG_TACQ_Msk) |
|
||||
((nrf.SAADC_CH_CONFIG_MODE_SE << nrf.SAADC_CH_CONFIG_MODE_Pos) & nrf.SAADC_CH_CONFIG_MODE_Msk)
|
||||
((nrf.SAADC_CH_CONFIG_MODE_SE << nrf.SAADC_CH_CONFIG_MODE_Pos) & nrf.SAADC_CH_CONFIG_MODE_Msk))
|
||||
|
||||
// Set pin to read.
|
||||
nrf.SAADC.CH[0].PSELN = nrf.RegValue(pwmPin)
|
||||
nrf.SAADC.CH[0].PSELP = nrf.RegValue(pwmPin)
|
||||
nrf.SAADC.CH[0].PSELN.Set(pwmPin)
|
||||
nrf.SAADC.CH[0].PSELP.Set(pwmPin)
|
||||
|
||||
// Destination for sample result.
|
||||
nrf.SAADC.RESULT.PTR = nrf.RegValue(uintptr(unsafe.Pointer(&value)))
|
||||
nrf.SAADC.RESULT.MAXCNT = 1 // One sample
|
||||
nrf.SAADC.RESULT.PTR.Set(uint32(uintptr(unsafe.Pointer(&value))))
|
||||
nrf.SAADC.RESULT.MAXCNT.Set(1) // One sample
|
||||
|
||||
// Start tasks.
|
||||
nrf.SAADC.TASKS_START = 1
|
||||
for nrf.SAADC.EVENTS_STARTED == 0 {
|
||||
nrf.SAADC.TASKS_START.Set(1)
|
||||
for nrf.SAADC.EVENTS_STARTED.Get() == 0 {
|
||||
}
|
||||
nrf.SAADC.EVENTS_STARTED = 0x00
|
||||
nrf.SAADC.EVENTS_STARTED.Set(0x00)
|
||||
|
||||
// Start the sample task.
|
||||
nrf.SAADC.TASKS_SAMPLE = 1
|
||||
nrf.SAADC.TASKS_SAMPLE.Set(1)
|
||||
|
||||
// Wait until the sample task is done.
|
||||
for nrf.SAADC.EVENTS_END == 0 {
|
||||
for nrf.SAADC.EVENTS_END.Get() == 0 {
|
||||
}
|
||||
nrf.SAADC.EVENTS_END = 0x00
|
||||
nrf.SAADC.EVENTS_END.Set(0x00)
|
||||
|
||||
// Stop the ADC
|
||||
nrf.SAADC.TASKS_STOP = 1
|
||||
for nrf.SAADC.EVENTS_STOPPED == 0 {
|
||||
nrf.SAADC.TASKS_STOP.Set(1)
|
||||
for nrf.SAADC.EVENTS_STOPPED.Get() == 0 {
|
||||
}
|
||||
nrf.SAADC.EVENTS_STOPPED = 0
|
||||
nrf.SAADC.EVENTS_STOPPED.Set(0)
|
||||
|
||||
// Disable the ADC.
|
||||
nrf.SAADC.ENABLE = (nrf.SAADC_ENABLE_ENABLE_Disabled << nrf.SAADC_ENABLE_ENABLE_Pos)
|
||||
nrf.SAADC.ENABLE.Set(nrf.SAADC_ENABLE_ENABLE_Disabled << nrf.SAADC_ENABLE_ENABLE_Pos)
|
||||
|
||||
if value < 0 {
|
||||
value = 0
|
||||
@@ -170,21 +170,21 @@ func (pwm PWM) Set(value uint16) {
|
||||
|
||||
p := pwms[i]
|
||||
|
||||
p.PSEL.OUT[0] = nrf.RegValue(pwm.Pin)
|
||||
p.PSEL.OUT[1] = nrf.RegValue(pwm.Pin)
|
||||
p.PSEL.OUT[2] = nrf.RegValue(pwm.Pin)
|
||||
p.PSEL.OUT[3] = nrf.RegValue(pwm.Pin)
|
||||
p.ENABLE = (nrf.PWM_ENABLE_ENABLE_Enabled << nrf.PWM_ENABLE_ENABLE_Pos)
|
||||
p.PRESCALER = nrf.PWM_PRESCALER_PRESCALER_DIV_2
|
||||
p.MODE = nrf.PWM_MODE_UPDOWN_Up
|
||||
p.COUNTERTOP = 16384 // frequency
|
||||
p.LOOP = 0
|
||||
p.DECODER = (nrf.PWM_DECODER_LOAD_Common << nrf.PWM_DECODER_LOAD_Pos) | (nrf.PWM_DECODER_MODE_RefreshCount << nrf.PWM_DECODER_MODE_Pos)
|
||||
p.SEQ[0].PTR = nrf.RegValue(uintptr(unsafe.Pointer(&pwmChannelSequence[i])))
|
||||
p.SEQ[0].CNT = 1
|
||||
p.SEQ[0].REFRESH = 1
|
||||
p.SEQ[0].ENDDELAY = 0
|
||||
p.TASKS_SEQSTART[0] = 1
|
||||
p.PSEL.OUT[0].Set(uint32(pwm.Pin))
|
||||
p.PSEL.OUT[1].Set(uint32(pwm.Pin))
|
||||
p.PSEL.OUT[2].Set(uint32(pwm.Pin))
|
||||
p.PSEL.OUT[3].Set(uint32(pwm.Pin))
|
||||
p.ENABLE.Set(nrf.PWM_ENABLE_ENABLE_Enabled << nrf.PWM_ENABLE_ENABLE_Pos)
|
||||
p.PRESCALER.Set(nrf.PWM_PRESCALER_PRESCALER_DIV_2)
|
||||
p.MODE.Set(nrf.PWM_MODE_UPDOWN_Up)
|
||||
p.COUNTERTOP.Set(16384) // frequency
|
||||
p.LOOP.Set(0)
|
||||
p.DECODER.Set((nrf.PWM_DECODER_LOAD_Common << nrf.PWM_DECODER_LOAD_Pos) | (nrf.PWM_DECODER_MODE_RefreshCount << nrf.PWM_DECODER_MODE_Pos))
|
||||
p.SEQ[0].PTR.Set(uint32(uintptr(unsafe.Pointer(&pwmChannelSequence[i]))))
|
||||
p.SEQ[0].CNT.Set(1)
|
||||
p.SEQ[0].REFRESH.Set(1)
|
||||
p.SEQ[0].ENDDELAY.Set(0)
|
||||
p.TASKS_SEQSTART[0].Set(1)
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user