This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new d199941  nucleo-g431rb: add ADC example
d199941 is described below

commit d19994139f1275f7a8cbc3557847b84933438ce3
Author: raiden00pl <raide...@railab.me>
AuthorDate: Mon Apr 12 18:30:21 2021 +0200

    nucleo-g431rb: add ADC example
---
 .../arm/stm32/nucleo-g431rb/configs/adc/defconfig  | 102 +++++++++
 boards/arm/stm32/nucleo-g431rb/include/board.h     |   8 +-
 boards/arm/stm32/nucleo-g431rb/src/Make.defs       |   4 +
 boards/arm/stm32/nucleo-g431rb/src/nucleo-g431rb.h |  12 ++
 boards/arm/stm32/nucleo-g431rb/src/stm32_adc.c     | 238 +++++++++++++++++++++
 boards/arm/stm32/nucleo-g431rb/src/stm32_bringup.c |  10 +
 6 files changed, 372 insertions(+), 2 deletions(-)

diff --git a/boards/arm/stm32/nucleo-g431rb/configs/adc/defconfig 
b/boards/arm/stm32/nucleo-g431rb/configs/adc/defconfig
new file mode 100644
index 0000000..4bb376c
--- /dev/null
+++ b/boards/arm/stm32/nucleo-g431rb/configs/adc/defconfig
@@ -0,0 +1,102 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed 
.config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that 
includes your
+# modifications.
+#
+# CONFIG_ARCH_FPU is not set
+# CONFIG_DEV_NULL is not set
+# CONFIG_LIBC_LONG_LONG is not set
+# CONFIG_NSH_DISABLE_PRINTF is not set
+CONFIG_ADC=y
+CONFIG_ANALOG=y
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="nucleo-g431rb"
+CONFIG_ARCH_BOARD_NUCLEO_G431RB=y
+CONFIG_ARCH_BUTTONS=y
+CONFIG_ARCH_CHIP="stm32"
+CONFIG_ARCH_CHIP_STM32=y
+CONFIG_ARCH_CHIP_STM32G431R=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_BOARD_LOOPSPERMSEC=16717
+CONFIG_BUILTIN=y
+CONFIG_DISABLE_ENVIRON=y
+CONFIG_DISABLE_MQUEUE=y
+CONFIG_DISABLE_POSIX_TIMERS=y
+CONFIG_DISABLE_PTHREAD=y
+CONFIG_EXAMPLES_ADC=y
+CONFIG_EXAMPLES_ADC_GROUPSIZE=3
+CONFIG_EXAMPLES_ADC_SWTRIG=y
+CONFIG_FDCLONE_STDIO=y
+CONFIG_INTELHEX_BINARY=y
+CONFIG_MAX_TASKS=4
+CONFIG_NAME_MAX=16
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_DISABLE_BASENAME=y
+CONFIG_NSH_DISABLE_CAT=y
+CONFIG_NSH_DISABLE_CD=y
+CONFIG_NSH_DISABLE_CMP=y
+CONFIG_NSH_DISABLE_CP=y
+CONFIG_NSH_DISABLE_DD=y
+CONFIG_NSH_DISABLE_DF=y
+CONFIG_NSH_DISABLE_DIRNAME=y
+CONFIG_NSH_DISABLE_EXEC=y
+CONFIG_NSH_DISABLE_EXIT=y
+CONFIG_NSH_DISABLE_GET=y
+CONFIG_NSH_DISABLE_HEXDUMP=y
+CONFIG_NSH_DISABLE_KILL=y
+CONFIG_NSH_DISABLE_LOSETUP=y
+CONFIG_NSH_DISABLE_LS=y
+CONFIG_NSH_DISABLE_MKDIR=y
+CONFIG_NSH_DISABLE_MKRD=y
+CONFIG_NSH_DISABLE_MOUNT=y
+CONFIG_NSH_DISABLE_MV=y
+CONFIG_NSH_DISABLE_PUT=y
+CONFIG_NSH_DISABLE_PWD=y
+CONFIG_NSH_DISABLE_RM=y
+CONFIG_NSH_DISABLE_RMDIR=y
+CONFIG_NSH_DISABLE_SET=y
+CONFIG_NSH_DISABLE_SLEEP=y
+CONFIG_NSH_DISABLE_SOURCE=y
+CONFIG_NSH_DISABLE_TEST=y
+CONFIG_NSH_DISABLE_TIME=y
+CONFIG_NSH_DISABLE_UMOUNT=y
+CONFIG_NSH_DISABLE_UNAME=y
+CONFIG_NSH_DISABLE_UNSET=y
+CONFIG_NSH_DISABLE_USLEEP=y
+CONFIG_NSH_DISABLE_WGET=y
+CONFIG_NSH_DISABLE_XD=y
+CONFIG_NSH_FILEIOSIZE=256
+CONFIG_NSH_LINELEN=64
+CONFIG_NSH_READLINE=y
+CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=512
+CONFIG_PREALLOC_TIMERS=2
+CONFIG_PTHREAD_STACK_DEFAULT=1024
+CONFIG_PTHREAD_STACK_MIN=1024
+CONFIG_RAM_SIZE=22528
+CONFIG_RAM_START=0x20000000
+CONFIG_RAW_BINARY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_WAITPID=y
+CONFIG_SDCLONE_DISABLE=y
+CONFIG_START_DAY=6
+CONFIG_START_MONTH=12
+CONFIG_START_YEAR=2011
+CONFIG_STM32_ADC1=y
+CONFIG_STM32_ADC1_DMA=y
+CONFIG_STM32_ADC2=y
+CONFIG_STM32_DMA1=y
+CONFIG_STM32_DMAMUX1=y
+CONFIG_STM32_FORCEPOWER=y
+CONFIG_STM32_JTAG_SW_ENABLE=y
+CONFIG_STM32_TIM1=y
+CONFIG_STM32_TIM1_ADC=y
+CONFIG_STM32_USART2=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_TASK_NAME_SIZE=0
+CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=512
+CONFIG_USART2_SERIAL_CONSOLE=y
+CONFIG_USERMAIN_STACKSIZE=1024
+CONFIG_USER_ENTRYPOINT="nsh_main"
diff --git a/boards/arm/stm32/nucleo-g431rb/include/board.h 
b/boards/arm/stm32/nucleo-g431rb/include/board.h
index f33a6b0..d7049a2 100644
--- a/boards/arm/stm32/nucleo-g431rb/include/board.h
+++ b/boards/arm/stm32/nucleo-g431rb/include/board.h
@@ -224,8 +224,6 @@
 #define GPIO_USART2_TX     GPIO_USART2_TX_1 /* PA2 */
 #define GPIO_USART2_RX     GPIO_USART2_RX_1 /* PA3 */
 
-/* Pin Multiplexing Disambiguation ******************************************/
-
 /* PWM configuration ********************************************************/
 
 /* TIM1 PWM */
@@ -238,4 +236,10 @@
 #define GPIO_TIM1_CH3NOUT GPIO_TIM1_CH3NOUT_1 /* PB1 */
 #define GPIO_TIM1_CH4OUT  GPIO_TIM1_CH4OUT_2  /* PC3 */
 
+/* DMA channels *************************************************************/
+
+/* ADC */
+
+#define ADC1_DMA_CHAN DMAMAP_DMA12_ADC1_0     /* DMA1 */
+
 #endif /* __BOARDS_ARM_STM32_NUCLEO_G431RB_INCLUDE_BOARD_H */
diff --git a/boards/arm/stm32/nucleo-g431rb/src/Make.defs 
b/boards/arm/stm32/nucleo-g431rb/src/Make.defs
index cbc4933..23c2705 100644
--- a/boards/arm/stm32/nucleo-g431rb/src/Make.defs
+++ b/boards/arm/stm32/nucleo-g431rb/src/Make.defs
@@ -37,6 +37,10 @@ ifeq ($(CONFIG_PWM),y)
 CSRCS += stm32_pwm.c
 endif
 
+ifeq ($(CONFIG_ADC),y)
+CSRCS += stm32_adc.c
+endif
+
 DEPPATH += --dep-path board
 VPATH += :board
 CFLAGS += $(shell $(INCDIR) "$(CC)" 
$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
diff --git a/boards/arm/stm32/nucleo-g431rb/src/nucleo-g431rb.h 
b/boards/arm/stm32/nucleo-g431rb/src/nucleo-g431rb.h
index be88a86..5c51f0a 100644
--- a/boards/arm/stm32/nucleo-g431rb/src/nucleo-g431rb.h
+++ b/boards/arm/stm32/nucleo-g431rb/src/nucleo-g431rb.h
@@ -101,4 +101,16 @@ int stm32_bringup(void);
 int stm32_pwm_setup(void);
 #endif
 
+/****************************************************************************
+ * Name: stm32_adc_setup
+ *
+ * Description:
+ *   Initialize ADC and register the ADC driver.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ADC
+int stm32_adc_setup(void);
+#endif
+
 #endif /* __BOARDS_ARM_STM32_NUCLEO_G431RB_SRC_NUCLEO_G431RB_H */
diff --git a/boards/arm/stm32/nucleo-g431rb/src/stm32_adc.c 
b/boards/arm/stm32/nucleo-g431rb/src/stm32_adc.c
new file mode 100644
index 0000000..c6451ea
--- /dev/null
+++ b/boards/arm/stm32/nucleo-g431rb/src/stm32_adc.c
@@ -0,0 +1,238 @@
+/****************************************************************************
+ * boards/arm/stm32/nucleo-g431rb/src/stm32_adc.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/board.h>
+#include <nuttx/analog/adc.h>
+
+#include "stm32.h"
+
+#if defined(CONFIG_ADC) && (defined(CONFIG_STM32_ADC1) || 
defined(CONFIG_STM32_ADC2))
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Configuration ************************************************************/
+
+/* 1 or 2 ADC devices (DEV1, DEV2) */
+
+#if defined(CONFIG_STM32_ADC1)
+#  define DEV1_PORT 1
+#endif
+
+#if defined(CONFIG_STM32_ADC2)
+#  if defined(DEV1_PORT)
+#    define DEV2_PORT 2
+#  else
+#    define DEV1_PORT 2
+#  endif
+#endif
+
+/* The number of ADC channels in the conversion list */
+
+#define ADC1_NCHANNELS 3
+#define ADC2_NCHANNELS 3
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* DEV 1 */
+
+#if DEV1_PORT == 1
+
+#define DEV1_NCHANNELS ADC1_NCHANNELS
+
+/* Identifying number of each ADC channel (even if NCHANNELS is less ) */
+
+static const uint8_t g_chanlist1[3] =
+{
+  1,
+  2,
+  15
+};
+
+/* Configurations of pins used by each ADC channel */
+
+static const uint32_t g_pinlist1[3]  =
+{
+  GPIO_ADC1_IN1,                /* PA0/A0 */
+  GPIO_ADC1_IN2,                /* PA1/A1 */
+  GPIO_ADC1_IN15,               /* PB0/A3 */
+};
+
+#elif DEV1_PORT == 2
+
+#define DEV1_NCHANNELS ADC2_NCHANNELS
+
+/* Identifying number of each ADC channel */
+
+static const uint8_t g_chanlist1[3] =
+{
+  17,
+  7,
+  6
+};
+
+/* Configurations of pins used by each ADC channel */
+
+static const uint32_t g_pinlist1[3] =
+{
+  GPIO_ADC2_IN17,               /* PA4/A2 */
+  GPIO_ADC2_IN7,                /* PC1/A4 */
+  GPIO_ADC2_IN6,                /* PC0/A5 */
+};
+
+#endif /* DEV1_PORT == 1 */
+
+#ifdef DEV2_PORT
+
+/* DEV 2 */
+
+#if DEV2_PORT == 2
+
+#define DEV2_NCHANNELS ADC2_NCHANNELS
+
+/* Identifying number of each ADC channel */
+
+static const uint8_t g_chanlist2[3] =
+{
+  17,
+  7,
+  6
+};
+
+/* Configurations of pins used by each ADC channel */
+
+static const uint32_t g_pinlist2[3] =
+{
+  GPIO_ADC2_IN17,               /* PA4/A2 */
+  GPIO_ADC2_IN7,                /* PC1/A4 */
+  GPIO_ADC2_IN6,                /* PC0/A5 */
+};
+
+#endif /* DEV2_PORT == 2 */
+#endif /* DEV2_PORT */
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: stm32_adc_setup
+ *
+ * Description:
+ *   Initialize ADC and register the ADC driver.
+ *
+ ****************************************************************************/
+
+int stm32_adc_setup(void)
+{
+  static bool initialized = false;
+  FAR struct adc_dev_s *adc;
+  int ret;
+  int i;
+
+  /* Check if we have already initialized */
+
+  if (!initialized)
+    {
+      /* DEV1 */
+
+      /* Configure the pins as analog inputs for the selected channels */
+
+      for (i = 0; i < DEV1_NCHANNELS; i++)
+        {
+          stm32_configgpio(g_pinlist1[i]);
+        }
+
+      /* Call stm32_adcinitialize() to get an instance of the ADC interface */
+
+      adc = stm32_adcinitialize(DEV1_PORT, g_chanlist1, DEV1_NCHANNELS);
+      if (adc == NULL)
+        {
+          aerr("Failed to get ADC interface 1\n");
+          return -ENODEV;
+        }
+
+      /* Register the ADC driver at "/dev/adc0" */
+
+      ret = adc_register("/dev/adc0", adc);
+      if (ret < 0)
+        {
+          aerr("adc_register /dev/adc0 failed: %d\n", ret);
+          return ret;
+        }
+
+#ifdef DEV2_PORT
+
+      /* DEV2 */
+
+      /* Configure the pins as analog inputs for the selected channels */
+
+      for (i = 0; i < DEV2_NCHANNELS; i++)
+        {
+          stm32_configgpio(g_pinlist2[i]);
+        }
+
+      /* Call stm32_adcinitialize() to get an instance of the ADC interface */
+
+      adc = stm32_adcinitialize(DEV2_PORT, g_chanlist2, DEV2_NCHANNELS);
+      if (adc == NULL)
+        {
+          aerr("Failed to get ADC interface 2\n");
+          return -ENODEV;
+        }
+
+      /* Register the ADC driver at "/dev/adc1" */
+
+      ret = adc_register("/dev/adc1", adc);
+      if (ret < 0)
+        {
+          aerr("adc_register /dev/adc1 failed: %d\n", ret);
+          return ret;
+        }
+#endif
+
+      initialized = true;
+    }
+
+  return OK;
+}
+
+#endif /* CONFIG_ADC && (CONFIG_STM32_ADC1 || CONFIG_STM32_ADC2) */
diff --git a/boards/arm/stm32/nucleo-g431rb/src/stm32_bringup.c 
b/boards/arm/stm32/nucleo-g431rb/src/stm32_bringup.c
index 5e47af4..182ff7f 100644
--- a/boards/arm/stm32/nucleo-g431rb/src/stm32_bringup.c
+++ b/boards/arm/stm32/nucleo-g431rb/src/stm32_bringup.c
@@ -102,6 +102,16 @@ int stm32_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_ADC
+  /* Initialize ADC and register the ADC driver. */
+
+  ret = stm32_adc_setup();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: stm32_adc_setup failed: %d\n", ret);
+    }
+#endif
+
   UNUSED(ret);
   return OK;
 }

Reply via email to