From 84b2bfe3135990983d55fd4d530139cf8ddb1f33 Mon Sep 17 00:00:00 2001 From: adelyser <12093019+adelyser@users.noreply.github.com> Date: Mon, 27 Jun 2022 08:16:09 -0600 Subject: [PATCH] stm32: Add MCU temp for Stm32h7 (#5606) Added mcu temperature to the stm32h7 processor. Signed-off-by: Aaron DeLyser --- klippy/extras/temperature_mcu.py | 6 ++++++ src/stm32/stm32h7_adc.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/klippy/extras/temperature_mcu.py b/klippy/extras/temperature_mcu.py index 349050a9..e82761b5 100644 --- a/klippy/extras/temperature_mcu.py +++ b/klippy/extras/temperature_mcu.py @@ -72,6 +72,7 @@ class PrinterTemperatureMCU: ('stm32f070', self.config_stm32f070), ('stm32f072', self.config_stm32f0x2), ('stm32g0', self.config_stm32g0), + ('stm32h7', self.config_stm32h7), ('', self.config_unknown)] for name, func in cfg_funcs: if self.mcu_type.startswith(name): @@ -143,6 +144,11 @@ class PrinterTemperatureMCU: cal_adc_130 = self.read16(0x1FFF75CA) * 3.0 / (3.3 * 4095.) self.slope = (130. - 30.) / (cal_adc_130 - cal_adc_30) self.base_temperature = self.calc_base(30., cal_adc_30) + def config_stm32h7(self): + cal_adc_30 = self.read16(0x1FF1E820) / 65535. + cal_adc_110 = self.read16(0x1FF1E840) / 65535. + self.slope = (110. - 30.) / (cal_adc_110 - cal_adc_30) + self.base_temperature = self.calc_base(30., cal_adc_30) def read16(self, addr): params = self.debug_read_cmd.send([1, addr]) return params['val'] diff --git a/src/stm32/stm32h7_adc.c b/src/stm32/stm32h7_adc.c index 2733b24f..ca149d3d 100644 --- a/src/stm32/stm32h7_adc.c +++ b/src/stm32/stm32h7_adc.c @@ -22,6 +22,9 @@ #define ADC_ISR_LDORDY_Msk (0x1UL << ADC_ISR_LDORDY_Pos) #define ADC_ISR_LDORDY ADC_ISR_LDORDY_Msk +#define ADC_TEMPERATURE_PIN 0xfe +DECL_ENUMERATION("pin", "ADC_TEMPERATURE", ADC_TEMPERATURE_PIN); + DECL_CONSTANT("ADC_MAX", 4095); // GPIOs like A0_C are not covered! @@ -88,7 +91,7 @@ static const uint8_t adc_pins[] = { GPIO('H', 4), // ADC3_INP15 GPIO('H', 5), // ADC3_INP16 0, // Vbat/4 - 0, // VSENSE + ADC_TEMPERATURE_PIN,// VSENSE 0, // VREFINT }; @@ -185,7 +188,13 @@ gpio_adc_setup(uint32_t pin) MODIFY_REG(adc->CFGR2, ADC_CFGR2_OVSS_Msk, OVERSAMPLES_EXPONENT << ADC_CFGR2_OVSS_Pos); } - gpio_peripheral(pin, GPIO_ANALOG, 0); + + if (pin == ADC_TEMPERATURE_PIN) { + ADC3_COMMON->CCR = ADC_CCR_TSEN; + } else { + gpio_peripheral(pin, GPIO_ANALOG, 0); + } + // Preselect (connect) channel adc->PCSEL |= (1 << chan); return (struct gpio_adc){ .adc = adc, .chan = chan };