Skip to content

Commit 8edb7c3

Browse files
author
thread-liu
committed
[add] stm32h7 adc and dac driver.
1 parent aeff91b commit 8edb7c3

File tree

10 files changed

+388
-165
lines changed

10 files changed

+388
-165
lines changed

bsp/stm32/libraries/HAL_Drivers/config/h7/adc_config.h

Lines changed: 51 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,63 +19,69 @@ extern "C" {
1919

2020
#ifdef BSP_USING_ADC1
2121
#ifndef ADC1_CONFIG
22-
#define ADC1_CONFIG \
23-
{ \
24-
.Instance = ADC1, \
25-
.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4, \
26-
.Init.Resolution = ADC_RESOLUTION_12B, \
27-
.Init.DataAlign = ADC_DATAALIGN_RIGHT, \
28-
.Init.ScanConvMode = DISABLE, \
29-
.Init.EOCSelection = DISABLE, \
30-
.Init.ContinuousConvMode = DISABLE, \
31-
.Init.NbrOfConversion = 1, \
32-
.Init.DiscontinuousConvMode = DISABLE, \
33-
.Init.NbrOfDiscConversion = 0, \
34-
.Init.ExternalTrigConv = ADC_SOFTWARE_START, \
35-
.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE, \
36-
.Init.DMAContinuousRequests = DISABLE, \
22+
#define ADC1_CONFIG \
23+
{ \
24+
.Instance = ADC1, \
25+
.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4, \
26+
.Init.Resolution = ADC_RESOLUTION_16B, \
27+
.Init.ScanConvMode = ADC_SCAN_DISABLE, \
28+
.Init.EOCSelection = ADC_EOC_SINGLE_CONV, \
29+
.Init.LowPowerAutoWait = DISABLE, \
30+
.Init.ContinuousConvMode = DISABLE, \
31+
.Init.NbrOfConversion = 1, \
32+
.Init.DiscontinuousConvMode = DISABLE, \
33+
.Init.NbrOfDiscConversion = 1, \
34+
.Init.ExternalTrigConv = ADC_SOFTWARE_START, \
35+
.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE, \
36+
.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR, \
37+
.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN, \
38+
.Init.OversamplingMode = DISABLE, \
3739
}
3840
#endif /* ADC1_CONFIG */
3941
#endif /* BSP_USING_ADC1 */
4042

4143
#ifdef BSP_USING_ADC2
4244
#ifndef ADC2_CONFIG
43-
#define ADC2_CONFIG \
44-
{ \
45-
.Instance = ADC2, \
46-
.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4, \
47-
.Init.Resolution = ADC_RESOLUTION_12B, \
48-
.Init.DataAlign = ADC_DATAALIGN_RIGHT, \
49-
.Init.ScanConvMode = DISABLE, \
50-
.Init.EOCSelection = DISABLE, \
51-
.Init.ContinuousConvMode = DISABLE, \
52-
.Init.NbrOfConversion = 1, \
53-
.Init.DiscontinuousConvMode = DISABLE, \
54-
.Init.NbrOfDiscConversion = 0, \
55-
.Init.ExternalTrigConv = ADC_SOFTWARE_START, \
56-
.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE, \
57-
.Init.DMAContinuousRequests = DISABLE, \
45+
#define ADC2_CONFIG \
46+
{ \
47+
.Instance = ADC2, \
48+
.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4, \
49+
.Init.Resolution = ADC_RESOLUTION_16B, \
50+
.Init.ScanConvMode = ADC_SCAN_DISABLE, \
51+
.Init.EOCSelection = ADC_EOC_SINGLE_CONV, \
52+
.Init.LowPowerAutoWait = DISABLE, \
53+
.Init.ContinuousConvMode = DISABLE, \
54+
.Init.NbrOfConversion = 1, \
55+
.Init.DiscontinuousConvMode = DISABLE, \
56+
.Init.NbrOfDiscConversion = 1, \
57+
.Init.ExternalTrigConv = ADC_SOFTWARE_START, \
58+
.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE, \
59+
.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR, \
60+
.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN, \
61+
.Init.OversamplingMode = DISABLE, \
5862
}
5963
#endif /* ADC2_CONFIG */
6064
#endif /* BSP_USING_ADC2 */
6165

6266
#ifdef BSP_USING_ADC3
6367
#ifndef ADC3_CONFIG
64-
#define ADC3_CONFIG \
65-
{ \
66-
.Instance = ADC3, \
67-
.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4, \
68-
.Init.Resolution = ADC_RESOLUTION_12B, \
69-
.Init.DataAlign = ADC_DATAALIGN_RIGHT, \
70-
.Init.ScanConvMode = DISABLE, \
71-
.Init.EOCSelection = DISABLE, \
72-
.Init.ContinuousConvMode = DISABLE, \
73-
.Init.NbrOfConversion = 1, \
74-
.Init.DiscontinuousConvMode = DISABLE, \
75-
.Init.NbrOfDiscConversion = 0, \
76-
.Init.ExternalTrigConv = ADC_SOFTWARE_START, \
77-
.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE, \
78-
.Init.DMAContinuousRequests = DISABLE, \
68+
#define ADC3_CONFIG \
69+
{ \
70+
.Instance = ADC3, \
71+
.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4, \
72+
.Init.Resolution = ADC_RESOLUTION_16B, \
73+
.Init.ScanConvMode = ADC_SCAN_DISABLE, \
74+
.Init.EOCSelection = ADC_EOC_SINGLE_CONV, \
75+
.Init.LowPowerAutoWait = DISABLE, \
76+
.Init.ContinuousConvMode = DISABLE, \
77+
.Init.NbrOfConversion = 1, \
78+
.Init.DiscontinuousConvMode = DISABLE, \
79+
.Init.NbrOfDiscConversion = 1, \
80+
.Init.ExternalTrigConv = ADC_SOFTWARE_START, \
81+
.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE, \
82+
.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR, \
83+
.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN, \
84+
.Init.OversamplingMode = DISABLE, \
7985
}
8086
#endif /* ADC3_CONFIG */
8187
#endif /* BSP_USING_ADC3 */
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright (c) 2006-2018, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2020-06-16 thread-liu first version
9+
*/
10+
11+
#ifndef __DAC_CONFIG_H__
12+
#define __DAC_CONFIG_H__
13+
14+
#include <rtthread.h>
15+
16+
#ifdef __cplusplus
17+
extern "C" {
18+
#endif
19+
20+
#ifdef BSP_USING_DAC1
21+
#ifndef DAC1_CONFIG
22+
#define DAC1_CONFIG \
23+
{ \
24+
.Instance = DAC1, \
25+
}
26+
#endif /* DAC2_CONFIG */
27+
#endif /* BSP_USING_DAC2 */
28+
29+
#ifdef BSP_USING_DAC2
30+
#ifndef DAC2_CONFIG
31+
#define DAC2_CONFIG \
32+
{ \
33+
.Instance = DAC2, \
34+
}
35+
#endif /* DAC2_CONFIG */
36+
#endif /* BSP_USING_DAC2 */
37+
38+
#ifdef __cplusplus
39+
}
40+
#endif
41+
42+
#endif /* __DAC_CONFIG_H__ */

bsp/stm32/libraries/HAL_Drivers/drv_adc.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* 2018-12-12 greedyhao Porting for stm32f7xx
1010
* 2019-02-01 yuneizhilin fix the stm32_adc_init function initialization issue
1111
* 2020-06-17 thread-liu Porting for stm32mp1xx
12+
* 2020-10-09 thread-liu Porting for stm32h7xx
1213
*/
1314

1415
#include <board.h>
@@ -51,15 +52,15 @@ static rt_err_t stm32_adc_enabled(struct rt_adc_device *device, rt_uint32_t chan
5152

5253
if (enabled)
5354
{
54-
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined (SOC_SERIES_STM32MP1)
55+
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
5556
ADC_Enable(stm32_adc_handler);
5657
#else
5758
__HAL_ADC_ENABLE(stm32_adc_handler);
5859
#endif
5960
}
6061
else
6162
{
62-
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined (SOC_SERIES_STM32MP1)
63+
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
6364
ADC_Disable(stm32_adc_handler);
6465
#else
6566
__HAL_ADC_DISABLE(stm32_adc_handler);
@@ -192,7 +193,7 @@ static rt_err_t stm32_get_adc_value(struct rt_adc_device *device, rt_uint32_t ch
192193
return -RT_ERROR;
193194
}
194195

195-
#if defined(SOC_SERIES_STM32MP1)
196+
#if defined(SOC_SERIES_STM32MP1) || defined (SOC_SERIES_STM32H7)
196197
ADC_ChanConf.Rank = ADC_REGULAR_RANK_1;
197198
#else
198199
ADC_ChanConf.Rank = 1;
@@ -208,6 +209,8 @@ static rt_err_t stm32_get_adc_value(struct rt_adc_device *device, rt_uint32_t ch
208209
ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
209210
#elif defined(SOC_SERIES_STM32MP1)
210211
ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_810CYCLES_5;
212+
#elif defined(SOC_SERIES_STM32H7)
213+
ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
211214
#endif
212215

213216
#if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4)
@@ -217,7 +220,7 @@ static rt_err_t stm32_get_adc_value(struct rt_adc_device *device, rt_uint32_t ch
217220
#if defined(SOC_SERIES_STM32L4)
218221
ADC_ChanConf.OffsetNumber = ADC_OFFSET_NONE;
219222
ADC_ChanConf.SingleDiff = LL_ADC_SINGLE_ENDED;
220-
#elif defined(SOC_SERIES_STM32MP1)
223+
#elif defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
221224
ADC_ChanConf.OffsetNumber = ADC_OFFSET_NONE; /* ADC channel affected to offset number */
222225
ADC_ChanConf.Offset = 0;
223226
ADC_ChanConf.SingleDiff = ADC_SINGLE_ENDED; /* ADC channel differential mode */
@@ -231,7 +234,7 @@ static rt_err_t stm32_get_adc_value(struct rt_adc_device *device, rt_uint32_t ch
231234
LOG_E("ADC calibration error!\n");
232235
return -RT_ERROR;
233236
}
234-
#elif defined(SOC_SERIES_STM32MP1)
237+
#elif defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
235238
/* Run the ADC linear calibration in single-ended mode */
236239
if (HAL_ADCEx_Calibration_Start(stm32_adc_handler, ADC_CALIB_OFFSET_LINEARITY, ADC_ChanConf.SingleDiff) != HAL_OK)
237240
{

bsp/stm32/libraries/HAL_Drivers/drv_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ extern "C" {
100100
#include "h7/spi_config.h"
101101
#include "h7/qspi_config.h"
102102
#include "h7/adc_config.h"
103+
#include "h7/dac_config.h"
103104
#include "h7/tim_config.h"
104105
#include "h7/sdio_config.h"
105106
#include "h7/pwm_config.h"

bsp/stm32/libraries/HAL_Drivers/drv_dac.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* Change Logs:
77
* Date Author Notes
88
* 2020-06-18 thread-liu the first version
9+
* 2020-10-09 thread-liu Porting for stm32h7xx
910
*/
1011

1112
#include <board.h>
@@ -22,6 +23,10 @@ static DAC_HandleTypeDef dac_config[] =
2223
#ifdef BSP_USING_DAC1
2324
DAC1_CONFIG,
2425
#endif
26+
27+
#ifdef BSP_USING_DAC2
28+
DAC2_CONFIG,
29+
#endif
2530
};
2631

2732
struct stm32_dac
@@ -38,7 +43,7 @@ static rt_err_t stm32_dac_enabled(struct rt_dac_device *device, rt_uint32_t chan
3843
RT_ASSERT(device != RT_NULL);
3944
stm32_dac_handler = device->parent.user_data;
4045

41-
#if defined(SOC_SERIES_STM32MP1)
46+
#if defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
4247
HAL_DAC_Start(stm32_dac_handler, channel);
4348
#endif
4449

@@ -51,7 +56,7 @@ static rt_err_t stm32_dac_disabled(struct rt_dac_device *device, rt_uint32_t cha
5156
RT_ASSERT(device != RT_NULL);
5257
stm32_dac_handler = device->parent.user_data;
5358

54-
#if defined(SOC_SERIES_STM32MP1)
59+
#if defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
5560
HAL_DAC_Stop(stm32_dac_handler, channel);
5661
#endif
5762

@@ -91,22 +96,22 @@ static rt_err_t stm32_set_dac_value(struct rt_dac_device *device, rt_uint32_t ch
9196

9297
rt_memset(&DAC_ChanConf, 0, sizeof(DAC_ChanConf));
9398

94-
#if defined(SOC_SERIES_STM32MP1)
95-
if (channel <= 2 && channel > 0)
99+
#if defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
100+
if ((channel <= 2) && (channel > 0))
96101
{
97102
/* set stm32 dac channel */
98103
dac_channel = stm32_dac_get_channel(channel);
99104
}
100105
else
101106
{
102-
LOG_E("dac channel must be between 1 and 2.");
107+
LOG_E("dac channel must be 1 or 2.");
103108
return -RT_ERROR;
104109
}
105110
#endif
106111

107-
#if defined(SOC_SERIES_STM32MP1)
108-
DAC_ChanConf.DAC_Trigger=DAC_TRIGGER_NONE;
109-
DAC_ChanConf.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;
112+
#if defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
113+
DAC_ChanConf.DAC_Trigger = DAC_TRIGGER_NONE;
114+
DAC_ChanConf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
110115
#endif
111116
/* config dac out channel*/
112117
if (HAL_DAC_ConfigChannel(stm32_dac_handler, &DAC_ChanConf, dac_channel) != HAL_OK)

bsp/stm32/libraries/STM32H7xx_HAL/SConscript

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rng.c
2727
STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sram.c
2828
STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c
2929
''')
30-
30+
3131
if GetDepend(['RT_USING_SERIAL']):
3232
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c']
3333
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_usart.c']
@@ -43,7 +43,7 @@ if GetDepend(['RT_USING_SPI']):
4343

4444
if GetDepend(['RT_USING_USB_HOST']) or GetDepend(['RT_USING_USB_DEVICE']):
4545
# src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pccard.c']
46-
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pcd.c']
46+
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pcd.c']
4747
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pcd_ex.c']
4848
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hcd.c']
4949
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_usb.c']
@@ -64,6 +64,10 @@ if GetDepend(['RT_USING_ADC']):
6464
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_adc.c']
6565
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_adc_ex.c']
6666

67+
if GetDepend(['RT_USING_DAC']):
68+
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac.c']
69+
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac_ex.c']
70+
6771
if GetDepend(['RT_USING_RTC']):
6872
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc.c']
6973
src += ['STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc_ex.c']

0 commit comments

Comments
 (0)