diff --git a/cpu/samd21/include/periph_cpu.h b/cpu/samd21/include/periph_cpu.h
index 1f51c56bba5c3fecfb6d8e3f75df22c3de154295..7143010238dbbe72faacd2c8db7cc61d10f7889f 100644
--- a/cpu/samd21/include/periph_cpu.h
+++ b/cpu/samd21/include/periph_cpu.h
@@ -48,7 +48,7 @@ typedef struct {
  */
 typedef struct {
     Tcc *dev;                   /**< TCC device to use */
-    pwm_conf_chan_t chan[2];    /**< channel configuration */
+    pwm_conf_chan_t chan[3];    /**< channel configuration */
 } pwm_conf_t;
 
 /**
diff --git a/cpu/samd21/periph/pwm.c b/cpu/samd21/periph/pwm.c
index 648a4349ad32132a51bb00f88562c27a2473dd97..af107be8704dbbf4fb4909934fd30a26005cac6f 100644
--- a/cpu/samd21/periph/pwm.c
+++ b/cpu/samd21/periph/pwm.c
@@ -106,8 +106,10 @@ uint32_t pwm_init(pwm_t dev, pwm_mode_t mode, uint32_t freq, uint16_t res)
 
     /* configure the used pins */
     for (int i = 0; i < PWM_MAX_CHANNELS; i++) {
-        gpio_init(pwm_config[dev].chan[i].pin, GPIO_DIR_OUT, GPIO_NOPULL);
-        gpio_init_mux(pwm_config[dev].chan[i].pin, pwm_config[dev].chan[i].mux);
+        if (pwm_config[dev].chan[i].pin != GPIO_UNDEF) {
+            gpio_init(pwm_config[dev].chan[i].pin, GPIO_DIR_OUT, GPIO_NOPULL);
+            gpio_init_mux(pwm_config[dev].chan[i].pin, pwm_config[dev].chan[i].mux);
+        }
     }
 
     /* power on the device */
@@ -152,7 +154,8 @@ uint8_t pwm_channels(pwm_t dev)
 
 void pwm_set(pwm_t dev, uint8_t channel, uint16_t value)
 {
-    if (channel >= PWM_MAX_CHANNELS) {
+    if ((channel >= PWM_MAX_CHANNELS) ||
+        (pwm_config[dev].chan[channel].pin == GPIO_UNDEF)) {
         return;
     }
     _tcc(dev)->CC[_chan(dev, channel)].reg = value;