Skip to content

Commit 8d2ede6

Browse files
JohnK1987Jan Kamidra
andauthored
Add AnalogIn and AnalogOut APIs support for STM32H5 (#314)
* fix PWM pin map in context of Timer change * Note about DAC on Nucleo-H503RB * Add ADC and DAC for STM32H5 * Copyright fix * ADC/DAC fix --------- Co-authored-by: Jan Kamidra <[email protected]>
1 parent c1e3c86 commit 8d2ede6

File tree

6 files changed

+390
-24
lines changed

6 files changed

+390
-24
lines changed

targets/TARGET_STM/TARGET_STM32H5/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ add_library(mbed-stm32h5 INTERFACE)
1010
target_sources(mbed-stm32h5
1111
INTERFACE
1212
clock_cfg/system_clock.c
13+
analogin_device.c
14+
analogout_device.c
1315
gpio_irq_device.c
1416
serial_device.c
1517
pwmout_device.c

targets/TARGET_STM/TARGET_STM32H5/TARGET_STM32H503xB/TARGET_NUCLEO_H503RB/PeripheralPins.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ MBED_WEAK const PinMap PinMap_ADC_Internal[] = {
6868
};
6969

7070
//*** DAC ***
71-
71+
// Not usable in case of Nucleo-H503RB board because both pins are already used.
7272
MBED_WEAK const PinMap PinMap_DAC[] = {
7373
{PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1 // Connected to STDIO_UART_TX
7474
{PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 // Connected to USER_LED

targets/TARGET_STM/TARGET_STM32H5/TARGET_STM32H563xI/TARGET_NUCLEO_H563ZI/PeripheralPins.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,43 +128,43 @@ MBED_WEAK const PinMap PinMap_I2C_SCL[] = {
128128

129129
//*** PWM ***
130130

131-
// TIM5 cannot be used because already used by the us_ticker
131+
// TIM3 cannot be used because already used by the us_ticker
132132
// (update us_ticker_data.h file if another timer is chosen)
133133
MBED_WEAK const PinMap PinMap_PWM[] = {
134-
//{PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
134+
{PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
135135
{PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1
136-
//{PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
136+
{PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
137137
{PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2
138138
{PA_1_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N
139-
//{PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
139+
{PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
140140
{PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3
141141
{PA_2_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 1, 0)}, // TIM15_CH1
142-
//{PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
142+
{PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
143143
{PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4
144144
{PA_3_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 2, 0)}, // TIM15_CH2
145-
//{PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
145+
{PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
146146
{PA_5_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N
147-
{PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
147+
//{PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
148148
{PA_6_ALT0, PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1
149149
{PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
150-
{PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
150+
//{PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
151151
{PA_7_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N
152152
{PA_7_ALT2, PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1
153153
{PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
154154
{PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2
155155
{PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3
156156
{PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
157-
//{PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
157+
{PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
158158
{PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
159-
{PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
159+
//{PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
160160
{PB_0_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N
161161
{PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
162-
{PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
162+
//{PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
163163
{PB_1_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
164164
{PB_2, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 4, 1)}, // TIM8_CH4N
165-
//{PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
166-
{PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
167-
{PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
165+
{PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
166+
//{PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
167+
//{PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
168168
{PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1
169169
{PB_6_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N
170170
{PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2
@@ -173,7 +173,7 @@ MBED_WEAK const PinMap PinMap_PWM[] = {
173173
{PB_8_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1
174174
{PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
175175
{PB_9_ALT0, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1
176-
//{PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
176+
{PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
177177
{PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
178178
{PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
179179
{PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N
@@ -183,15 +183,15 @@ MBED_WEAK const PinMap PinMap_PWM[] = {
183183
{PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM12, 2, 0)}, // TIM12_CH2
184184
{PC_2, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
185185
{PC_2_ALT0, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1
186-
//{PC_4, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
186+
{PC_4, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
187187
{PC_5, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 4, 1)}, // TIM1_CH4N
188-
{PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
188+
//{PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
189189
{PC_6_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1
190-
{PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
190+
//{PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
191191
{PC_7_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2
192-
{PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
192+
//{PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
193193
{PC_8_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3
194-
{PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
194+
//{PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
195195
{PC_9_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4
196196
{PC_12, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM15, 1, 0)}, // TIM15_CH1
197197
{PD_0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 4, 1)}, // TIM8_CH4N
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
/* mbed Microcontroller Library
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
******************************************************************************
4+
*
5+
* Copyright (c) 2015-2024 STMicroelectronics.
6+
* All rights reserved.
7+
*
8+
* This software component is licensed by ST under BSD 3-Clause license,
9+
* the "License"; You may not use this file except in compliance with the
10+
* License. You may obtain a copy of the License at:
11+
* opensource.org/licenses/BSD-3-Clause
12+
*
13+
******************************************************************************
14+
*/
15+
16+
#include "mbed_assert.h"
17+
#include "analogin_api.h"
18+
19+
#if DEVICE_ANALOGIN
20+
21+
#include "mbed_wait_api.h"
22+
#include "cmsis.h"
23+
#include "pinmap.h"
24+
#include "mbed_error.h"
25+
#include "PeripheralPins.h"
26+
27+
28+
void analogin_clock_configuration(void)
29+
{
30+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
31+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
32+
PeriphClkInitStruct.AdcDacClockSelection = LL_RCC_ADCDAC_CLKSOURCE_HCLK;
33+
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
34+
error("analogin_init HAL_RCCEx_PeriphCLKConfig");
35+
}
36+
}
37+
38+
void analogin_init(analogin_t *obj, PinName pin)
39+
{
40+
uint32_t function = (uint32_t)NC;
41+
42+
// ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...)
43+
// are described in PinNames.h and PeripheralPins.c
44+
// Pin value must be between 0xF0 and 0xFF
45+
if ((pin < 0xF0) || (pin >= (PinName)ALT0)) {
46+
// Normal channels
47+
// Get the peripheral name from the pin and assign it to the object
48+
obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC);
49+
// Get the functions (adc channel) from the pin and assign it to the object
50+
function = pinmap_function(pin, PinMap_ADC);
51+
// Configure GPIO
52+
pinmap_pinout(pin, PinMap_ADC);
53+
} else {
54+
// Internal channels
55+
obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal);
56+
function = pinmap_function(pin, PinMap_ADC_Internal);
57+
// No GPIO configuration for internal channels
58+
}
59+
MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
60+
MBED_ASSERT(function != (uint32_t)NC);
61+
62+
analogin_clock_configuration();
63+
64+
obj->channel = STM_PIN_CHANNEL(function);
65+
obj->differential = STM_PIN_INVERTED(function);
66+
67+
// Save pin number for the read function
68+
obj->pin = pin;
69+
70+
// Configure ADC object structures
71+
obj->handle.State = HAL_ADC_STATE_RESET;
72+
obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV10;
73+
obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
74+
obj->handle.Init.ScanConvMode = ADC_SCAN_DISABLE;
75+
obj->handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
76+
obj->handle.Init.LowPowerAutoWait = DISABLE;
77+
obj->handle.Init.ContinuousConvMode = DISABLE;
78+
obj->handle.Init.NbrOfConversion = 1;
79+
obj->handle.Init.DiscontinuousConvMode = DISABLE;
80+
obj->handle.Init.NbrOfDiscConversion = 0;
81+
obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
82+
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
83+
obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
84+
obj->handle.Init.OversamplingMode = DISABLE;
85+
obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
86+
87+
__HAL_RCC_ADC_CLK_ENABLE();
88+
89+
if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
90+
error("analogin_init HAL_ADC_Init");
91+
}
92+
93+
// Calibration
94+
HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED);
95+
}
96+
97+
uint16_t adc_read(analogin_t *obj)
98+
{
99+
ADC_ChannelConfTypeDef sConfig = {0};
100+
101+
// Configure ADC channel
102+
sConfig.Rank = ADC_REGULAR_RANK_1;
103+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
104+
sConfig.Offset = 0;
105+
sConfig.SingleDiff = ADC_SINGLE_ENDED;
106+
sConfig.OffsetNumber = ADC_OFFSET_NONE;
107+
108+
switch (obj->pin) {
109+
case ADC_TEMP:
110+
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
111+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
112+
break;
113+
114+
case ADC_VREF:
115+
sConfig.Channel = ADC_CHANNEL_VREFINT;
116+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
117+
break;
118+
119+
case ADC_VBAT:
120+
sConfig.Channel = ADC_CHANNEL_VBAT;
121+
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
122+
break;
123+
124+
default:
125+
switch (obj->channel) {
126+
case 0:
127+
sConfig.Channel = ADC_CHANNEL_0;
128+
break;
129+
case 1:
130+
sConfig.Channel = ADC_CHANNEL_1;
131+
break;
132+
case 2:
133+
sConfig.Channel = ADC_CHANNEL_2;
134+
break;
135+
case 3:
136+
sConfig.Channel = ADC_CHANNEL_3;
137+
break;
138+
case 4:
139+
sConfig.Channel = ADC_CHANNEL_4;
140+
break;
141+
case 5:
142+
sConfig.Channel = ADC_CHANNEL_5;
143+
break;
144+
case 6:
145+
sConfig.Channel = ADC_CHANNEL_6;
146+
break;
147+
case 7:
148+
sConfig.Channel = ADC_CHANNEL_7;
149+
break;
150+
case 8:
151+
sConfig.Channel = ADC_CHANNEL_8;
152+
break;
153+
case 9:
154+
sConfig.Channel = ADC_CHANNEL_9;
155+
break;
156+
case 10:
157+
sConfig.Channel = ADC_CHANNEL_10;
158+
break;
159+
case 11:
160+
sConfig.Channel = ADC_CHANNEL_11;
161+
break;
162+
case 12:
163+
sConfig.Channel = ADC_CHANNEL_12;
164+
break;
165+
case 13:
166+
sConfig.Channel = ADC_CHANNEL_13;
167+
break;
168+
case 14:
169+
sConfig.Channel = ADC_CHANNEL_14;
170+
break;
171+
case 15:
172+
sConfig.Channel = ADC_CHANNEL_15;
173+
break;
174+
case 16:
175+
sConfig.Channel = ADC_CHANNEL_16;
176+
break;
177+
case 17:
178+
sConfig.Channel = ADC_CHANNEL_17;
179+
break;
180+
case 18:
181+
sConfig.Channel = ADC_CHANNEL_18;
182+
break;
183+
case 19:
184+
sConfig.Channel = ADC_CHANNEL_19;
185+
break;
186+
default:
187+
return 0;
188+
}
189+
}
190+
191+
if (HAL_ADC_ConfigChannel(&obj->handle, &sConfig) != HAL_OK) {
192+
error("HAL_ADC_ConfigChannel issue");
193+
}
194+
195+
if (HAL_ADC_Start(&obj->handle) != HAL_OK) {
196+
error("HAL_ADC_Start issue");
197+
}
198+
199+
// Wait end of conversion and get value
200+
uint16_t adcValue = 0;
201+
if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
202+
adcValue = (uint16_t)HAL_ADC_GetValue(&obj->handle);
203+
}
204+
205+
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE((&obj->handle)->Instance), LL_ADC_PATH_INTERNAL_NONE);
206+
207+
if (HAL_ADC_Stop(&obj->handle) != HAL_OK) {
208+
error("HAL_ADC_Stop issue");
209+
}
210+
211+
return adcValue;
212+
}
213+
214+
const PinMap *analogin_pinmap()
215+
{
216+
return PinMap_ADC;
217+
}
218+
219+
#endif

0 commit comments

Comments
 (0)