forked from xuos/xiuos
support adc bus
This commit is contained in:
parent
5185501d72
commit
efd8999988
|
@ -81,8 +81,6 @@ void PlcReadUATask(void *arg)
|
||||||
if(EOK != ret)
|
if(EOK != ret)
|
||||||
{
|
{
|
||||||
plc_print("plc: [%s] read failed\n", __func__);
|
plc_print("plc: [%s] read failed\n", __func__);
|
||||||
free(plc_demo_dev.priv_data);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
free(plc_demo_dev.priv_data);
|
free(plc_demo_dev.priv_data);
|
||||||
ops->close(&plc_demo_dev);
|
ops->close(&plc_demo_dev);
|
||||||
|
@ -94,5 +92,5 @@ void PlcReadTest(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(3),
|
||||||
plc, PlcReadTest, test PLC);
|
plc, PlcReadTest, Read PLC);
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ extern int ExtSramInit(void);
|
||||||
|
|
||||||
#include <connect_ethernet.h>
|
#include <connect_ethernet.h>
|
||||||
#include <connect_uart.h>
|
#include <connect_uart.h>
|
||||||
|
#include <connect_adc.h>
|
||||||
|
|
||||||
#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority
|
#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority
|
||||||
4 bits for subpriority */
|
4 bits for subpriority */
|
||||||
|
@ -628,6 +629,11 @@ void InitBoardHardware()
|
||||||
#ifdef BSP_USING_LPUART
|
#ifdef BSP_USING_LPUART
|
||||||
Imrt1052HwUartInit();
|
Imrt1052HwUartInit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC
|
||||||
|
Imrt1052HwAdcInit();
|
||||||
|
#endif
|
||||||
|
|
||||||
InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME);
|
InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,10 @@ menuconfig BSP_USING_ADC
|
||||||
default y
|
default y
|
||||||
select RESOURCES_ADC
|
select RESOURCES_ADC
|
||||||
|
|
||||||
|
if BSP_USING_ADC
|
||||||
|
source "$BSP_DIR/third_party_driver/adc/Kconfig"
|
||||||
|
endif
|
||||||
|
|
||||||
menuconfig BSP_USING_SPI
|
menuconfig BSP_USING_SPI
|
||||||
bool "Using SPI device"
|
bool "Using SPI device"
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
config BSP_USING_ADC1
|
||||||
|
bool "Enable ADC1"
|
||||||
|
default y
|
||||||
|
if BSP_USING_ADC1
|
||||||
|
config ADC_BUS_NAME_1
|
||||||
|
string "adc bus 1 name"
|
||||||
|
default "adc1"
|
||||||
|
config ADC_DRV_NAME_1
|
||||||
|
string "adc bus 1 driver name"
|
||||||
|
default "adc1_drv"
|
||||||
|
config ADC_1_DEVICE_NAME_0
|
||||||
|
string "adc bus 1 device name"
|
||||||
|
default "adc1_dev"
|
||||||
|
endif
|
||||||
|
|
||||||
|
config BSP_USING_ADC2
|
||||||
|
bool "Enable ADC2"
|
||||||
|
default y
|
||||||
|
if BSP_USING_ADC2
|
||||||
|
config ADC_BUS_NAME_2
|
||||||
|
string "adc bus 2 name"
|
||||||
|
default "adc2"
|
||||||
|
config ADC_DRV_NAME_2
|
||||||
|
string "adc bus 2 driver name"
|
||||||
|
default "adc2_drv"
|
||||||
|
config ADC_2_DEVICE_NAME_0
|
||||||
|
string "adc bus 2 device name"
|
||||||
|
default "adc2_dev"
|
||||||
|
endif
|
|
@ -1,3 +1,3 @@
|
||||||
SRC_FILES := fsl_adc.c adc_interrupt.c
|
SRC_FILES := fsl_adc.c connect_adc.c
|
||||||
|
|
||||||
include $(KERNEL_ROOT)/compiler.mk
|
include $(KERNEL_ROOT)/compiler.mk
|
||||||
|
|
|
@ -1,178 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc.
|
|
||||||
* Copyright 2016-2018 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file adc_interrupt.c
|
|
||||||
* @brief Demo for ADC function
|
|
||||||
* @version 1.0
|
|
||||||
* @author AIIT XUOS Lab
|
|
||||||
* @date 2022.1.18
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "fsl_debug_console.h"
|
|
||||||
#include "board.h"
|
|
||||||
#include "fsl_adc.h"
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
#include "pin_mux.h"
|
|
||||||
#include "clock_config.h"
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#define DEMO_ADC_BASE ADC1
|
|
||||||
#define DEMO_ADC_IRQn ADC1_IRQn
|
|
||||||
//#define DEMO_ADC_USER_CHANNEL 0U
|
|
||||||
#define DEMO_ADC_USER_CHANNEL 3U
|
|
||||||
#define DEMO_ADC_CHANNEL_GROUP 0U
|
|
||||||
#define EXAMPLE_ADC_IRQHandler ADC1_IRQHandler
|
|
||||||
|
|
||||||
#define adc_print KPrintf
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Prototypes
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables
|
|
||||||
******************************************************************************/
|
|
||||||
volatile bool g_AdcConversionDoneFlag;
|
|
||||||
volatile uint32_t g_AdcConversionValue;
|
|
||||||
volatile uint32_t g_AdcInterruptCounter;
|
|
||||||
const uint32_t g_Adc_12bitFullRange = 4096U;
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
//#define ADC_BUS_NAME_1 "adc1"
|
|
||||||
//#define ADC_DRV_NAME_1 "adc1_drv"
|
|
||||||
//#define ADC_1_DEVICE_NAME_0 "adc1_dev0"
|
|
||||||
//
|
|
||||||
//static struct Bus *adc_bus = NONE; /* I2C bus handle */
|
|
||||||
//
|
|
||||||
//void AdcInit(const char *bus_name, const char *dev_name, const char *drv_name)
|
|
||||||
//{
|
|
||||||
// /* find I2C device and get I2C handle */
|
|
||||||
// adc_bus = BusFind(bus_name);
|
|
||||||
// if (NONE == adc_bus){
|
|
||||||
// i2c_print("%s can't find %s bus!\n", __func__, bus_name);
|
|
||||||
// }
|
|
||||||
// else{
|
|
||||||
// i2c_print("%s find %s bus!\n", __func__, bus_name);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// adc_bus->owner_haldev = BusFindDevice(adc_bus, dev_name);
|
|
||||||
// adc_bus->owner_driver = BusFindDriver(adc_bus, drv_name);
|
|
||||||
//
|
|
||||||
// if(adc_bus->match(adc_bus->owner_driver, adc_bus->owner_haldev)){
|
|
||||||
// i2c_print("i2c match drv %s %p dev %s %p error\n", drv_name, adc_bus->owner_driver, dev_name, adc_bus->owner_haldev);
|
|
||||||
// }
|
|
||||||
// else{
|
|
||||||
// i2c_print("HS3000Init successfully!write %p read %p\n",
|
|
||||||
// adc_bus->owner_haldev->dev_done->write,
|
|
||||||
// adc_bus->owner_haldev->dev_done->read);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//void TestAdcInit(void)
|
|
||||||
//{
|
|
||||||
// AdcInit(ADC_BUS_NAME_1, ADC_1_DEVICE_NAME_0, ADC_DRV_NAME_1); /* init sensor */
|
|
||||||
//}
|
|
||||||
|
|
||||||
void EXAMPLE_ADC_IRQHandler(int vector, void *param)
|
|
||||||
{
|
|
||||||
g_AdcConversionDoneFlag = true;
|
|
||||||
/* Read conversion result to clear the conversion completed flag. */
|
|
||||||
g_AdcConversionValue = ADC_GetChannelConversionValue(DEMO_ADC_BASE, DEMO_ADC_CHANNEL_GROUP);
|
|
||||||
g_AdcInterruptCounter++;
|
|
||||||
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
|
|
||||||
exception return operation might vector to incorrect interrupt */
|
|
||||||
#if defined __CORTEX_M && (__CORTEX_M == 4U)
|
|
||||||
__DSB();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
DECLARE_HW_IRQ(ADC1_IRQn, EXAMPLE_ADC_IRQHandler, NONE);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief Main function
|
|
||||||
*/
|
|
||||||
int test_adc(void)
|
|
||||||
{
|
|
||||||
int cnt = 3;
|
|
||||||
adc_config_t adcConfigStrcut;
|
|
||||||
adc_channel_config_t adcChannelConfigStruct;
|
|
||||||
|
|
||||||
EnableIRQ(DEMO_ADC_IRQn);
|
|
||||||
|
|
||||||
adc_print("\r\nADC interrupt Example.\r\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* config->enableAsynchronousClockOutput = true;
|
|
||||||
* config->enableOverWrite = false;
|
|
||||||
* config->enableContinuousConversion = false;
|
|
||||||
* config->enableHighSpeed = false;
|
|
||||||
* config->enableLowPower = false;
|
|
||||||
* config->enableLongSample = false;
|
|
||||||
* config->referenceVoltageSource = kADC_ReferenceVoltageSourceVref;
|
|
||||||
* config->samplePeriodMode = kADC_SamplePeriod2or12Clocks;
|
|
||||||
* config->clockSource = kADC_ClockSourceAD;
|
|
||||||
* config->clockDriver = kADC_ClockDriver1;
|
|
||||||
* config->resolution = kADC_Resolution12Bit;
|
|
||||||
*/
|
|
||||||
ADC_GetDefaultConfig(&adcConfigStrcut);
|
|
||||||
ADC_Init(DEMO_ADC_BASE, &adcConfigStrcut);
|
|
||||||
#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE)
|
|
||||||
ADC_EnableHardwareTrigger(DEMO_ADC_BASE, false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Do auto hardware calibration. */
|
|
||||||
if (kStatus_Success == ADC_DoAutoCalibration(DEMO_ADC_BASE))
|
|
||||||
{
|
|
||||||
adc_print("ADC_DoAntoCalibration() Done.\r\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
adc_print("ADC_DoAutoCalibration() Failed.\r\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure the user channel and interrupt. */
|
|
||||||
adcChannelConfigStruct.channelNumber = DEMO_ADC_USER_CHANNEL;
|
|
||||||
adcChannelConfigStruct.enableInterruptOnConversionCompleted = true;
|
|
||||||
g_AdcInterruptCounter = 0U; /* Clear the interrupt counter. */
|
|
||||||
|
|
||||||
adc_print("ADC Full Range: %d\r\n", g_Adc_12bitFullRange);
|
|
||||||
while (cnt --)
|
|
||||||
{
|
|
||||||
adc_print("Press any key to get user channel's ADC value.\r\n");
|
|
||||||
getchar();
|
|
||||||
g_AdcConversionDoneFlag = false;
|
|
||||||
/*
|
|
||||||
When in software trigger mode, each conversion would be launched once calling the "ADC16_ChannelConfigure()"
|
|
||||||
function, which works like writing a conversion command and executing it. For another channel's conversion,
|
|
||||||
just to change the "channelNumber" field in channel configuration structure, and call the function
|
|
||||||
"ADC_ChannelConfigure()"" again.
|
|
||||||
Also, the "enableInterruptOnConversionCompleted" inside the channel configuration structure is a parameter
|
|
||||||
for
|
|
||||||
the conversion command. It takes affect just for the current conversion. If the interrupt is still required
|
|
||||||
for the following conversion, it is necessary to assert the "enableInterruptOnConversionCompleted" every
|
|
||||||
time
|
|
||||||
for each command.
|
|
||||||
*/
|
|
||||||
ADC_SetChannelConfig(DEMO_ADC_BASE, DEMO_ADC_CHANNEL_GROUP, &adcChannelConfigStruct);
|
|
||||||
while (g_AdcConversionDoneFlag == false);
|
|
||||||
adc_print("ADC Value: %d\r\n", g_AdcConversionValue);
|
|
||||||
adc_print("ADC Interrupt Counter: %d\r\n", g_AdcInterruptCounter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SHELL_EXPORT_CMD (SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0),
|
|
||||||
adc, test_adc, ADC test );
|
|
||||||
|
|
|
@ -0,0 +1,303 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* XiUOS is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* http://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file connect_adc.c
|
||||||
|
* @brief Demo for ADC function
|
||||||
|
* @version 1.0
|
||||||
|
* @author AIIT XUOS Lab
|
||||||
|
* @date 2022.1.18
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "board.h"
|
||||||
|
#include "fsl_adc.h"
|
||||||
|
#include "fsl_common.h"
|
||||||
|
#include "dev_adc.h"
|
||||||
|
#include "bus_adc.h"
|
||||||
|
#include "connect_adc.h"
|
||||||
|
|
||||||
|
#define ADC1_BASE_ADDR ADC1
|
||||||
|
#define ADC1_IRQ ADC1_IRQn
|
||||||
|
#define ADC1_USER_CHANNEL 3U
|
||||||
|
#define ADC1_CHANNEL_GROUP 0U
|
||||||
|
|
||||||
|
#define ADC2_BASE_ADDR ADC2
|
||||||
|
#define ADC2_IRQ ADC2_IRQn
|
||||||
|
#define ADC2_USER_CHANNEL 4U
|
||||||
|
#define ADC2_CHANNEL_GROUP 0U
|
||||||
|
|
||||||
|
#define adc_print KPrintf
|
||||||
|
|
||||||
|
#define ADC1_BUS_NAME "adc1"
|
||||||
|
#define ADC1_DRV_NAME "adc1_drv"
|
||||||
|
#define ADC1_DEV_NAME "adc1_dev"
|
||||||
|
|
||||||
|
#define ADC2_BUS_NAME "adc2"
|
||||||
|
#define ADC2_DRV_NAME "adc2_drv"
|
||||||
|
#define ADC2_DEV_NAME "adc2_dev"
|
||||||
|
|
||||||
|
volatile bool adc1_flag;
|
||||||
|
volatile uint32_t adc1_val;
|
||||||
|
volatile uint32_t adc1_irq_cnt;
|
||||||
|
volatile bool adc2_flag;
|
||||||
|
volatile uint32_t adc2_val;
|
||||||
|
volatile uint32_t adc2_irq_cnt;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void ADC1_IRQHandler(int vector, void *param)
|
||||||
|
{
|
||||||
|
adc1_flag = true;
|
||||||
|
/* Read conversion result to clear the conversion completed flag. */
|
||||||
|
adc1_val = ADC_GetChannelConversionValue(ADC1_BASE_ADDR, ADC1_CHANNEL_GROUP);
|
||||||
|
adc1_irq_cnt++;
|
||||||
|
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
|
||||||
|
exception return operation might vector to incorrect interrupt */
|
||||||
|
#if defined __CORTEX_M && (__CORTEX_M == 4U)
|
||||||
|
__DSB();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_HW_IRQ(ADC1_IRQn, ADC1_IRQHandler, NONE);
|
||||||
|
|
||||||
|
void ADC2_IRQHandler(int vector, void *param)
|
||||||
|
{
|
||||||
|
adc2_flag = true;
|
||||||
|
/* Read conversion result to clear the conversion completed flag. */
|
||||||
|
adc2_val = ADC_GetChannelConversionValue(ADC2_BASE_ADDR, ADC2_CHANNEL_GROUP);
|
||||||
|
adc2_irq_cnt++;
|
||||||
|
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
|
||||||
|
exception return operation might vector to incorrect interrupt */
|
||||||
|
#if defined __CORTEX_M && (__CORTEX_M == 4U)
|
||||||
|
__DSB();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_HW_IRQ(ADC2_IRQn, ADC2_IRQHandler, NONE);
|
||||||
|
|
||||||
|
uint32 Imrt1052AdcOpen(void *dev)
|
||||||
|
{
|
||||||
|
struct AdcHardwareDevice *adc_dev = (struct AdcHardwareDevice *)dev;
|
||||||
|
adc_config_t adc_cfg;
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC1
|
||||||
|
if (0 == strncmp(adc_dev->haldev.dev_name, ADC1_DEV_NAME, NAME_NUM_MAX)) {
|
||||||
|
EnableIRQ(ADC1_IRQn);
|
||||||
|
ADC_GetDefaultConfig(&adc_cfg);
|
||||||
|
ADC_Init(ADC1, &adc_cfg);
|
||||||
|
#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE)
|
||||||
|
ADC_EnableHardwareTrigger(ADC1, false);
|
||||||
|
#endif
|
||||||
|
/* Do auto hardware calibration. */
|
||||||
|
if (kStatus_Success == ADC_DoAutoCalibration(ADC1))
|
||||||
|
{
|
||||||
|
adc_print("ADC_DoAntoCalibration() Done.\r\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
adc_print("ADC_DoAutoCalibration() Failed.\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC2
|
||||||
|
if (0 == strncmp(adc_dev->haldev.dev_name, ADC2_DEV_NAME, NAME_NUM_MAX)) {
|
||||||
|
EnableIRQ(ADC2_IRQn);
|
||||||
|
ADC_GetDefaultConfig(&adc_cfg);
|
||||||
|
ADC_Init(ADC2, &adc_cfg);
|
||||||
|
#if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE)
|
||||||
|
ADC_EnableHardwareTrigger(ADC2, false);
|
||||||
|
#endif
|
||||||
|
/* Do auto hardware calibration. */
|
||||||
|
if (kStatus_Success == ADC_DoAutoCalibration(ADC2))
|
||||||
|
{
|
||||||
|
adc_print("ADC_DoAntoCalibration() Done.\r\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
adc_print("ADC_DoAutoCalibration() Failed.\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 Imrt1052AdcClose(void *dev)
|
||||||
|
{
|
||||||
|
return EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 Imrt1052AdcRead(void *dev, struct BusBlockReadParam *read_param)
|
||||||
|
{
|
||||||
|
struct AdcHardwareDevice *adc_dev = (struct AdcHardwareDevice *)dev;
|
||||||
|
adc_channel_config_t ch_cfg;
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC1
|
||||||
|
if (0 == strncmp(adc_dev->haldev.dev_name, ADC1_DEV_NAME, NAME_NUM_MAX)) {
|
||||||
|
/* Configure the user channel and interrupt. */
|
||||||
|
ch_cfg.channelNumber = ADC1_USER_CHANNEL;
|
||||||
|
ch_cfg.enableInterruptOnConversionCompleted = true;
|
||||||
|
adc1_irq_cnt = 0U; /* Clear the interrupt counter. */
|
||||||
|
adc1_flag = false;
|
||||||
|
ADC_SetChannelConfig(ADC1, ADC1_CHANNEL_GROUP, &ch_cfg);
|
||||||
|
while (adc1_flag == false);
|
||||||
|
|
||||||
|
adc_print("ADC Value: %d\r\n", adc1_val);
|
||||||
|
adc_print("ADC Interrupt Counter: %d\r\n", adc1_irq_cnt);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC2
|
||||||
|
if (0 == strncmp(adc_dev->haldev.dev_name, ADC2_DEV_NAME, NAME_NUM_MAX)) {
|
||||||
|
/* Configure the user channel and interrupt. */
|
||||||
|
ch_cfg.channelNumber = ADC2_USER_CHANNEL;
|
||||||
|
ch_cfg.enableInterruptOnConversionCompleted = true;
|
||||||
|
adc2_irq_cnt = 0U; /* Clear the interrupt counter. */
|
||||||
|
adc2_flag = false;
|
||||||
|
ADC_SetChannelConfig(ADC2, ADC2_CHANNEL_GROUP, &ch_cfg);
|
||||||
|
while (adc2_flag == false);
|
||||||
|
|
||||||
|
adc_print("ADC Value: %d\r\n", adc2_val);
|
||||||
|
adc_print("ADC Interrupt Counter: %d\r\n", adc2_irq_cnt);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return adc1_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32 Imrt1052AdcDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
|
||||||
|
{
|
||||||
|
NULL_PARAM_CHECK(drv);
|
||||||
|
NULL_PARAM_CHECK(configure_info);
|
||||||
|
|
||||||
|
x_err_t ret = EOK;
|
||||||
|
uint8 adc_channel;
|
||||||
|
|
||||||
|
struct AdcDriver *adc_drv = (struct AdcDriver *)drv;
|
||||||
|
struct AdcHardwareDevice *adc_dev = (struct AdcHardwareDevice *)adc_drv->driver.owner_bus->owner_haldev;
|
||||||
|
struct Imrt1052HwAdc *adc_cfg = (struct Imrt1052HwAdc *)adc_dev->haldev.private_data;
|
||||||
|
|
||||||
|
switch (configure_info->configure_cmd)
|
||||||
|
{
|
||||||
|
case OPE_CFG:
|
||||||
|
adc_cfg->adc_channel = *(uint8 *)configure_info->private_data;
|
||||||
|
if (adc_cfg->adc_channel > 18) {
|
||||||
|
KPrintf("Imrt1052AdcDrvConfigure set adc channel(0-18) %u error!", adc_cfg->adc_channel);
|
||||||
|
adc_cfg->adc_channel = 0;
|
||||||
|
ret = ERROR;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct AdcDevDone dev_done =
|
||||||
|
{
|
||||||
|
Imrt1052AdcOpen,
|
||||||
|
Imrt1052AdcClose,
|
||||||
|
NONE,
|
||||||
|
Imrt1052AdcRead,
|
||||||
|
};
|
||||||
|
|
||||||
|
int Imrt1052HwAdcInit(void)
|
||||||
|
{
|
||||||
|
x_err_t ret = EOK;
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC1
|
||||||
|
static struct AdcBus adc1_bus;
|
||||||
|
static struct AdcDriver adc1_drv;
|
||||||
|
static struct AdcHardwareDevice adc1_dev;
|
||||||
|
static struct Imrt1052HwAdc adc1_cfg;
|
||||||
|
|
||||||
|
adc1_drv.configure = Imrt1052AdcDrvConfigure;
|
||||||
|
|
||||||
|
ret = AdcBusInit(&adc1_bus, ADC1_BUS_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC1 bus init error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = AdcDriverInit(&adc1_drv, ADC1_DRV_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC1 driver init error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
ret = AdcDriverAttachToBus(ADC1_DRV_NAME, ADC1_BUS_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC1 driver attach error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
adc1_dev.adc_dev_done = &dev_done;
|
||||||
|
|
||||||
|
ret = AdcDeviceRegister(&adc1_dev, (void *)&adc1_cfg, ADC1_DEV_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC1 device register error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = AdcDeviceAttachToBus(ADC1_DEV_NAME, ADC1_BUS_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC1 device register error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC2
|
||||||
|
static struct AdcBus adc2_bus;
|
||||||
|
static struct AdcDriver adc2_drv;
|
||||||
|
static struct AdcHardwareDevice adc2_dev;
|
||||||
|
static struct Imrt1052HwAdc adc2_cfg;
|
||||||
|
|
||||||
|
adc2_drv.configure = Imrt1052AdcDrvConfigure;
|
||||||
|
|
||||||
|
ret = AdcBusInit(&adc2_bus, ADC2_BUS_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC2 bus init error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = AdcDriverInit(&adc2_drv, ADC2_DRV_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC2 driver init error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
ret = AdcDriverAttachToBus(ADC2_DRV_NAME, ADC2_BUS_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC2 driver attach error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
adc2_dev.adc_dev_done = &dev_done;
|
||||||
|
|
||||||
|
ret = AdcDeviceRegister(&adc2_dev, (void *)&adc2_cfg, ADC2_DEV_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC2 device register error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = AdcDeviceAttachToBus(ADC2_DEV_NAME, ADC2_BUS_NAME);
|
||||||
|
if (ret != EOK) {
|
||||||
|
KPrintf("ADC2 device register error %d\n", ret);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* XiUOS is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* http://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file connect_adc.h
|
||||||
|
* @brief define stm32f407-st-discovery adc function and struct
|
||||||
|
* @version 1.1
|
||||||
|
* @author AIIT XUOS Lab
|
||||||
|
* @date 2021-12-28
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONNECT_ADC_H
|
||||||
|
#define CONNECT_ADC_H
|
||||||
|
|
||||||
|
#include <device.h>
|
||||||
|
|
||||||
|
struct Imrt1052HwAdc
|
||||||
|
{
|
||||||
|
void *ADCx;
|
||||||
|
uint8 adc_channel;
|
||||||
|
};
|
||||||
|
|
||||||
|
int Imrt1052HwAdcInit(void);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue