Skip to content

Commit 0a24711

Browse files
committed
DM: update PWM for trellis m4 and m0 boards
1 parent 8b77387 commit 0a24711

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

cores/arduino/WVariant.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ typedef enum _EPWMChannel
172172
PWM0_CH3=TCC0_CH3,
173173
PWM0_CH4=TCC0_CH4,
174174
PWM0_CH5=TCC0_CH5,
175+
PWM0_CH6=TCC0_CH6,
176+
PWM0_CH7=TCC0_CH7,
175177
PWM1_CH0=TCC1_CH0,
176178
PWM1_CH1=TCC1_CH1,
177179
PWM1_CH2=TCC1_CH2,

cores/arduino/wiring_analog.c

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -528,13 +528,36 @@ void analogWrite(uint32_t pin, uint32_t value)
528528
}
529529

530530
#else
531-
uint32_t tcNum = GetTCNumber(pinDesc.ulPWMChannel);
532-
uint8_t tcChannel = GetTCChannelNumber(pinDesc.ulPWMChannel);
533-
static bool tcEnabled[TCC_INST_NUM+TC_INST_NUM];
534531

535532
if ((attr & PIN_ATTR_PWM) == PIN_ATTR_PWM)
536533
{
537-
value = mapResolution(value, _writeResolution, 16);
534+
value = mapResolution(value, _writeResolution, 16);
535+
536+
uint32_t tcNum = GetTCNumber(pinDesc.ulPWMChannel);
537+
uint8_t tcChannel = GetTCChannelNumber(pinDesc.ulPWMChannel);
538+
static bool tcEnabled[TCC_INST_NUM+TC_INST_NUM];
539+
540+
if (attr & PIN_ATTR_TIMER) {
541+
#if !(ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10603)
542+
// Compatibility for cores based on SAMD core <=1.6.2
543+
if (pinDesc.ulPinType == PIO_TIMER_ALT) {
544+
pinPeripheral(pin, PIO_TIMER_ALT);
545+
} else
546+
#endif
547+
{
548+
pinPeripheral(pin, PIO_TIMER);
549+
}
550+
} else if ((attr & PIN_ATTR_TIMER_ALT) == PIN_ATTR_TIMER_ALT){
551+
//this is on an alt timer
552+
pinPeripheral(pin, PIO_TIMER_ALT);
553+
}
554+
else{
555+
return;
556+
}
557+
558+
if (!tcEnabled[tcNum]) {
559+
tcEnabled[tcNum] = true;
560+
value = mapResolution(value, _writeResolution, 16);
538561
uint16_t GCLK_CLKCTRL_IDs[] = {
539562
GCLK_CLKCTRL_ID(GCM_TCC0_TCC1), // TCC0
540563
GCLK_CLKCTRL_ID(GCM_TCC0_TCC1), // TCC1
@@ -599,7 +622,7 @@ void analogWrite(uint32_t pin, uint32_t value)
599622
}
600623
}
601624
return;
602-
}
625+
}
603626
#endif
604627

605628
// -- Defaults to digital write

variants/trellis_m4/variant.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,21 @@ const PinDescription g_APinDescription[]=
2626
// 0..13 - Digital pins
2727
// ----------------------
2828
// 0/1 - SERCOM/UART (Serial1)
29-
{ PORTA, 12, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_12 }, // SERCOM 2.0
30-
{ PORTA, 13, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM0_CH7, TCC0_CH7, EXTERNAL_INT_13 }, // SERCOM 2.1
29+
{ PORTA, 12, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_12 }, // SERCOM 2.0
30+
{ PORTA, 13, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_13 }, // SERCOM 2.1
3131

3232
// 2..9 - columns
33-
{ PORTA, 14, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_14 }, // D2 COL0
34-
{ PORTA, 15, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_15 }, // D3 COL1
35-
{ PORTA, 16, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_0 }, // D4 COL2
36-
{ PORTA, 17, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_1 }, // D5 COL3
37-
{ PORTA, 20, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH4, TCC1_CH4, EXTERNAL_INT_4 }, // D6 COL4
38-
{ PORTA, 21, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH5, TCC1_CH5, EXTERNAL_INT_5 }, // D7 COL5
39-
{ PORTA, 22, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH6, TCC1_CH6, EXTERNAL_INT_6 }, // D8 COL6
40-
{ PORTA, 23, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH7, TCC1_CH7, EXTERNAL_INT_7 }, // D9 COL7
33+
{ PORTA, 14, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_14 }, // D2 COL0
34+
{ PORTA, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_15 }, // D3 COL1
35+
{ PORTA, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_0 }, // D4 COL2
36+
{ PORTA, 17, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_1 }, // D5 COL3
37+
{ PORTA, 20, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 }, // D6 COL4
38+
{ PORTA, 21, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, // D7 COL5
39+
{ PORTA, 22, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 }, // D8 COL6
40+
{ PORTA, 23, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // D9 COL7
4141

4242
// NeoPixel #10
43-
{ PORTA, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG), ADC_Channel7, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // D10
43+
{ PORTA, 27, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // D10
4444

4545
// 11 & 12 - dotstar clock + data
4646
{ PORTA, 0, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_0 }, // MOSI SERCOM 1.0
@@ -50,8 +50,8 @@ const PinDescription g_APinDescription[]=
5050
{ PORTB, 02, PIO_DIGITAL, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 }, // unconnected
5151

5252
// 14..17 - rows
53-
{ PORTA, 18, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_2 },
54-
{ PORTA, 19, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_3 },
53+
{ PORTA, 18, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 },
54+
{ PORTA, 19, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 },
5555
{ PORTB, 22, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 },
5656
{ PORTB, 23, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // MISO SERCOM 1.3
5757

@@ -65,8 +65,8 @@ const PinDescription g_APinDescription[]=
6565

6666
// 21..22 I2C pins (SDA/SCL)
6767
// ----------------------
68-
{ PORTB, 8, PIO_SERCOM_ALT, (PIN_ATTR_ANALOG|PIN_ATTR_PWM), ADC_Channel2, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_12 }, // SERCOM 2.0
69-
{ PORTB, 9, PIO_SERCOM_ALT, (PIN_ATTR_ANALOG_ALT|PIN_ATTR_PWM), ADC_Channel1, PWM0_CH7, TCC0_CH7, EXTERNAL_INT_13 }, // SERCOM 2.1
68+
{ PORTB, 8, PIO_SERCOM_ALT, PIN_ATTR_ANALOG, ADC_Channel2, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_12 }, // SERCOM 2.0
69+
{ PORTB, 9, PIO_SERCOM_ALT, PIN_ATTR_ANALOG_ALT, ADC_Channel1, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_13 }, // SERCOM 2.1
7070

7171
// ----------------------
7272
// 23 - 28 QSPI (SCK, CS, IO0, IO1, IO2, IO3)
@@ -99,7 +99,8 @@ const PinDescription g_APinDescription[]=
9999
{ PORTA, 3, PIO_ANALOG, PIN_ATTR_ANALOG, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 }, // DAC/VREFP
100100
} ;
101101

102-
const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2 } ;
102+
const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC0, TC1, TC2, TC3 } ;
103+
const uint32_t GCLK_CLKCTRL_IDs[TCC_INST_NUM+TC_INST_NUM] = { TCC0_GCLK_ID, TCC1_GCLK_ID, TCC2_GCLK_ID, TC0_GCLK_ID, TC1_GCLK_ID, TC2_GCLK_ID, TC3_GCLK_ID } ;
103104

104105
// Multi-serial objects instantiation
105106
SERCOM sercom0( SERCOM0 ) ;

0 commit comments

Comments
 (0)