diff --git a/boards/fox/include/periph_conf.h b/boards/fox/include/periph_conf.h
index e3198aab35a8546a2b11799e30df1b86122e2395..e5e15d0ec3ffe1fd01b5e2b810898766fa4825d4 100644
--- a/boards/fox/include/periph_conf.h
+++ b/boards/fox/include/periph_conf.h
@@ -125,8 +125,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 0 device configuration */
 #define SPI_0_DEV           SPI2
-#define SPI_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_SPI2EN)
-#define SPI_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN))
+#define SPI_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_SPI2EN))
+#define SPI_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_SPI2EN))
 #define SPI_0_BUS_DIV       0   /* 1 -> SPI runs with full CPU clock, 0 -> half CPU clock */
 /* SPI 0 pin configuration */
 #define SPI_0_CLK_PIN       GPIO_PIN(PORT_B,13)
@@ -160,8 +160,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
diff --git a/boards/iotlab-a8-m3/include/periph_conf.h b/boards/iotlab-a8-m3/include/periph_conf.h
index 1a83e2b23fedda43bf04aad658cb83491da08a1c..938525b486641e776f375fd0146b30819168e8a1 100644
--- a/boards/iotlab-a8-m3/include/periph_conf.h
+++ b/boards/iotlab-a8-m3/include/periph_conf.h
@@ -36,8 +36,8 @@ extern "C" {
 
 /* SPI 0 device configuration */
 #define SPI_0_DEV           SPI2
-#define SPI_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_SPI2EN)
-#define SPI_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN))
+#define SPI_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_SPI2EN))
+#define SPI_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_SPI2EN))
 #define SPI_0_BUS_DIV       1   /* 1 -> SPI runs with full CPU clock, 0 -> half CPU clock */
 /* SPI 0 pin configuration */
 #define SPI_0_CLK_PIN       GPIO_PIN(PORT_B,13)
diff --git a/boards/iotlab-common/include/periph_conf_common.h b/boards/iotlab-common/include/periph_conf_common.h
index 5ce6492258f55b0640edb5099ec3aa4ae81f9adf..a5a342b986a4f38be4cf7762aeb4ea7d1fd171c7 100644
--- a/boards/iotlab-common/include/periph_conf_common.h
+++ b/boards/iotlab-common/include/periph_conf_common.h
@@ -150,8 +150,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
diff --git a/boards/iotlab-m3/include/periph_conf.h b/boards/iotlab-m3/include/periph_conf.h
index 979df0d5e13086da755076dd0548e63cb191ac5d..fd3dc46518f8cf20c2076b5845b2e6833e5fae50 100644
--- a/boards/iotlab-m3/include/periph_conf.h
+++ b/boards/iotlab-m3/include/periph_conf.h
@@ -36,8 +36,8 @@ extern "C" {
 
 /* SPI 0 device configuration */
 #define SPI_0_DEV           SPI1
-#define SPI_0_CLKEN()       (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()      (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKEN()       (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()      (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_BUS_DIV       1   /* 1 -> SPI runs with full CPU clock, 0 -> half CPU clock */
 /* SPI 0 pin configuration */
 #define SPI_0_CLK_PIN       GPIO_PIN(PORT_A,5)
diff --git a/boards/limifrog-v1/include/periph_conf.h b/boards/limifrog-v1/include/periph_conf.h
index 5007a0cdb946d1f9fcd4fea049944d4c2f4db414..51b54d5cff818e6c1645f0f10d8cba8872e864b7 100644
--- a/boards/limifrog-v1/include/periph_conf.h
+++ b/boards/limifrog-v1/include/periph_conf.h
@@ -81,7 +81,7 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART3
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART3EN)
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART3EN))
 #define UART_0_CLK          (CLOCK_CORECLOCK)
 #define UART_0_IRQ          USART3_IRQn
 #define UART_0_ISR          isr_usart3
@@ -93,7 +93,7 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART1        /* Panasonic PAN1740 BLE module */
-#define UART_1_CLKEN()      (RCC->APB2ENR |= RCC_APB2ENR_USART1EN)
+#define UART_1_CLKEN()      (periph_clk_en(APB2, RCC_APB2ENR_USART1EN))
 #define UART_1_CLK          (CLOCK_CORECLOCK)
 #define UART_1_IRQ          USART1_IRQn
 #define UART_1_ISR          isr_usart1
@@ -114,12 +114,12 @@ static const timer_conf_t timer_config[] = {
 
 /* SPI 0 device configuration */
 #define SPI_0_DEV           SPI1  /* Densitron DD-160128FC-1a OLED display; external pins */
-#define SPI_0_CLKEN()       (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()      (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKEN()       (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()      (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_IRQ           SPI1_IRQn
 #define SPI_0_ISR           isr_spi1
 /* SPI 0 pin configuration */
-#define SPI_0_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_PORT          GPIOA
 #define SPI_0_PIN_SCK       5
 #define SPI_0_PIN_MOSI      7
@@ -128,12 +128,12 @@ static const timer_conf_t timer_config[] = {
 
 /* SPI 1 device configuration */
 #define SPI_1_DEV           SPI3          /*  Adesto AT45DB641E data flash */
-#define SPI_1_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_SPI3EN)
-#define SPI_1_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN))
+#define SPI_1_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_SPI3EN))
+#define SPI_1_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_SPI3EN))
 #define SPI_1_IRQ           SPI3_IRQn
 #define SPI_1_ISR           isr_spi3
 /* SPI 1 pin configuration */
-#define SPI_1_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define SPI_1_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define SPI_1_PORT          GPIOB
 #define SPI_1_PIN_SCK       3
 #define SPI_1_PIN_MOSI      5
diff --git a/boards/msbiot/board.c b/boards/msbiot/board.c
index b5b5bc3bfd8e6be788e6520d0780a5c1fc843fde..9488fd5a9eec82dc8d1ab305c179698995d24734 100644
--- a/boards/msbiot/board.c
+++ b/boards/msbiot/board.c
@@ -45,7 +45,7 @@ void board_init(void)
 static void leds_init(void)
 {
     /* enable clock for port GPIOB */
-    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
+    periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN);
 
     /* set output speed to 50MHz */
     LED_PORT->OSPEEDR &= ~(0xF0030000);
diff --git a/boards/msbiot/include/periph_conf.h b/boards/msbiot/include/periph_conf.h
index b617eeec60797381b2adbdc9b7dfb932d9123557..7694524fb482d7d4760bb32d9788cf93df34ac6c 100644
--- a/boards/msbiot/include/periph_conf.h
+++ b/boards/msbiot/include/periph_conf.h
@@ -186,8 +186,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV             SPI1
-#define SPI_0_CLKEN()         (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()        (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()         (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()        (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_BUS_DIV         1   /* 1 -> SPI runs with half CPU clock, 0 -> quarter CPU clock */
 #define SPI_0_IRQ             SPI1_IRQn
 #define SPI_0_IRQ_HANDLER     isr_spi1
@@ -201,9 +201,9 @@ static const uart_conf_t uart_config[] = {
 #define SPI_0_MOSI_PORT       GPIOA
 #define SPI_0_MOSI_PIN        7
 #define SPI_0_MOSI_AF         5
-#define SPI_0_SCK_PORT_CLKEN()      (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
-#define SPI_0_MISO_PORT_CLKEN()     (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
-#define SPI_0_MOSI_PORT_CLKEN()     (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()      (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
+#define SPI_0_MISO_PORT_CLKEN()     (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
+#define SPI_0_MOSI_PORT_CLKEN()     (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 /** @} */
 
 /**
@@ -217,8 +217,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -227,11 +227,11 @@ static const uart_conf_t uart_config[] = {
 #define I2C_0_SCL_PORT      GPIOB
 #define I2C_0_SCL_PIN       6
 #define I2C_0_SCL_AF        4
-#define I2C_0_SCL_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SCL_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define I2C_0_SDA_PORT      GPIOB
 #define I2C_0_SDA_PIN       7
 #define I2C_0_SDA_AF        4
-#define I2C_0_SDA_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SDA_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 
 #ifdef __cplusplus
 }
diff --git a/boards/nucleo-f030/include/periph_conf.h b/boards/nucleo-f030/include/periph_conf.h
index a2df78bd1a7f67371738e4cefee9a251b1eea029..1d47d945d84064b611e72b442bad81a6076b9c8e 100644
--- a/boards/nucleo-f030/include/periph_conf.h
+++ b/boards/nucleo-f030/include/periph_conf.h
@@ -73,26 +73,26 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART2
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
-#define UART_0_CLKDIS()     (RCC->APB1ENR &= (~RCC_APB1ENR_USART2EN))
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
+#define UART_0_CLKDIS()     (periph_clk_dis(APB1, RCC_APB1ENR_USART2EN))
 #define UART_0_IRQ          USART2_IRQn
 #define UART_0_ISR          isr_usart2
 /* UART 0 pin configuration */
 #define UART_0_PORT         GPIOA
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_0_RX_PIN       3
 #define UART_0_TX_PIN       2
 #define UART_0_AF           1
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART1
-#define UART_1_CLKEN()      (RCC->APB2ENR |= RCC_APB2ENR_USART1EN)
-#define UART_1_CLKDIS()     (RCC->APB2ENR &= (~RCC_APB2ENR_USART1EN))
+#define UART_1_CLKEN()      (periph_clk_en(APB2, RCC_APB2ENR_USART1EN))
+#define UART_1_CLKDIS()     (periph_clk_dis(APB2, RCC_APB2ENR_USART1EN))
 #define UART_1_IRQ          USART1_IRQn
 #define UART_1_ISR          isr_usart1
 /* UART 1 pin configuration */
 #define UART_1_PORT         GPIOB
-#define UART_1_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define UART_1_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define UART_1_RX_PIN       7
 #define UART_1_TX_PIN       6
 #define UART_1_AF           0
diff --git a/boards/nucleo-f070/include/periph_conf.h b/boards/nucleo-f070/include/periph_conf.h
index 0a077edbcaa9dbe78e6365ba35ccac0da3f38af5..5f1fc905b45845d2ef7ee55fbd1c73d49f9abf9e 100644
--- a/boards/nucleo-f070/include/periph_conf.h
+++ b/boards/nucleo-f070/include/periph_conf.h
@@ -73,26 +73,26 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART2
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
-#define UART_0_CLKDIS()     (RCC->APB1ENR &= (~RCC_APB1ENR_USART2EN))
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
+#define UART_0_CLKDIS()     (periph_clk_dis(APB1, RCC_APB1ENR_USART2EN))
 #define UART_0_IRQ          USART2_IRQn
 #define UART_0_ISR          isr_usart2
 /* UART 0 pin configuration */
 #define UART_0_PORT         GPIOA
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_0_RX_PIN       3
 #define UART_0_TX_PIN       2
 #define UART_0_AF           1
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART3
-#define UART_1_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART3EN)
-#define UART_1_CLKDIS()     (RCC->APB1ENR &= (~RCC_APB1ENR_USART3EN))
+#define UART_1_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART3EN))
+#define UART_1_CLKDIS()     (periph_clk_dis(APB1, RCC_APB1ENR_USART3EN))
 #define UART_1_IRQ          USART3_4_IRQn
 #define UART_1_ISR          isr_usart3_8
 /* UART 1 pin configuration */
 #define UART_1_PORT         GPIOC
-#define UART_1_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define UART_1_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOCEN))
 #define UART_1_RX_PIN       11
 #define UART_1_TX_PIN       10
 #define UART_1_AF           1
diff --git a/boards/nucleo-f072/include/periph_conf.h b/boards/nucleo-f072/include/periph_conf.h
index 28e77ab738d4d3b95c5c1b218e23e81b8b57fec3..79e29c96ab471db60fe36efdcbf050a194e975de 100644
--- a/boards/nucleo-f072/include/periph_conf.h
+++ b/boards/nucleo-f072/include/periph_conf.h
@@ -72,26 +72,26 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART2
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
-#define UART_0_CLKDIS()     (RCC->APB1ENR &= (~RCC_APB1ENR_USART2EN))
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
+#define UART_0_CLKDIS()     (periph_clk_dis(APB1, RCC_APB1ENR_USART2EN))
 #define UART_0_IRQ          USART2_IRQn
 #define UART_0_ISR          isr_usart2
 /* UART 0 pin configuration */
 #define UART_0_PORT         GPIOA
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_0_RX_PIN       3
 #define UART_0_TX_PIN       2
 #define UART_0_AF           1
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART1
-#define UART_1_CLKEN()      (RCC->APB2ENR |= RCC_APB2ENR_USART1EN)
-#define UART_1_CLKDIS()     (RCC->APB2ENR &= (~RCC_APB2ENR_USART1EN))
+#define UART_1_CLKEN()      (periph_clk_en(APB2, RCC_APB2ENR_USART1EN))
+#define UART_1_CLKDIS()     (periph_clk_dis(APB2, RCC_APB2ENR_USART1EN))
 #define UART_1_IRQ          USART1_IRQn
 #define UART_1_ISR          isr_usart1
 /* UART 1 pin configuration */
 #define UART_1_PORT         GPIOB
-#define UART_1_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define UART_1_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define UART_1_RX_PIN       7
 #define UART_1_TX_PIN       6
 #define UART_1_AF           0
diff --git a/boards/nucleo-f091/include/periph_conf.h b/boards/nucleo-f091/include/periph_conf.h
index 01bfb369ad7dc00923baea4459859d3033b7d397..73a6ee37c758149529631c061a8ec7f9b2e6bdb3 100644
--- a/boards/nucleo-f091/include/periph_conf.h
+++ b/boards/nucleo-f091/include/periph_conf.h
@@ -71,26 +71,26 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART2
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
-#define UART_0_CLKDIS()     (RCC->APB1ENR &= (~RCC_APB1ENR_USART2EN))
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
+#define UART_0_CLKDIS()     (periph_clk_dis(APB1, RCC_APB1ENR_USART2EN))
 #define UART_0_IRQ          USART2_IRQn
 #define UART_0_ISR          isr_usart2
 /* UART 0 pin configuration */
 #define UART_0_PORT         GPIOA
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_0_RX_PIN       3
 #define UART_0_TX_PIN       2
 #define UART_0_AF           1
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART1
-#define UART_1_CLKEN()      (RCC->APB2ENR |= RCC_APB2ENR_USART1EN)
-#define UART_1_CLKDIS()     (RCC->APB2ENR &= (~RCC_APB2ENR_USART1EN))
+#define UART_1_CLKEN()      (periph_clk_en(APB2, RCC_APB2ENR_USART1EN))
+#define UART_1_CLKDIS()     (periph_clk_dis(APB2, RCC_APB2ENR_USART1EN))
 #define UART_1_IRQ          USART1_IRQn
 #define UART_1_ISR          isr_usart1
 /* UART 1 pin configuration */
 #define UART_1_PORT         GPIOB
-#define UART_1_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define UART_1_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define UART_1_RX_PIN       7
 #define UART_1_TX_PIN       6
 #define UART_1_AF           0
diff --git a/boards/nucleo-f103/include/periph_conf.h b/boards/nucleo-f103/include/periph_conf.h
index feb31718a4fb23e3d241d4e43b408cc2e65b0c5f..c3e40472b4d119cde7483660f4383864ce903c52 100644
--- a/boards/nucleo-f103/include/periph_conf.h
+++ b/boards/nucleo-f103/include/periph_conf.h
@@ -139,8 +139,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -151,8 +151,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 1 device configuration */
 #define I2C_1_DEV           I2C2
-#define I2C_1_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C2EN)
-#define I2C_1_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN))
+#define I2C_1_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C2EN))
+#define I2C_1_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C2EN))
 #define I2C_1_EVT_IRQ       I2C2_EV_IRQn
 #define I2C_1_EVT_ISR       isr_i2c2_ev
 #define I2C_1_ERR_IRQ       I2C2_ER_IRQn
@@ -173,8 +173,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
 #define SPI_0_BUS_DIV           1
@@ -186,8 +186,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 1 device config */
 #define SPI_1_DEV               SPI2
-#define SPI_1_CLKEN()           (RCC->APB1ENR |= RCC_APB1ENR_SPI2EN)
-#define SPI_1_CLKDIS()          (RCC->APB1ENR &= ~RCC_APB1ENR_SPI2EN)
+#define SPI_1_CLKEN()           (periph_clk_en(APB1, RCC_APB1ENR_SPI2EN))
+#define SPI_1_CLKDIS()          (periph_clk_dis(APB1, RCC_APB1ENR_SPI2EN))
 #define SPI_1_IRQ               SPI2_IRQn
 #define SPI_1_IRQ_HANDLER       isr_spi2
 #define SPI_1_BUS_DIV           1
diff --git a/boards/nucleo-f207/include/periph_conf.h b/boards/nucleo-f207/include/periph_conf.h
index 9b4055667fc778f13b4eda634d7ccb1fff916a2f..d9d6e10f74244992fe1a10ca599b634e3897c909 100644
--- a/boards/nucleo-f207/include/periph_conf.h
+++ b/boards/nucleo-f207/include/periph_conf.h
@@ -188,8 +188,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_BUS_DIV           1   /* 1 -> SPI bus runs with half CPU clock, 0 -> quarter CPU clock */
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
@@ -197,20 +197,20 @@ static const uart_conf_t uart_config[] = {
 #define SPI_0_SCK_PORT          GPIOA       /* A5 pin is shared with the green LED. */
 #define SPI_0_SCK_PIN           5
 #define SPI_0_SCK_AF            5
-#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()  (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MISO_PORT         GPIOA
 #define SPI_0_MISO_PIN          6
 #define SPI_0_MISO_AF           5
-#define SPI_0_MISO_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MISO_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MOSI_PORT         GPIOA
 #define SPI_0_MOSI_PIN          7
 #define SPI_0_MOSI_AF           5
-#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MOSI_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 
 /* SPI 1 device config */
 #define SPI_1_DEV               SPI2
-#define SPI_1_CLKEN()           (RCC->APB1ENR |= RCC_APB1ENR_SPI2EN)
-#define SPI_1_CLKDIS()          (RCC->APB1ENR &= ~RCC_APB1ENR_SPI2EN)
+#define SPI_1_CLKEN()           (periph_clk_en(APB1, RCC_APB1ENR_SPI2EN))
+#define SPI_1_CLKDIS()          (periph_clk_dis(APB1, RCC_APB1ENR_SPI2EN))
 #define SPI_1_BUS_DIV           0   /* 1 -> SPI bus runs with half CPU clock, 0 -> quarter CPU clock */
 #define SPI_1_IRQ               SPI2_IRQn
 #define SPI_1_IRQ_HANDLER       isr_spi2
@@ -218,15 +218,15 @@ static const uart_conf_t uart_config[] = {
 #define SPI_1_SCK_PORT          GPIOB
 #define SPI_1_SCK_PIN           3
 #define SPI_1_SCK_AF            5
-#define SPI_1_SCK_PORT_CLKEN()  (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define SPI_1_SCK_PORT_CLKEN()  (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define SPI_1_MISO_PORT         GPIOB
 #define SPI_1_MISO_PIN          4
 #define SPI_1_MISO_AF           5
-#define SPI_1_MISO_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define SPI_1_MISO_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define SPI_1_MOSI_PORT         GPIOB
 #define SPI_1_MOSI_PIN          5
 #define SPI_1_MOSI_AF           5
-#define SPI_1_MOSI_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define SPI_1_MOSI_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 /** @} */
 
 
@@ -241,8 +241,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -252,12 +252,12 @@ static const uart_conf_t uart_config[] = {
 #define I2C_0_SCL_PIN       8
 #define I2C_0_SCL_AF        4
 #define I2C_0_SCL_PULLUP    0
-#define I2C_0_SCL_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SCL_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define I2C_0_SDA_PORT      GPIOB
 #define I2C_0_SDA_PIN       9
 #define I2C_0_SDA_AF        4
 #define I2C_0_SDA_PULLUP    0
-#define I2C_0_SDA_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SDA_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 /** @} */
 
 /**
diff --git a/boards/nucleo-f303/include/periph_conf.h b/boards/nucleo-f303/include/periph_conf.h
index 617dba18669b7ea1352cf219086ded7c9bf7ad73..4da4b8449ed82c10574941a378ef001950f3d0ff 100755
--- a/boards/nucleo-f303/include/periph_conf.h
+++ b/boards/nucleo-f303/include/periph_conf.h
@@ -85,12 +85,12 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART2
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
 #define UART_0_CLK          (CLOCK_CORECLOCK / 2)   /* UART clock runs with 36MHz (F_CPU / 2) */
 #define UART_0_IRQ_CHAN     USART2_IRQn
 #define UART_0_ISR          isr_usart2
 /* UART 0 pin configuration */
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_0_PORT         GPIOA
 #define UART_0_TX_PIN       2
 #define UART_0_RX_PIN       3
@@ -98,12 +98,12 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART1
-#define UART_1_CLKEN()      (RCC->APB2ENR |= RCC_APB2ENR_USART1EN)
+#define UART_1_CLKEN()      (periph_clk_en(APB2, RCC_APB2ENR_USART1EN))
 #define UART_1_CLK          (CLOCK_CORECLOCK / 1)   /* UART clock runs with 72MHz (F_CPU / 1) */
 #define UART_1_IRQ_CHAN     USART1_IRQn
 #define UART_1_ISR          isr_usart1
 /* UART 1 pin configuration */
-#define UART_1_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_1_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_1_PORT         GPIOA
 #define UART_1_TX_PIN       9
 #define UART_1_RX_PIN       10
@@ -111,12 +111,12 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 2 device configuration */
 #define UART_2_DEV          USART3
-#define UART_2_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART3EN)
+#define UART_2_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART3EN))
 #define UART_2_CLK          (CLOCK_CORECLOCK / 2)   /* UART clock runs with 36MHz (F_CPU / 2) */
 #define UART_2_IRQ_CHAN     USART3_IRQn
 #define UART_2_ISR          isr_usart3
 /* UART 2 pin configuration */
-#define UART_2_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define UART_2_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define UART_2_PORT         GPIOB
 #define UART_2_TX_PIN       10
 #define UART_2_RX_PIN       11
@@ -153,43 +153,43 @@ static const pwm_conf_t pwm_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
 /* SPI 0 pin configuration */
 #define SPI_0_SCK_PORT          GPIOA
 #define SPI_0_SCK_PIN           5
 #define SPI_0_SCK_AF            5
-#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_MISO_PORT         GPIOA
 #define SPI_0_MISO_PIN          6
 #define SPI_0_MISO_AF           5
-#define SPI_0_MISO_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MISO_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_MOSI_PORT         GPIOA
 #define SPI_0_MOSI_PIN          7
 #define SPI_0_MOSI_AF           5
-#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MOSI_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 
 /* SPI 1 device config */
 #define SPI_1_DEV               SPI3
-#define SPI_1_CLKEN()           (RCC->APB1ENR |= RCC_APB1ENR_SPI3EN)
-#define SPI_1_CLKDIS()          (RCC->APB1ENR &= ~RCC_APB1ENR_SPI3EN)
+#define SPI_1_CLKEN()           (periph_clk_en(APB1, RCC_APB1ENR_SPI3EN))
+#define SPI_1_CLKDIS()          (periph_clk_dis(APB1, RCC_APB1ENR_SPI3EN))
 #define SPI_1_IRQ               SPI3_IRQn
 #define SPI_1_IRQ_HANDLER       isr_spi3
 /* SPI 1 pin configuration */
 #define SPI_1_SCK_PORT          GPIOC
 #define SPI_1_SCK_PIN           10
 #define SPI_1_SCK_AF            6
-#define SPI_1_SCK_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define SPI_1_SCK_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOCEN))
 #define SPI_1_MISO_PORT         GPIOC
 #define SPI_1_MISO_PIN          11
 #define SPI_1_MISO_AF           6
-#define SPI_1_MISO_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define SPI_1_MISO_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOCEN))
 #define SPI_1_MOSI_PORT         GPIOC
 #define SPI_1_MOSI_PIN          12
 #define SPI_1_MOSI_AF           6
-#define SPI_1_MOSI_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define SPI_1_MOSI_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOCEN))
 /** @} */
 
 /**
@@ -204,8 +204,8 @@ static const pwm_conf_t pwm_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -214,16 +214,16 @@ static const pwm_conf_t pwm_config[] = {
 #define I2C_0_SCL_PORT      GPIOB
 #define I2C_0_SCL_PIN       8
 #define I2C_0_SCL_AF        4
-#define I2C_0_SCL_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define I2C_0_SCL_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define I2C_0_SDA_PORT      GPIOB
 #define I2C_0_SDA_PIN       9
 #define I2C_0_SDA_AF        4
-#define I2C_0_SDA_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define I2C_0_SDA_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 
 /* I2C 1 device configuration */
 #define I2C_1_DEV           I2C3
-#define I2C_1_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C3EN)
-#define I2C_1_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN))
+#define I2C_1_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C3EN))
+#define I2C_1_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C3EN))
 #define I2C_1_EVT_IRQ       I2C3_EV_IRQn
 #define I2C_1_EVT_ISR       isr_i2c3_ev
 #define I2C_1_ERR_IRQ       I2C3_ER_IRQn
@@ -232,11 +232,11 @@ static const pwm_conf_t pwm_config[] = {
 #define I2C_1_SCL_PORT      GPIOA
 #define I2C_1_SCL_PIN       8
 #define I2C_1_SCL_AF        3
-#define I2C_1_SCL_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define I2C_1_SCL_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define I2C_1_SDA_PORT      GPIOB
 #define I2C_1_SDA_PIN       5
 #define I2C_1_SDA_AF        8
-#define I2C_1_SDA_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define I2C_1_SDA_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 /** @} */
 
 #ifdef __cplusplus
diff --git a/boards/nucleo-f334/include/periph_conf.h b/boards/nucleo-f334/include/periph_conf.h
index 073024b07ed464f792f1440bcf1648ab29f49ecf..11e1b39285ae6b1ad56dc525e571ae010dc48d00 100644
--- a/boards/nucleo-f334/include/periph_conf.h
+++ b/boards/nucleo-f334/include/periph_conf.h
@@ -89,13 +89,13 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART2
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
 #define UART_0_CLK          (CLOCK_CORECLOCK / 2)   /* UART clock runs with 32MHz (F_CPU / 1) */
 #define UART_0_IRQ_CHAN     USART2_IRQn
 #define UART_0_ISR          isr_usart2
 /* UART 0 pin configuration */
 #define UART_0_PORT         GPIOA
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_0_RX_PIN       3
 #define UART_0_TX_PIN       2
 #define UART_0_AF           7
@@ -130,23 +130,23 @@ static const pwm_conf_t pwm_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
 /* SPI 0 pin configuration */
 #define SPI_0_SCK_PORT          GPIOA
 #define SPI_0_SCK_PIN           5
 #define SPI_0_SCK_AF            5
-#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_MISO_PORT         GPIOA
 #define SPI_0_MISO_PIN          6
 #define SPI_0_MISO_AF           5
-#define SPI_0_MISO_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MISO_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_MOSI_PORT         GPIOA
 #define SPI_0_MOSI_PIN          7
 #define SPI_0_MOSI_AF           5
-#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MOSI_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 /** @} */
 
 #ifdef __cplusplus
diff --git a/boards/nucleo-f401/include/periph_conf.h b/boards/nucleo-f401/include/periph_conf.h
index a8e2115ec362eff05f499cdd0d811d96bb2811a5..4bb04c00d01369869fc0ec9b53508f53eec24af8 100644
--- a/boards/nucleo-f401/include/periph_conf.h
+++ b/boards/nucleo-f401/include/periph_conf.h
@@ -111,8 +111,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_BUS_DIV           1   /* 1 -> SPI bus runs with half CPU clock, 0 -> quarter CPU clock */
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
@@ -120,15 +120,15 @@ static const uart_conf_t uart_config[] = {
 #define SPI_0_SCK_PORT          GPIOA       /* A5 pin is shared with the green LED. */
 #define SPI_0_SCK_PIN           5
 #define SPI_0_SCK_AF            5
-#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()  (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MISO_PORT         GPIOA
 #define SPI_0_MISO_PIN          6
 #define SPI_0_MISO_AF           5
-#define SPI_0_MISO_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MISO_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MOSI_PORT         GPIOA
 #define SPI_0_MOSI_PIN          7
 #define SPI_0_MOSI_AF           5
-#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MOSI_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 /** @} */
 
 
@@ -143,8 +143,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -153,11 +153,11 @@ static const uart_conf_t uart_config[] = {
 #define I2C_0_SCL_PORT      GPIOB
 #define I2C_0_SCL_PIN       8
 #define I2C_0_SCL_AF        4
-#define I2C_0_SCL_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SCL_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define I2C_0_SDA_PORT      GPIOB
 #define I2C_0_SDA_PIN       9
 #define I2C_0_SDA_AF        4
-#define I2C_0_SDA_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SDA_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 /** @} */
 
 /**
diff --git a/boards/nucleo-f446/include/periph_conf.h b/boards/nucleo-f446/include/periph_conf.h
index fa2703181bb24d7370aba718ac034645efa3fb2a..e44c4e2f3ff1f079fb3d9d63a3e59c29819a1cb7 100644
--- a/boards/nucleo-f446/include/periph_conf.h
+++ b/boards/nucleo-f446/include/periph_conf.h
@@ -111,8 +111,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_BUS_DIV           1   /* 1 -> SPI bus runs with half CPU clock, 0 -> quarter CPU clock */
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
@@ -120,15 +120,15 @@ static const uart_conf_t uart_config[] = {
 #define SPI_0_SCK_PORT          GPIOA       /* A5 pin is shared with the green LED. */
 #define SPI_0_SCK_PIN           5
 #define SPI_0_SCK_AF            5
-#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()  (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MISO_PORT         GPIOA
 #define SPI_0_MISO_PIN          6
 #define SPI_0_MISO_AF           5
-#define SPI_0_MISO_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MISO_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MOSI_PORT         GPIOA
 #define SPI_0_MOSI_PIN          7
 #define SPI_0_MOSI_AF           5
-#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MOSI_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 /** @} */
 
 
@@ -143,8 +143,8 @@ static const uart_conf_t uart_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -153,11 +153,11 @@ static const uart_conf_t uart_config[] = {
 #define I2C_0_SCL_PORT      GPIOB
 #define I2C_0_SCL_PIN       8
 #define I2C_0_SCL_AF        4
-#define I2C_0_SCL_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SCL_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define I2C_0_SDA_PORT      GPIOB
 #define I2C_0_SDA_PIN       9
 #define I2C_0_SDA_AF        4
-#define I2C_0_SDA_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SDA_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 /** @} */
 
 /**
diff --git a/boards/nucleo-l1/include/periph_conf.h b/boards/nucleo-l1/include/periph_conf.h
index 52d27d3c8d50fa280c6bf288b7523a325163bc28..77540afc495b773bb5561fb3eb434a2ac0e8260f 100644
--- a/boards/nucleo-l1/include/periph_conf.h
+++ b/boards/nucleo-l1/include/periph_conf.h
@@ -89,7 +89,7 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART2
-#define UART_0_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
+#define UART_0_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
 #define UART_0_CLK          (CLOCK_CORECLOCK)   /* UART clock runs with 32MHz (F_CPU / 1) */
 #define UART_0_IRQ          USART2_IRQn
 #define UART_0_ISR          isr_usart2
@@ -108,12 +108,12 @@ static const timer_conf_t timer_config[] = {
 
 /* SPI 0 device configuration */
 #define SPI_0_DEV           SPI1
-#define SPI_0_CLKEN()       (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()      (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKEN()       (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()      (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_IRQ           SPI1_IRQn
 #define SPI_0_ISR           isr_spi1
 /* SPI 0 pin configuration */
-#define SPI_0_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_PORT          GPIOA
 #define SPI_0_PIN_SCK       5
 #define SPI_0_PIN_MOSI      7
diff --git a/boards/spark-core/include/periph_conf.h b/boards/spark-core/include/periph_conf.h
index 80ff806d041852a110ccea097639b318ba4d04a3..83e2a641b347877559a6dc34f1bff4d1c4baf16b 100644
--- a/boards/spark-core/include/periph_conf.h
+++ b/boards/spark-core/include/periph_conf.h
@@ -116,8 +116,8 @@ static const uart_conf_t uart_config[] = {
 
 /* SPI 0 device configuration */
 #define SPI_0_DEV           SPI1
-#define SPI_0_CLKEN()       (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()      (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKEN()       (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()      (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_BUS_DIV       0   /* 1 -> SPI runs with full CPU clock, 0 -> half CPU clock */
 /* SPI 0 pin configuration */
 #define SPI_0_CLK_PIN       GPIO_PIN(PORT_B,15)
diff --git a/boards/stm32f0discovery/include/periph_conf.h b/boards/stm32f0discovery/include/periph_conf.h
index 4c2027c0d78f00dfcbdae10f72fe0e9afa8ed92a..775fec08d1106cbaff330d02fd7d2aa4e6156207 100644
--- a/boards/stm32f0discovery/include/periph_conf.h
+++ b/boards/stm32f0discovery/include/periph_conf.h
@@ -71,26 +71,26 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART1
-#define UART_0_CLKEN()      (RCC->APB2ENR |= RCC_APB2ENR_USART1EN)
-#define UART_0_CLKDIS()     (RCC->APB2ENR &= (~RCC_APB2ENR_USART1EN))
+#define UART_0_CLKEN()      (periph_clk_en(APB2, RCC_APB2ENR_USART1EN))
+#define UART_0_CLKDIS()     (periph_clk_dis(APB2, RCC_APB2ENR_USART1EN))
 #define UART_0_IRQ          USART1_IRQn
 #define UART_0_ISR          isr_usart1
 /* UART 0 pin configuration */
 #define UART_0_PORT         GPIOB
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define UART_0_RX_PIN       7
 #define UART_0_TX_PIN       6
 #define UART_0_AF           0
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART2
-#define UART_1_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
-#define UART_1_CLKDIS()     (RCC->APB1ENR &= (~RCC_APB1ENR_USART2EN))
+#define UART_1_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
+#define UART_1_CLKDIS()     (periph_clk_dis(APB1, RCC_APB1ENR_USART2EN))
 #define UART_1_IRQ          USART2_IRQn
 #define UART_1_ISR          isr_usart2
 /* UART 1 pin configuration */
 #define UART_1_PORT         GPIOA
-#define UART_1_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_1_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_1_RX_PIN       3
 #define UART_1_TX_PIN       2
 #define UART_1_AF           1
@@ -133,13 +133,13 @@ static const timer_conf_t timer_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV           SPI1
-#define SPI_0_CLKEN()       (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()      (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKEN()       (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()      (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_IRQ           SPI1_IRQn
 #define SPI_0_ISR           isr_spi1
 /* SPI 1 pin configuration */
 #define SPI_0_PORT          GPIOA
-#define SPI_0_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_PIN_SCK       5
 #define SPI_0_PIN_MISO      6
 #define SPI_0_PIN_MOSI      7
@@ -147,13 +147,13 @@ static const timer_conf_t timer_config[] = {
 
 /* SPI 1 device config */
 #define SPI_1_DEV           SPI2
-#define SPI_1_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_SPI2EN)
-#define SPI_1_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN))
+#define SPI_1_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_SPI2EN))
+#define SPI_1_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_SPI2EN))
 #define SPI_1_IRQ           SPI2_IRQn
 #define SPI_1_ISR           isr_spi2
 /* SPI 1 pin configuration */
 #define SPI_1_PORT          GPIOB
-#define SPI_1_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define SPI_1_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define SPI_1_PIN_SCK       13
 #define SPI_1_PIN_MISO      14
 #define SPI_1_PIN_MOSI      15
diff --git a/boards/stm32f3discovery/include/periph_conf.h b/boards/stm32f3discovery/include/periph_conf.h
index 7c33e85eec8f7cbb8284a3fd49cad87d0452a4bd..eccc128fd29d9c67977480d8ec2981d3b002e2b1 100644
--- a/boards/stm32f3discovery/include/periph_conf.h
+++ b/boards/stm32f3discovery/include/periph_conf.h
@@ -87,12 +87,12 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 0 device configuration */
 #define UART_0_DEV          USART1
-#define UART_0_CLKEN()      (RCC->APB2ENR |= RCC_APB2ENR_USART1EN)
+#define UART_0_CLKEN()      (periph_clk_en(APB2, RCC_APB2ENR_USART1EN))
 #define UART_0_CLK          (CLOCK_CORECLOCK / 1)   /* UART clock runs with 72MHz (F_CPU / 1) */
 #define UART_0_IRQ_CHAN     USART1_IRQn
 #define UART_0_ISR          isr_usart1
 /* UART 0 pin configuration */
-#define UART_0_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define UART_0_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define UART_0_PORT         GPIOA
 #define UART_0_TX_PIN       9
 #define UART_0_RX_PIN       10
@@ -100,12 +100,12 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 1 device configuration */
 #define UART_1_DEV          USART2
-#define UART_1_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART2EN)
+#define UART_1_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART2EN))
 #define UART_1_CLK          (CLOCK_CORECLOCK / 2)   /* UART clock runs with 36MHz (F_CPU / 2) */
 #define UART_1_IRQ_CHAN     USART2_IRQn
 #define UART_1_ISR          isr_usart2
 /* UART 1 pin configuration */
-#define UART_1_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIODEN)
+#define UART_1_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIODEN))
 #define UART_1_PORT         GPIOD
 #define UART_1_TX_PIN       5
 #define UART_1_RX_PIN       6
@@ -113,12 +113,12 @@ static const timer_conf_t timer_config[] = {
 
 /* UART 1 device configuration */
 #define UART_2_DEV          USART3
-#define UART_2_CLKEN()      (RCC->APB1ENR |= RCC_APB1ENR_USART3EN)
+#define UART_2_CLKEN()      (periph_clk_en(APB1, RCC_APB1ENR_USART3EN))
 #define UART_2_CLK          (CLOCK_CORECLOCK / 2)  /* UART clock runs with 36MHz (F_CPU / 2) */
 #define UART_2_IRQ_CHAN     USART3_IRQn
 #define UART_2_ISR          isr_usart3
 /* UART 1 pin configuration */
-#define UART_2_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIODEN)
+#define UART_2_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIODEN))
 #define UART_2_PORT         GPIOD
 #define UART_2_TX_PIN       8
 #define UART_2_RX_PIN       9
@@ -164,43 +164,43 @@ static const pwm_conf_t pwm_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
 /* SPI 0 pin configuration */
 #define SPI_0_SCK_PORT          GPIOA
 #define SPI_0_SCK_PIN           5
 #define SPI_0_SCK_AF            5
-#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_MISO_PORT         GPIOA
 #define SPI_0_MISO_PIN          6
 #define SPI_0_MISO_AF           5
-#define SPI_0_MISO_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MISO_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 #define SPI_0_MOSI_PORT         GPIOA
 #define SPI_0_MOSI_PIN          7
 #define SPI_0_MOSI_AF           5
-#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MOSI_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOAEN))
 
 /* SPI 1 device config */
 #define SPI_1_DEV               SPI3
-#define SPI_1_CLKEN()           (RCC->APB1ENR |= RCC_APB1ENR_SPI3EN)
-#define SPI_1_CLKDIS()          (RCC->APB1ENR &= ~RCC_APB1ENR_SPI3EN)
+#define SPI_1_CLKEN()           (periph_clk_en(APB1, RCC_APB1ENR_SPI3EN))
+#define SPI_1_CLKDIS()          (periph_clk_dis(APB1, RCC_APB1ENR_SPI3EN))
 #define SPI_1_IRQ               SPI3_IRQn
 #define SPI_1_IRQ_HANDLER       isr_spi3
 /* SPI 1 pin configuration */
 #define SPI_1_SCK_PORT          GPIOC
 #define SPI_1_SCK_PIN           10
 #define SPI_1_SCK_AF            6
-#define SPI_1_SCK_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define SPI_1_SCK_PORT_CLKEN()  (periph_clk_en(AHB, RCC_AHBENR_GPIOCEN))
 #define SPI_1_MISO_PORT         GPIOC
 #define SPI_1_MISO_PIN          11
 #define SPI_1_MISO_AF           6
-#define SPI_1_MISO_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define SPI_1_MISO_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOCEN))
 #define SPI_1_MOSI_PORT         GPIOC
 #define SPI_1_MOSI_PIN          12
 #define SPI_1_MOSI_AF           6
-#define SPI_1_MOSI_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define SPI_1_MOSI_PORT_CLKEN() (periph_clk_en(AHB, RCC_AHBENR_GPIOCEN))
 /** @} */
 
 /**
@@ -215,8 +215,8 @@ static const pwm_conf_t pwm_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -225,16 +225,16 @@ static const pwm_conf_t pwm_config[] = {
 #define I2C_0_SCL_PORT      GPIOB
 #define I2C_0_SCL_PIN       6
 #define I2C_0_SCL_AF        4
-#define I2C_0_SCL_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define I2C_0_SCL_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 #define I2C_0_SDA_PORT      GPIOB
 #define I2C_0_SDA_PIN       7
 #define I2C_0_SDA_AF        4
-#define I2C_0_SDA_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOBEN)
+#define I2C_0_SDA_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOBEN))
 
 /* I2C 1 device configuration */
 #define I2C_1_DEV           I2C2
-#define I2C_1_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C2EN)
-#define I2C_1_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN))
+#define I2C_1_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C2EN))
+#define I2C_1_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C2EN))
 #define I2C_1_EVT_IRQ       I2C2_EV_IRQn
 #define I2C_1_EVT_ISR       isr_i2c2_ev
 #define I2C_1_ERR_IRQ       I2C2_ER_IRQn
@@ -243,11 +243,11 @@ static const pwm_conf_t pwm_config[] = {
 #define I2C_1_SCL_PORT      GPIOF
 #define I2C_1_SCL_PIN       1
 #define I2C_1_SCL_AF        4
-#define I2C_1_SCL_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOFEN)
+#define I2C_1_SCL_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOFEN))
 #define I2C_1_SDA_PORT      GPIOF
 #define I2C_1_SDA_PIN       0
 #define I2C_1_SDA_AF        4
-#define I2C_1_SDA_CLKEN()   (RCC->AHBENR |= RCC_AHBENR_GPIOFEN)
+#define I2C_1_SDA_CLKEN()   (periph_clk_en(AHB, RCC_AHBENR_GPIOFEN))
 /** @} */
 
 #ifdef __cplusplus
diff --git a/boards/stm32f4discovery/include/periph_conf.h b/boards/stm32f4discovery/include/periph_conf.h
index ff28e418812b55b9d6701d6e680057f95c89a409..1116c1d66b3e5821c73aad49aeebd33f0a448372 100644
--- a/boards/stm32f4discovery/include/periph_conf.h
+++ b/boards/stm32f4discovery/include/periph_conf.h
@@ -186,8 +186,8 @@ static const pwm_conf_t pwm_config[] = {
 
 /* SPI 0 device config */
 #define SPI_0_DEV               SPI1
-#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
-#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKEN()           (periph_clk_en(APB2, RCC_APB2ENR_SPI1EN))
+#define SPI_0_CLKDIS()          (periph_clk_dis(APB2, RCC_APB2ENR_SPI1EN))
 #define SPI_0_BUS_DIV           1   /* 1 -> SPI runs with half CPU clock, 0 -> quarter CPU clock */
 #define SPI_0_IRQ               SPI1_IRQn
 #define SPI_0_IRQ_HANDLER       isr_spi1
@@ -195,20 +195,20 @@ static const pwm_conf_t pwm_config[] = {
 #define SPI_0_SCK_PORT          GPIOA
 #define SPI_0_SCK_PIN           5
 #define SPI_0_SCK_AF            5
-#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_SCK_PORT_CLKEN()  (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MISO_PORT         GPIOA
 #define SPI_0_MISO_PIN          6
 #define SPI_0_MISO_AF           5
-#define SPI_0_MISO_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MISO_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 #define SPI_0_MOSI_PORT         GPIOA
 #define SPI_0_MOSI_PIN          7
 #define SPI_0_MOSI_AF           5
-#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN)
+#define SPI_0_MOSI_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOAEN))
 
 /* SPI 1 device config */
 #define SPI_1_DEV               SPI2
-#define SPI_1_CLKEN()           (RCC->APB1ENR |= RCC_APB1ENR_SPI2EN)
-#define SPI_1_CLKDIS()          (RCC->APB1ENR &= ~RCC_APB1ENR_SPI2EN)
+#define SPI_1_CLKEN()           (periph_clk_en(APB1, RCC_APB1ENR_SPI2EN))
+#define SPI_1_CLKDIS()          (periph_clk_dis(APB1, RCC_APB1ENR_SPI2EN))
 #define SPI_1_BUS_DIV           0   /* 1 -> SPI runs with half CPU clock, 0 -> quarter CPU clock */
 #define SPI_1_IRQ               SPI2_IRQn
 #define SPI_1_IRQ_HANDLER       isr_spi2
@@ -216,15 +216,15 @@ static const pwm_conf_t pwm_config[] = {
 #define SPI_1_SCK_PORT          GPIOB
 #define SPI_1_SCK_PIN           13
 #define SPI_1_SCK_AF            5
-#define SPI_1_SCK_PORT_CLKEN()  (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define SPI_1_SCK_PORT_CLKEN()  (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define SPI_1_MISO_PORT         GPIOB
 #define SPI_1_MISO_PIN          14
 #define SPI_1_MISO_AF           5
-#define SPI_1_MISO_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define SPI_1_MISO_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define SPI_1_MOSI_PORT         GPIOB
 #define SPI_1_MOSI_PIN          15
 #define SPI_1_MOSI_AF           5
-#define SPI_1_MOSI_PORT_CLKEN() (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define SPI_1_MOSI_PORT_CLKEN() (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 /** @} */
 
 /**
@@ -238,8 +238,8 @@ static const pwm_conf_t pwm_config[] = {
 
 /* I2C 0 device configuration */
 #define I2C_0_DEV           I2C1
-#define I2C_0_CLKEN()       (RCC->APB1ENR |= RCC_APB1ENR_I2C1EN)
-#define I2C_0_CLKDIS()      (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKEN()       (periph_clk_en(APB1, RCC_APB1ENR_I2C1EN))
+#define I2C_0_CLKDIS()      (periph_clk_dis(APB1, RCC_APB1ENR_I2C1EN))
 #define I2C_0_EVT_IRQ       I2C1_EV_IRQn
 #define I2C_0_EVT_ISR       isr_i2c1_ev
 #define I2C_0_ERR_IRQ       I2C1_ER_IRQn
@@ -248,11 +248,11 @@ static const pwm_conf_t pwm_config[] = {
 #define I2C_0_SCL_PORT      GPIOB
 #define I2C_0_SCL_PIN       6
 #define I2C_0_SCL_AF        4
-#define I2C_0_SCL_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SCL_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 #define I2C_0_SDA_PORT      GPIOB
 #define I2C_0_SDA_PIN       7
 #define I2C_0_SDA_AF        4
-#define I2C_0_SDA_CLKEN()   (RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN)
+#define I2C_0_SDA_CLKEN()   (periph_clk_en(AHB1, RCC_AHB1ENR_GPIOBEN))
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpu/stm32f0/periph/adc.c b/cpu/stm32f0/periph/adc.c
index fe381fc90ac9571f16ed198f66d3ffd5a0877f0c..8429d66e9332675e981c1161dcda30146ab76698 100644
--- a/cpu/stm32f0/periph/adc.c
+++ b/cpu/stm32f0/periph/adc.c
@@ -44,12 +44,12 @@ static mutex_t lock = MUTEX_INIT;
 static inline void prep(void)
 {
     mutex_lock(&lock);
-    RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
+    periph_clk_en(APB2, RCC_APB2ENR_ADCEN);
 }
 
 static inline void done(void)
 {
-    RCC->APB2ENR &= ~(RCC_APB2ENR_ADCEN);
+    periph_clk_dis(APB2, RCC_APB2ENR_ADCEN);
     mutex_unlock(&lock);
 }
 
diff --git a/cpu/stm32f0/periph/gpio.c b/cpu/stm32f0/periph/gpio.c
index 1a40186f8e172390d7815320eab6a3048bddb510..99fb2e846ba331105b59200c1ee5e8bc14f767d7 100644
--- a/cpu/stm32f0/periph/gpio.c
+++ b/cpu/stm32f0/periph/gpio.c
@@ -67,7 +67,7 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
     int pin_num = _pin_num(pin);
 
     /* enable clock */
-    RCC->AHBENR |= (RCC_AHBENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB, (RCC_AHBENR_GPIOAEN << _port_num(pin)));
 
     /* set mode */
     port->MODER &= ~(0x3 << (2 * pin_num));
@@ -96,7 +96,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
     isr_ctx[pin_num].arg = arg;
 
     /* enable clock of the SYSCFG module for EXTI configuration */
-    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
+    periph_clk_en(APB2, RCC_APB2ENR_SYSCFGCOMPEN);
 
     /* initialize pin as input */
     gpio_init(pin, mode);
@@ -145,7 +145,7 @@ void gpio_init_analog(gpio_t pin)
 {
     /* enable clock, needed as this function can be used without calling
      * gpio_init first */
-    RCC->AHBENR |= (RCC_AHBENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB, (RCC_AHBENR_GPIOAEN << _port_num(pin)));
     /* set to analog mode */
     _port(pin)->MODER |= (0x3 << (2 * _pin_num(pin)));
 }
diff --git a/cpu/stm32f0/periph/rtc.c b/cpu/stm32f0/periph/rtc.c
index 54b90b29a6a29739f36ea70332af1424081c3af2..93bd75f97e91be372fe383e38ebf926cb75f08c9 100644
--- a/cpu/stm32f0/periph/rtc.c
+++ b/cpu/stm32f0/periph/rtc.c
@@ -53,7 +53,7 @@ void rtc_init(void)
 {
 
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Reset RTC domain */
@@ -102,7 +102,7 @@ void rtc_init(void)
 int rtc_set_time(struct tm *time)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Unlock RTC write protection */
@@ -146,7 +146,7 @@ int rtc_get_time(struct tm *time)
 int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Unlock RTC write protection */
@@ -217,7 +217,7 @@ void rtc_poweron(void)
 void rtc_poweroff(void)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Reset RTC domain */
diff --git a/cpu/stm32f1/periph/adc.c b/cpu/stm32f1/periph/adc.c
index d12de67866624ec812f89f170c5edf1e69552f79..a69c71532a1a1878f0bc430d12a3b4c13df4d87b 100644
--- a/cpu/stm32f1/periph/adc.c
+++ b/cpu/stm32f1/periph/adc.c
@@ -57,12 +57,12 @@ static inline ADC_TypeDef *dev(adc_t line)
 static inline void prep(adc_t line)
 {
     mutex_lock(&locks[adc_config[line].dev]);
-    RCC->APB2ENR |= (RCC_APB2ENR_ADC1EN << adc_config[line].dev);
+    periph_clk_en(APB2, (RCC_APB2ENR_ADC1EN << adc_config[line].dev));
 }
 
 static inline void done(adc_t line)
 {
-    RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN << adc_config[line].dev);
+    periph_clk_dis(APB2, (RCC_APB2ENR_ADC1EN << adc_config[line].dev));
     mutex_unlock(&locks[adc_config[line].dev]);
 }
 
diff --git a/cpu/stm32f1/periph/gpio.c b/cpu/stm32f1/periph/gpio.c
index 721edfc06f06437ad909affee6fe10c30bd246a3..06076906c16dc9c68864aca4cc240eee808831d9 100644
--- a/cpu/stm32f1/periph/gpio.c
+++ b/cpu/stm32f1/periph/gpio.c
@@ -85,7 +85,7 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
     }
 
     /* enable the clock for the selected port */
-    RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN << _port_num(pin));
+    periph_clk_en(APB2, (RCC_APB2ENR_IOPAEN << _port_num(pin)));
 
     /* set pin mode */
     port->CR[pin_num >> 3] &= ~(0xf << ((pin_num & 0x7) * 4));
@@ -110,7 +110,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
     exti_ctx[pin_num].cb = cb;
     exti_ctx[pin_num].arg = arg;
     /* enable alternate function clock for the GPIO module */
-    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
+    periph_clk_en(APB2, RCC_APB2ENR_AFIOEN);
     /* configure the EXTI channel */
     AFIO->EXTICR[pin_num >> 2] &= ~(0xf << ((pin_num & 0x3) * 4));
     AFIO->EXTICR[pin_num >> 2] |=  (_port_num(pin) << ((pin_num & 0x3) * 4));
@@ -142,7 +142,7 @@ void gpio_init_af(gpio_t pin, gpio_af_out_t af)
     GPIO_TypeDef *port = _port(pin);
 
     /* enable the clock for the selected port */
-    RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN << _port_num(pin));
+    periph_clk_en(APB2, (RCC_APB2ENR_IOPAEN << _port_num(pin)));
     /* configure the pin */
     port->CR[pin_num >> 3] &= ~(0xf << ((pin_num & 0x7) * 4));
     port->CR[pin_num >> 3] |=  (af << ((pin_num & 0x7) * 4));
@@ -151,7 +151,7 @@ void gpio_init_af(gpio_t pin, gpio_af_out_t af)
 void gpio_init_analog(gpio_t pin)
 {
     /* enable the GPIO port RCC */
-    RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN << _port_num(pin));
+    periph_clk_en(APB2, (RCC_APB2ENR_IOPAEN << _port_num(pin)));
 
     /* map the pin as analog input */
     int pin_num = _pin_num(pin);
diff --git a/cpu/stm32f1/periph/rtt.c b/cpu/stm32f1/periph/rtt.c
index 6a6340d1d9eee9ad5a1581639efaaac03c4881af..766f194ebc94d20079d502d0592d030bd937f63a 100644
--- a/cpu/stm32f1/periph/rtt.c
+++ b/cpu/stm32f1/periph/rtt.c
@@ -155,7 +155,7 @@ void rtt_clear_alarm(void)
 
 void rtt_poweron(void)
 {
-    RCC->APB1ENR |= (RCC_APB1ENR_BKPEN|RCC_APB1ENR_PWREN); /* enable BKP and PWR, Clock */
+    periph_clk_en(APB1, (RCC_APB1ENR_BKPEN|RCC_APB1ENR_PWREN)); /* enable BKP and PWR, Clock */
     /* RTC clock source configuration */
     PWR->CR |= PWR_CR_DBP;                   /* Allow access to BKP Domain */
     RCC->BDCR |= RCC_BDCR_LSEON;             /* Enable LSE OSC */
@@ -168,7 +168,7 @@ void rtt_poweroff(void)
 {
     PWR->CR |= PWR_CR_DBP;                   /* Allow access to BKP Domain */
     RCC->BDCR &= ~RCC_BDCR_RTCEN;            /* disable RTC */
-    RCC->APB1ENR &= ~(RCC_APB1ENR_BKPEN|RCC_APB1ENR_PWREN); /* disable BKP and PWR, Clock */
+    periph_clk_dis(APB1, (RCC_APB1ENR_BKPEN|RCC_APB1ENR_PWREN)); /* disable BKP and PWR, Clock */
 }
 
 inline void _rtt_enter_config_mode(void)
diff --git a/cpu/stm32f1/periph/uart.c b/cpu/stm32f1/periph/uart.c
index c46a867fff23e36f9d17bcc16fa7c905eaf544fe..5a553c712ba9882b17498b999b3ea508747a44b0 100644
--- a/cpu/stm32f1/periph/uart.c
+++ b/cpu/stm32f1/periph/uart.c
@@ -43,10 +43,10 @@ static inline USART_TypeDef *dev(uart_t uart)
 static void clk_en(uart_t uart)
 {
     if (uart_config[uart].bus == APB1) {
-        RCC->APB1ENR |= uart_config[uart].rcc_pin;
+        periph_clk_en(APB1, uart_config[uart].rcc_pin);
     }
     else {
-        RCC->APB2ENR |= uart_config[uart].rcc_pin;
+        periph_clk_en(APB2, uart_config[uart].rcc_pin);
     }
 }
 
diff --git a/cpu/stm32f2/include/periph_cpu.h b/cpu/stm32f2/include/periph_cpu.h
index 29d28648cc03d9f1347c4fe7982c89ede512693c..2c15dce26df08024f3592251fe5491ef25123797 100644
--- a/cpu/stm32f2/include/periph_cpu.h
+++ b/cpu/stm32f2/include/periph_cpu.h
@@ -52,15 +52,6 @@ typedef enum {
 } gpio_mode_t;
 /** @} */
 
-/**
- * @brief   Available peripheral buses
- */
-enum {
-    AHB1,           /**< AHB1 bus */
-    AHB2,           /**< AHB2 bus */
-    AHB3            /**< AHB3 bus */
-};
-
 /**
  * @brief   Available ports on the STM32F2 family
  */
@@ -161,9 +152,9 @@ void gpio_init_analog(gpio_t pin);
 static inline void dma_poweron(int stream)
 {
     if (stream < 8) {
-        RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
+        periph_clk_en(AHB1, RCC_AHB1ENR_DMA1EN);
     } else {
-        RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
+        periph_clk_en(AHB1, RCC_AHB1ENR_DMA2EN);
     }
 }
 
diff --git a/cpu/stm32f2/periph/adc.c b/cpu/stm32f2/periph/adc.c
index 8025ccadf986a249fba8e94dcee9e5c2e423c55a..2aaf639d51412e6c80ce3fa65dd34b0adcdb346e 100644
--- a/cpu/stm32f2/periph/adc.c
+++ b/cpu/stm32f2/periph/adc.c
@@ -60,12 +60,12 @@ static inline ADC_TypeDef *dev(adc_t line)
 static inline void prep(adc_t line)
 {
     mutex_lock(&locks[adc_config[line].dev]);
-    RCC->APB2ENR |= (RCC_APB2ENR_ADC1EN << adc_config[line].dev);
+    periph_clk_en(APB2, (RCC_APB2ENR_ADC1EN << adc_config[line].dev));
 }
 
 static inline void done(adc_t line)
 {
-    RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN << adc_config[line].dev);
+    periph_clk_dis(APB2, (RCC_APB2ENR_ADC1EN << adc_config[line].dev));
     mutex_unlock(&locks[adc_config[line].dev]);
 }
 
diff --git a/cpu/stm32f2/periph/dac.c b/cpu/stm32f2/periph/dac.c
index f7dc2c99dd0fc9a48e4547e9469d16147141fa69..0336480e767f63dac27d427a5279e95d1dace56f 100644
--- a/cpu/stm32f2/periph/dac.c
+++ b/cpu/stm32f2/periph/dac.c
@@ -45,7 +45,7 @@ int8_t dac_init(dac_t line)
     /* configure pin */
     gpio_init_analog(dac_config[line].pin);
     /* enable the DAC's clock */
-    RCC->APB1ENR |= RCC_APB1ENR_DACEN;
+    periph_clk_en(APB1, RCC_APB1ENR_DACEN);
     /* reset output and enable the line's channel */
     dac_set(line, 0);
     dac_poweron(line);
diff --git a/cpu/stm32f2/periph/gpio.c b/cpu/stm32f2/periph/gpio.c
index 6ce2f513e06f59b1109a1cb2f25a956dc21dd736..d7d90e672d0b444d6dcbb394ee8d451b2b338b24 100644
--- a/cpu/stm32f2/periph/gpio.c
+++ b/cpu/stm32f2/periph/gpio.c
@@ -68,7 +68,7 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
     int pin_num = _pin_num(pin);
 
     /* enable clock */
-    RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB1, (RCC_AHB1ENR_GPIOAEN << _port_num(pin)));
 
     /* set mode */
     port->MODER &= ~(0x3 << (2 * pin_num));
@@ -96,7 +96,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
     exti_chan[pin_num].cb = cb;
     exti_chan[pin_num].arg = arg;
     /* enable the SYSCFG clock */
-    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
+    periph_clk_en(APB2, RCC_APB2ENR_SYSCFGEN);
     /* initialize pin as input */
     gpio_init(pin, mode);
     /* enable global pin interrupt */
@@ -150,7 +150,7 @@ void gpio_init_af(gpio_t pin, gpio_af_t af)
 void gpio_init_analog(gpio_t pin)
 {
     /* enable clock */
-    RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB1, (RCC_AHB1ENR_GPIOAEN << _port_num(pin)));
     /* set to analog mode */
     _port(pin)->MODER |= (0x3 << (2 * _pin_num(pin)));
 }
diff --git a/cpu/stm32f2/periph/hwrng.c b/cpu/stm32f2/periph/hwrng.c
index c1063e29a5736152d076373c6ac4987605e4ef50..6412c1e6729cda417edabcfe8405a005163a1500 100644
--- a/cpu/stm32f2/periph/hwrng.c
+++ b/cpu/stm32f2/periph/hwrng.c
@@ -30,9 +30,9 @@
 void hwrng_init(void)
 {
     /* enable RNG reset state */
-    RCC->AHB2ENR |= RCC_AHB2ENR_RNGEN;
+    periph_clk_en(AHB2, RCC_AHB2ENR_RNGEN);
     /* release RNG from reset state */
-    RCC->AHB2ENR &= ~RCC_AHB2ENR_RNGEN;
+    periph_clk_dis(AHB2, RCC_AHB2ENR_RNGEN);
 }
 
 
@@ -43,7 +43,7 @@ void hwrng_read(uint8_t *buf, unsigned int num)
     unsigned int count = 0;
 
     /* enable RNG reset state */
-    RCC->AHB2ENR |= RCC_AHB2ENR_RNGEN;
+    periph_clk_en(AHB2, RCC_AHB2ENR_RNGEN);
     /* enable the RNG */
     RNG->CR |= RNG_CR_RNGEN;
 
@@ -62,7 +62,7 @@ void hwrng_read(uint8_t *buf, unsigned int num)
     /* disable the RNG */
     RNG->CR &= ~RNG_CR_RNGEN;
     /* release RNG from reset state */
-    RCC->AHB2ENR &= ~RCC_AHB2ENR_RNGEN;
+    periph_clk_dis(AHB2, RCC_AHB2ENR_RNGEN);
 }
 
 #endif /* RANDOM_NUMOF */
diff --git a/cpu/stm32f2/periph/rtc.c b/cpu/stm32f2/periph/rtc.c
index 53400f931a663f39f4b88c0bb8d2b7c506e607c6..4b29580a827cd0c644d2822bdae44f588add1bbc 100644
--- a/cpu/stm32f2/periph/rtc.c
+++ b/cpu/stm32f2/periph/rtc.c
@@ -52,7 +52,7 @@ void rtc_init(void)
 {
 
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Reset RTC domain */
@@ -103,7 +103,7 @@ void rtc_init(void)
 int rtc_set_time(struct tm *time)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Unlock RTC write protection */
@@ -158,7 +158,7 @@ int rtc_get_time(struct tm *time)
 int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Unlock RTC write protection */
@@ -232,7 +232,7 @@ void rtc_poweron(void)
 void rtc_poweroff(void)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Reset RTC domain */
diff --git a/cpu/stm32f2/periph/uart.c b/cpu/stm32f2/periph/uart.c
index 148e86b13c836eb3f4b68d67f570976663a88a4b..74d6492459d9bc173f44066e3bf69ccaaefb613d 100644
--- a/cpu/stm32f2/periph/uart.c
+++ b/cpu/stm32f2/periph/uart.c
@@ -177,20 +177,20 @@ void uart_write(uart_t uart, const uint8_t *data, size_t len)
 void uart_poweron(uart_t uart)
 {
     if (_bus(uart) == 1) {
-        RCC->APB1ENR |= uart_config[uart].rcc_mask;
+        periph_clk_en(APB1, uart_config[uart].rcc_mask);
     }
     else {
-        RCC->APB2ENR |= uart_config[uart].rcc_mask;
+        periph_clk_en(APB2, uart_config[uart].rcc_mask);
     }
 }
 
 void uart_poweroff(uart_t uart)
 {
     if (_bus(uart) == 1) {
-        RCC->APB1ENR &= ~(uart_config[uart].rcc_mask);
+        periph_clk_dis(APB1, uart_config[uart].rcc_mask);
     }
     else {
-        RCC->APB2ENR &= ~(uart_config[uart].rcc_mask);
+        periph_clk_dis(APB2, uart_config[uart].rcc_mask);
     }
 }
 
diff --git a/cpu/stm32f3/periph/gpio.c b/cpu/stm32f3/periph/gpio.c
index 0559e1acf5195ffec37f37dda4c3f4cca252cde8..00248550ebf77ef6e1eaa8065e20f7829d1a9823 100644
--- a/cpu/stm32f3/periph/gpio.c
+++ b/cpu/stm32f3/periph/gpio.c
@@ -67,7 +67,7 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
     int pin_num = _pin_num(pin);
 
     /* enable clock */
-    RCC->AHBENR |= (RCC_AHBENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB, (RCC_AHBENR_GPIOAEN << _port_num(pin)));
 
     /* set mode */
     port->MODER &= ~(0x3 << (2 * pin_num));
@@ -95,7 +95,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
     exti_chan[pin_num].cb = cb;
     exti_chan[pin_num].arg = arg;
     /* enable the SYSCFG clock */
-    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
+    periph_clk_en(APB2, RCC_APB2ENR_SYSCFGEN);
     /* configure pin as input */
     gpio_init(pin, mode);
     /* enable global pin interrupt */
@@ -150,7 +150,7 @@ void gpio_init_analog(gpio_t pin)
 {
     /* enable clock, needed as this function can be used without calling
      * gpio_init first */
-    RCC->AHBENR |= (RCC_AHBENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB, (RCC_AHBENR_GPIOAEN << _port_num(pin)));
     /* set to analog mode */
     _port(pin)->MODER |= (0x3 << (2 * _pin_num(pin)));
 }
diff --git a/cpu/stm32f4/cpu.c b/cpu/stm32f4/cpu.c
index 445e5983dc0481d49e06ef0367a84fd06a55d50a..b2e50c6988cbc58581f1d76baa1c338e9f251408 100644
--- a/cpu/stm32f4/cpu.c
+++ b/cpu/stm32f4/cpu.c
@@ -89,7 +89,7 @@ static void cpu_clock_init(void)
     /* setup power module */
 
     /* enable the power module */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     /* set the voltage scaling to 1 to enable the maximum frequency */
     PWR->CR |= PWR_CR_VOS_1;
 
diff --git a/cpu/stm32f4/include/periph_cpu.h b/cpu/stm32f4/include/periph_cpu.h
index 25eddf38bd8300f99d93f0c79235b39f31cdf800..c010d32cbb5dd4b855ea09188c6cb19078a1f051 100644
--- a/cpu/stm32f4/include/periph_cpu.h
+++ b/cpu/stm32f4/include/periph_cpu.h
@@ -154,10 +154,10 @@ void gpio_init_af(gpio_t pin, gpio_af_t af);
 static inline void dma_poweron(int stream)
 {
     if (stream < 8) {
-        RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
+        periph_clk_en(AHB1, RCC_AHB1ENR_DMA1EN);
     }
     else {
-        RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
+        periph_clk_en(AHB1, RCC_AHB1ENR_DMA2EN);
     }
 }
 
diff --git a/cpu/stm32f4/periph/adc.c b/cpu/stm32f4/periph/adc.c
index 8be40712b3d460c79b7943f55df3f8eead2b61df..2de09ae87c2948a6b53eb75bb3607a7fa5bda9b6 100644
--- a/cpu/stm32f4/periph/adc.c
+++ b/cpu/stm32f4/periph/adc.c
@@ -56,12 +56,12 @@ static inline ADC_TypeDef *dev(adc_t line)
 static inline void prep(adc_t line)
 {
     mutex_lock(&locks[adc_config[line].dev]);
-    RCC->APB2ENR |= (RCC_APB2ENR_ADC1EN << adc_config[line].dev);
+    periph_clk_en(APB2, (RCC_APB2ENR_ADC1EN << adc_config[line].dev));
 }
 
 static inline void done(adc_t line)
 {
-    RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN << adc_config[line].dev);
+    periph_clk_dis(APB2, (RCC_APB2ENR_ADC1EN << adc_config[line].dev));
     mutex_unlock(&locks[adc_config[line].dev]);
 }
 
diff --git a/cpu/stm32f4/periph/gpio.c b/cpu/stm32f4/periph/gpio.c
index 4ebb07d18e91ab726b557f7da8fcec462aa78687..159013a1c7f795c2c179ef8dc6aacf40224cae0d 100644
--- a/cpu/stm32f4/periph/gpio.c
+++ b/cpu/stm32f4/periph/gpio.c
@@ -68,7 +68,7 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
     int pin_num = _pin_num(pin);
 
     /* enable clock */
-    RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB1, (RCC_AHB1ENR_GPIOAEN << _port_num(pin)));
 
     /* set mode */
     port->MODER &= ~(0x3 << (2 * pin_num));
@@ -96,7 +96,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
     exti_chan[pin_num].cb = cb;
     exti_chan[pin_num].arg = arg;
     /* enable the SYSCFG clock */
-    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
+    periph_clk_en(APB2, RCC_APB2ENR_SYSCFGEN);
     /* initialize pin as input */
     gpio_init(pin, mode);
     /* enable global pin interrupt */
@@ -150,7 +150,7 @@ void gpio_init_af(gpio_t pin, gpio_af_t af)
 void gpio_init_analog(gpio_t pin)
 {
     /* enable clock */
-    RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB1, (RCC_AHB1ENR_GPIOAEN << _port_num(pin)));
     /* set to analog mode */
     _port(pin)->MODER |= (0x3 << (2 * _pin_num(pin)));
 }
diff --git a/cpu/stm32f4/periph/hwrng.c b/cpu/stm32f4/periph/hwrng.c
index 5f60bfe367e05697c54ea451a364568d3e8ae1c5..f5acc728237de2d4f34fa22b46f119a1b6927e8d 100644
--- a/cpu/stm32f4/periph/hwrng.c
+++ b/cpu/stm32f4/periph/hwrng.c
@@ -19,6 +19,7 @@
  */
 
 #include "cpu.h"
+#include "periph_conf.h"
 #include "periph/hwrng.h"
 
 /* only build if the CPU actually provides a RNG peripheral */
@@ -34,7 +35,7 @@ void hwrng_read(uint8_t *buf, unsigned int num)
     unsigned int count = 0;
 
     /* power on and enable the device */
-    RCC->AHB2ENR |= RCC_AHB2ENR_RNGEN;
+    periph_clk_en(AHB2, RCC_AHB2ENR_RNGEN);
     RNG->CR = RNG_CR_RNGEN;
 
     /* get random data */
@@ -52,7 +53,7 @@ void hwrng_read(uint8_t *buf, unsigned int num)
 
     /* finally disable the device again */
     RNG->CR = 0;
-    RCC->AHB2ENR &= ~RCC_AHB2ENR_RNGEN;
+    periph_clk_dis(AHB2, RCC_AHB2ENR_RNGEN);
 }
 
 #endif /* CPUID_LEN */
diff --git a/cpu/stm32l1/cpu.c b/cpu/stm32l1/cpu.c
index 63891d5c399dcd7aa5736e7cd15d245576de3818..bf092531d642d850e36ed22faa01d0473583e21d 100644
--- a/cpu/stm32l1/cpu.c
+++ b/cpu/stm32l1/cpu.c
@@ -75,7 +75,7 @@ static void clk_init(void)
     /* Flash 1 wait state */
     FLASH->ACR |= CLOCK_FLASH_LATENCY;
     /* Power enable */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     /* Select the Voltage Range 1 (1.8 V) */
     PWR->CR = PWR_CR_VOS_0;
     /* Wait Until the Voltage Regulator is ready */
diff --git a/cpu/stm32l1/periph/gpio.c b/cpu/stm32l1/periph/gpio.c
index 94f81a563b9d4fded0b3ee6ec97ba7cedaa66d25..7485cae5b2d2503aadc59a24e9c4b8786b88c1aa 100644
--- a/cpu/stm32l1/periph/gpio.c
+++ b/cpu/stm32l1/periph/gpio.c
@@ -69,7 +69,7 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
     int pin_num = _pin_num(pin);
 
     /* enable clock */
-    RCC->AHBENR |= (RCC_AHBENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB, (RCC_AHBENR_GPIOAEN << _port_num(pin)));
 
     /* set mode */
     port->MODER &= ~(0x3 << (2 * pin_num));
@@ -97,7 +97,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
     exti_chan[pin_num].cb = cb;
     exti_chan[pin_num].arg = arg;
     /* enable the SYSCFG clock */
-    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
+    periph_clk_en(APB2, RCC_APB2ENR_SYSCFGEN);
     /* initialize pin as input */
     gpio_init(pin, mode);
     /* enable global pin interrupt */
@@ -152,7 +152,7 @@ void gpio_init_analog(gpio_t pin)
 {
     /* enable clock, needed as this function can be used without calling
      * gpio_init first */
-    RCC->AHBENR |= (RCC_AHBENR_GPIOAEN << _port_num(pin));
+    periph_clk_en(AHB, (RCC_AHBENR_GPIOAEN << _port_num(pin)));
     /* set to analog mode */
     _port(pin)->MODER |= (0x3 << (2 * _pin_num(pin)));
 }
diff --git a/cpu/stm32l1/periph/i2c.c b/cpu/stm32l1/periph/i2c.c
index c3f6e6c2182ef0c73514c95c2537584a1457e281..1a7b36b8e73c382ddc17ff112c023c244d3d2184 100644
--- a/cpu/stm32l1/periph/i2c.c
+++ b/cpu/stm32l1/periph/i2c.c
@@ -344,7 +344,7 @@ int i2c_write_regs(i2c_t dev, uint8_t address, uint8_t reg, const void *data, in
 void i2c_poweron(i2c_t dev)
 {
     if ((unsigned int)dev < I2C_NUMOF) {
-        RCC->APB1ENR |= (RCC_APB1ENR_I2C1EN << dev);
+        periph_clk_en(APB1, (RCC_APB1ENR_I2C1EN << dev));
     }
 }
 
@@ -352,7 +352,7 @@ void i2c_poweroff(i2c_t dev)
 {
     if ((unsigned int)dev < I2C_NUMOF) {
         while (i2c_config[dev].dev->SR2 & I2C_SR2_BUSY) {}
-        RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN << dev);
+        periph_clk_dis(APB1, (RCC_APB1ENR_I2C1EN << dev));
     }
 }
 
diff --git a/cpu/stm32l1/periph/rtc.c b/cpu/stm32l1/periph/rtc.c
index 1701ac876fd1f491ef3982a9bdc8903a8bc3ffae..6339d82b0aca53c218054260abb7cf109d09e2d5 100644
--- a/cpu/stm32l1/periph/rtc.c
+++ b/cpu/stm32l1/periph/rtc.c
@@ -83,7 +83,7 @@ void rtc_init(void)
 int rtc_set_time(struct tm *time)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Unlock RTC write protection */
@@ -127,7 +127,7 @@ int rtc_get_time(struct tm *time)
 int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Unlock RTC write protection */
@@ -193,7 +193,7 @@ void rtc_clear_alarm(void)
 void rtc_poweron(void)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Reset RTC domain */
@@ -217,7 +217,7 @@ void rtc_poweron(void)
 void rtc_poweroff(void)
 {
     /* Enable write access to RTC registers */
-    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
+    periph_clk_en(APB1, RCC_APB1ENR_PWREN);
     PWR->CR |= PWR_CR_DBP;
 
     /* Reset RTC domain */