atsamd51: fix PWM support in atsamd51p20

This change is related to the following commit
72acda22b0
Этот коммит содержится в:
sago35 2021-04-21 21:27:17 +09:00 коммит произвёл Ron Evans
родитель 7b761fac78
коммит b9043b649d
2 изменённых файлов: 45 добавлений и 54 удалений

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

@ -290,6 +290,8 @@ smoketest:
@$(MD5SUM) test.hex @$(MD5SUM) test.hex
$(TINYGO) build -size short -o test.gba -target=gameboy-advance examples/gba-display $(TINYGO) build -size short -o test.gba -target=gameboy-advance examples/gba-display
@$(MD5SUM) test.gba @$(MD5SUM) test.gba
$(TINYGO) build -size short -o test.hex -target=grandcentral-m4 examples/blinky1
@$(MD5SUM) test.hex
$(TINYGO) build -size short -o test.hex -target=itsybitsy-m4 examples/blinky1 $(TINYGO) build -size short -o test.hex -target=itsybitsy-m4 examples/blinky1
@$(MD5SUM) test.hex @$(MD5SUM) test.hex
$(TINYGO) build -size short -o test.hex -target=feather-m4 examples/blinky1 $(TINYGO) build -size short -o test.hex -target=feather-m4 examples/blinky1

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

@ -11,60 +11,49 @@ import "device/sam"
const HSRAM_SIZE = 0x00040000 const HSRAM_SIZE = 0x00040000
// InitPWM initializes the PWM interface. // This chip has five TCC peripherals, which have PWM as one feature.
func InitPWM() { var (
// turn on timer clocks used for PWM TCC0 = (*TCC)(sam.TCC0)
sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_TCC0_ | sam.MCLK_APBBMASK_TCC1_) TCC1 = (*TCC)(sam.TCC1)
sam.MCLK.APBCMASK.SetBits(sam.MCLK_APBCMASK_TCC2_ | sam.MCLK_APBCMASK_TCC3_) TCC2 = (*TCC)(sam.TCC2)
sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_TCC4_) TCC3 = (*TCC)(sam.TCC3)
TCC4 = (*TCC)(sam.TCC4)
)
//use clock generator 0 func (tcc *TCC) configureClock() {
sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC0].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | // Turn on timer clocks used for TCC and use generic clock generator 0.
sam.GCLK_PCHCTRL_CHEN) switch tcc.timer() {
sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC2].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | case sam.TCC0:
sam.GCLK_PCHCTRL_CHEN) sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_TCC0_)
sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC4].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC0].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN)
sam.GCLK_PCHCTRL_CHEN) case sam.TCC1:
} sam.MCLK.APBBMASK.SetBits(sam.MCLK_APBBMASK_TCC1_)
sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC1].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN)
// getTimer returns the timer to be used for PWM on this pin case sam.TCC2:
func (pwm PWM) getTimer() *sam.TCC_Type { sam.MCLK.APBCMASK.SetBits(sam.MCLK_APBCMASK_TCC2_)
switch pwm.Pin { sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC2].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN)
case PC18: case sam.TCC3:
return sam.TCC0 sam.MCLK.APBCMASK.SetBits(sam.MCLK_APBCMASK_TCC3_)
case PC19: sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC3].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN)
return sam.TCC0 case sam.TCC4:
case PC20: sam.MCLK.APBDMASK.SetBits(sam.MCLK_APBDMASK_TCC4_)
return sam.TCC0 sam.GCLK.PCHCTRL[sam.PCHCTRL_GCLK_TCC4].Set((sam.GCLK_PCHCTRL_GEN_GCLK0 << sam.GCLK_PCHCTRL_GEN_Pos) | sam.GCLK_PCHCTRL_CHEN)
case PC21: }
return sam.TCC0 }
case PD20:
return sam.TCC1 func (tcc *TCC) timerNum() uint8 {
case PD21: switch tcc.timer() {
return sam.TCC1 case sam.TCC0:
case PB18: return 0
return sam.TCC1 case sam.TCC1:
case PB12: return 1
return sam.TCC3 case sam.TCC2:
case PB13: return 2
return sam.TCC3 case sam.TCC3:
case PA15: return 3
return sam.TCC2 case sam.TCC4:
case PC17: return 4
return sam.TCC0 default:
case PC16: return 0x0f // should not happen
return sam.TCC0
case PA14:
return sam.TCC2
case PB15:
return sam.TCC4
case PB14:
return sam.TCC4
case PB20:
return sam.TCC1
case PB21:
return sam.TCC1
default:
return nil // not supported on this pin
} }
} }