diff --git a/include/libopencm3/stm32/h7/rcc.h b/include/libopencm3/stm32/h7/rcc.h
index 0612b3f5..8593d076 100644
--- a/include/libopencm3/stm32/h7/rcc.h
+++ b/include/libopencm3/stm32/h7/rcc.h
@@ -394,6 +394,7 @@ LGPL License Terms @ref lgpl_license
#define RCC_D2CCIP2R_CECSEL_SHIFT 22
#define RCC_D2CCIP2R_USBSEL_SHIFT 20
#define RCC_D2CCIP2R_I2C123SEL_SHIFT 12
+#define RCC_D2CCIP2R_RNGSEL_MASK 0x3
#define RCC_D2CCIP2R_RNGSEL_SHIFT 8
#define RCC_D2CCIP2R_USART16SEL_SHIFT 3
#define RCC_D2CCIP2R_USART234578SEL_SHIFT 0
@@ -402,6 +403,10 @@ LGPL License Terms @ref lgpl_license
/** @defgroup rcc_d2ccip2r_values RCC_D2CCIP2R Values
* @ingroup rcc_registers
* @{*/
+#define RCC_D2CCIP2R_RNGSEL_HSI48 0
+#define RCC_D2CCIP2R_RNGSEL_PLL1Q 1
+#define RCC_D2CCIP2R_RNGSEL_LSE 2
+#define RCC_D2CCIP2R_RNGSEL_LSI 3
#define RCC_D2CCIP2R_USART16SEL_PCLK2 0
#define RCC_D2CCIP2R_USART234578SEL_PCLK1 0
#define RCC_D2CCIP2R_USARTSEL_PLL2Q 1
@@ -774,6 +779,12 @@ void rcc_set_spi123_clksel(uint8_t clksel);
*/
void rcc_set_spi45_clksel(uint8_t clksel);
+/**
+ * Set the clock select for the RNG device.
+ * @param[in] clksel Clock source to configure for. @ref rcc_d2ccip2r_values
+ * @sa rcc_set_peripheral_clk_sel for equivalent generic functionality
+ */
+void rcc_set_rng_clksel(uint8_t clksel);
END_DECLS
/**@}*/
diff --git a/include/libopencm3/stm32/h7/rng.h b/include/libopencm3/stm32/h7/rng.h
new file mode 100644
index 00000000..09d014d1
--- /dev/null
+++ b/include/libopencm3/stm32/h7/rng.h
@@ -0,0 +1,23 @@
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * This library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see .
+ */
+
+#ifndef LIBOPENCM3_RNG_H
+#define LIBOPENCM3_RNG_H
+
+#include
+
+#endif
diff --git a/include/libopencm3/stm32/rng.h b/include/libopencm3/stm32/rng.h
index 58878c71..01f1b104 100644
--- a/include/libopencm3/stm32/rng.h
+++ b/include/libopencm3/stm32/rng.h
@@ -26,6 +26,8 @@
# include
#elif defined(STM32F7)
# include
+#elif defined(STM32H7)
+# include
#elif defined(STM32L0)
# include
#elif defined(STM32L4)
diff --git a/lib/stm32/h7/Makefile b/lib/stm32/h7/Makefile
index 181ec524..737c2fc7 100644
--- a/lib/stm32/h7/Makefile
+++ b/lib/stm32/h7/Makefile
@@ -44,6 +44,7 @@ OBJS += fmc_common_f47.o
OBJS += gpio_common_all.o gpio_common_f0234.o
OBJS += pwr.o rcc.o
OBJS += rcc_common_all.o
+OBJS += rng_common_v1.o
OBJS += spi_common_all.o spi_common_v2.o
OBJS += timer_common_all.o
OBJS += usart_common_v2.o usart_common_fifos.o
diff --git a/lib/stm32/h7/rcc.c b/lib/stm32/h7/rcc.c
index 4a24f7ec..0977ebdf 100644
--- a/lib/stm32/h7/rcc.c
+++ b/lib/stm32/h7/rcc.c
@@ -361,6 +361,11 @@ void rcc_set_peripheral_clk_sel(uint32_t periph, uint32_t sel) {
mask = RCC_D2CCIP1R_FDCANSEL_MASK << RCC_D2CCIP1R_FDCANSEL_SHIFT;
val = sel << RCC_D2CCIP1R_FDCANSEL_SHIFT;
break;
+ case RNG_BASE:
+ reg = &RCC_D2CCIP2R;
+ mask = RCC_D2CCIP2R_RNGSEL_MASK << RCC_D2CCIP2R_RNGSEL_SHIFT;
+ val = sel << RCC_D2CCIP2R_RNGSEL_SHIFT;
+ break;
case SPI1_BASE:
case SPI2_BASE:
case SPI3_BASE:
@@ -406,6 +411,11 @@ void rcc_set_fdcan_clksel(uint8_t clksel) {
RCC_D2CCIP1R |= clksel << RCC_D2CCIP1R_FDCANSEL_SHIFT;
}
+void rcc_set_rng_clksel(uint8_t clksel) {
+ RCC_D2CCIP2R &= ~(RCC_D2CCIP2R_RNGSEL_MASK << RCC_D2CCIP2R_RNGSEL_SHIFT);
+ RCC_D2CCIP2R |= clksel << RCC_D2CCIP2R_RNGSEL_SHIFT;
+}
+
void rcc_set_spi123_clksel(uint8_t clksel) {
RCC_D2CCIP1R &= ~(RCC_D2CCIP1R_SPI123SEL_MASK << RCC_D2CCIP1R_SPI123SEL_SHIFT);
RCC_D2CCIP1R |= clksel << RCC_D2CCIP1R_SPI123SEL_SHIFT;