Other Parts Discussed in Thread: LP-MSPM0G3507
Tool/software:
Dear TI Engineers,
I hope this message finds you well. I am currently working on an ADC configuration based on the example "adc_singlechannel" (PA22 → ADC0, PA17 → ADC1 TI_driver). Initially, I had a 2-channel setup (ADC0 and ADC1), but I expanded ADC0 from 1 channel to 6 channels. However, I am encountering an issue where connecting 3.3V to PA22 affects all readings except for ADC0_3.
Here is the observed behavior:
When 3.3V is connected to PA22, all ADC readings are affected except for ADC0_3.
When 3.3V is connected to PA17, ADC0_3 shows a reading.
When 3.3V is connected to PA15, no effect is observed.
The pin-to-channel mapping is as follows:
A0_7→ PA22
A0_12 → PA14
A0_0 → PA27
A0_1 → PA26
A0_2 → PA25
A0_3 → PA24
A1_0 → PA15
Could you please provide guidance on why connecting 3.3V to PA22 affects all channels except ADC0_3? Additionally, why does connecting 3.3V to PA17 result in a reading for ADC0_3, while connecting to PA15 has no effect?
Thank you for your time and support. I look forward to your insights.
Best regards,
Pakho
void *adcSrvThread(void *arg) { AdcSrv_Handle adcSrv; // ADC service handle // Statistics for 6 ADC0 channels and 1 ADC1 channel AdcSampleStats stats0; // ADC0 Channel 7 (A0_7 - AMP_ID) AdcSampleStats stats0_12; // ADC0 Channel 12 (A0_12 - HW_ID) AdcSampleStats stats0_0; // ADC0 Channel 0 (A0_0 - CH1_FET1_NTC) AdcSampleStats stats0_1; // ADC0 Channel 1 (A0_1 - CH1_FET2_NTC) AdcSampleStats stats0_2; // ADC0 Channel 2 (A0_2 - CH2_FET1_NTC) AdcSampleStats stats0_3; // ADC0 Channel 3 (A0_3 - CH2_FET2_NTC) AdcSampleStats stats1; // ADC1 Channel // Initialize ADC service if (AdcSrv_init(&adcSrv) != 0) { LOG_PRINT_ERR("ADC service initialization failed"); return NULL; } LOG_PRINT_INF("ADC service started with 6 channels"); uint32_t cycle_count = 0; while (1) { // Clear statistics for all channels memset(&stats0, 0, sizeof(AdcSampleStats)); memset(&stats0_12, 0, sizeof(AdcSampleStats)); memset(&stats0_0, 0, sizeof(AdcSampleStats)); memset(&stats0_1, 0, sizeof(AdcSampleStats)); memset(&stats0_2, 0, sizeof(AdcSampleStats)); memset(&stats0_3, 0, sizeof(AdcSampleStats)); memset(&stats1, 0, sizeof(AdcSampleStats)); // Perform ADC sampling cycle with correct parameter order // Order: stats0 (A0_7), stats0_12 (A0_12), stats0_0 (A0_0), stats0_1 (A0_1), stats0_2 (A0_2), stats0_3 (A0_3), stats1 (ADC1) if (AdcSrv_sampleCycle(&adcSrv, &stats0, &stats0_12, &stats0_0, &stats0_1, &stats0_2, &stats0_3, &stats1) != 0) { break; } // Display results for all 6 ADC0 channels if (stats0.avg > 0) { LOG_PRINT_DBG("ADC0_7(AMP_ID)[%lu]: min=%d, max=%d, avg=%d (%.2f V)", cycle_count, stats0.min, stats0.max, stats0.avg, (float)stats0.microvolts / 1000000.0f); } if (stats0_12.avg > 0) { LOG_PRINT_DBG("ADC0_12(HW_ID)[%lu]: min=%d, max=%d, avg=%d (%.2f V)", cycle_count, stats0_12.min, stats0_12.max, stats0_12.avg, (float)stats0_12.microvolts / 1000000.0f); } if (stats0_0.avg > 0) { LOG_PRINT_DBG("ADC0_0(CH1_FET1_NTC)[%lu]: min=%d, max=%d, avg=%d (%.2f V)", cycle_count, stats0_0.min, stats0_0.max, stats0_0.avg, (float)stats0_0.microvolts / 1000000.0f); } if (stats0_1.avg > 0) { LOG_PRINT_DBG("ADC0_1(CH1_FET2_NTC)[%lu]: min=%d, max=%d, avg=%d (%.2f V)", cycle_count, stats0_1.min, stats0_1.max, stats0_1.avg, (float)stats0_1.microvolts / 1000000.0f); } if (stats0_2.avg > 0) { LOG_PRINT_DBG("ADC0_2(CH2_FET1_NTC)[%lu]: min=%d, max=%d, avg=%d (%.2f V)", cycle_count, stats0_2.min, stats0_2.max, stats0_2.avg, (float)stats0_2.microvolts / 1000000.0f); } if (stats0_3.avg > 0) { LOG_PRINT_DBG("ADC0_3(CH2_FET2_NTC)[%lu]: min=%d, max=%d, avg=%d (%.2f V)", cycle_count, stats0_3.min, stats0_3.max, stats0_3.avg, (float)stats0_3.microvolts / 1000000.0f); } // Display results for ADC1 channel if (stats1.avg > 0) { LOG_PRINT_DBG("ADC1[%lu]: min=%d, max=%d, avg=%d (%.2f V)", cycle_count, stats1.min, stats1.max, stats1.avg, (float)stats1.microvolts / 1000000.0f); } LOG_PRINT_DBG("----------------------"); cycle_count++; usleep(CYCLE_DELAY_MS * 1000); } // Cleanup ADC service AdcSrv_close(&adcSrv); return NULL; }
/** * @file AdcDrv.c * @brief ADC Driver Implementation * * This file implements the low-level ADC driver functionality for dual-channel * ADC operations. It provides initialization, reading, and cleanup operations * for two ADC channels. */ #include "AdcDrv.h" #include <ti/drivers/ADC.h> #include "ti_drivers_config.h" /** * @brief Initialize ADC Driver * * Initializes all ADC channels with default parameters. * * @param handle Pointer to ADC driver handle structure * @return 0 on success, negative error code on failure */ int AdcDrv_init(AdcDrv_Handle *handle) { ADC_Params params; ADC_Params_init(¶ms); // Initialize ADC0 channels handle->adc0 = ADC_open(CONFIG_ADC_0, ¶ms); // A0_7 (AMP_ID) if (handle->adc0 == NULL) { return -1; // ADC0 initialization failed } // Initialize additional ADC0 channels handle->adc0_12 = ADC_open(CONFIG_ADC_2, ¶ms); // A0_12 (HW_ID) if (handle->adc0_12 == NULL) { AdcDrv_close(handle); return -2; // ADC0_12 initialization failed } handle->adc0_0 = ADC_open(CONFIG_ADC_3, ¶ms); // A0_0 (CH1_FET1_NTC) if (handle->adc0_0 == NULL) { AdcDrv_close(handle); return -3; // ADC0_0 initialization failed } handle->adc0_1 = ADC_open(CONFIG_ADC_4, ¶ms); // A0_1 (CH1_FET2_NTC) if (handle->adc0_1 == NULL) { AdcDrv_close(handle); return -4; // ADC0_1 initialization failed } handle->adc0_2 = ADC_open(CONFIG_ADC_5, ¶ms); // A0_2 (CH2_FET1_NTC) if (handle->adc0_2 == NULL) { AdcDrv_close(handle); return -5; // ADC0_2 initialization failed } handle->adc0_3 = ADC_open(CONFIG_ADC_6, ¶ms); // A0_3 (CH2_FET2_NTC) if (handle->adc0_3 == NULL) { AdcDrv_close(handle); return -6; // ADC0_3 initialization failed } // Initialize ADC1 channel handle->adc1 = ADC_open(CONFIG_ADC_1, ¶ms); if (handle->adc1 == NULL) { AdcDrv_close(handle); return -7; // ADC1 initialization failed } return 0; // Success } /** * @brief Read from ADC Channel 0 * * Performs a single conversion on ADC channel 0 and returns the result. * Checks if the ADC handle is valid before conversion. * * @param handle Pointer to ADC driver handle structure * @param value Pointer to store the ADC conversion result * @return 0 on success, -1 if ADC handle is invalid */ int AdcDrv_readChannel0(AdcDrv_Handle *handle, uint16_t *value) { if (handle->adc0 == NULL) return -1; return ADC_convert(handle->adc0, value); } /** * @brief Read ADC Channel 1 * * Reads the value from ADC channel 1. If the conversion fails, it returns -1. * * @param handle Pointer to ADC driver handle structure * @param value Pointer to store the read ADC value * @return 0 on success, -1 on failure */ int AdcDrv_readChannel1(AdcDrv_Handle *handle, uint16_t *value) { if (handle->adc1 == NULL) return -1; return ADC_convert(handle->adc1, value); } /** * @brief Read ADC0 Channel 12 (HW_ID) * * Reads the value from ADC0 channel 12. If the conversion fails, it returns -1. * * @param handle Pointer to ADC driver handle structure * @param value Pointer to store the read ADC value * @return 0 on success, -1 on failure */ int AdcDrv_readChannel0_12(AdcDrv_Handle *handle, uint16_t *value) { if (handle->adc0_12 == NULL) return -1; return ADC_convert(handle->adc0_12, value); } /** * @brief Read ADC0 Channel 0 (CH1_FET1_NTC) * * Reads the value from ADC0 channel 0. If the conversion fails, it returns -1. * * @param handle Pointer to ADC driver handle structure * @param value Pointer to store the read ADC value * @return 0 on success, -1 on failure */ int AdcDrv_readChannel0_0(AdcDrv_Handle *handle, uint16_t *value) { if (handle->adc0_0 == NULL) return -1; return ADC_convert(handle->adc0_0, value); } /** * @brief Read ADC0 Channel 1 (CH1_FET2_NTC) * * Reads the value from ADC0 channel 1. If the conversion fails, it returns -1. * * @param handle Pointer to ADC driver handle structure * @param value Pointer to store the read ADC value * @return 0 on success, -1 on failure */ int AdcDrv_readChannel0_1(AdcDrv_Handle *handle, uint16_t *value) { if (handle->adc0_1 == NULL) return -1; return ADC_convert(handle->adc0_1, value); } /** * @brief Read ADC0 Channel 2 (CH2_FET1_NTC) * * Reads the value from ADC0 channel 2. If the conversion fails, it returns -1. * * @param handle Pointer to ADC driver handle structure * @param value Pointer to store the read ADC value * @return 0 on success, -1 on failure */ int AdcDrv_readChannel0_2(AdcDrv_Handle *handle, uint16_t *value) { if (handle->adc0_2 == NULL) return -1; return ADC_convert(handle->adc0_2, value); } /** * @brief Read ADC0 Channel 3 (CH2_FET2_NTC) * * Reads the value from ADC0 channel 3. If the conversion fails, it returns -1. * * @param handle Pointer to ADC driver handle structure * @param value Pointer to store the read ADC value * @return 0 on success, -1 on failure */ int AdcDrv_readChannel0_3(AdcDrv_Handle *handle, uint16_t *value) { if (handle->adc0_3 == NULL) return -1; return ADC_convert(handle->adc0_3, value); } /** * @brief Close ADC Driver * * Closes all ADC channels and cleans up their resources. Sets the handles * to NULL after closing to prevent accidental reuse. * * @param handle Pointer to ADC driver handle structure */ void AdcDrv_close(AdcDrv_Handle *handle) { // Close all ADC0 channels if they exist if (handle->adc0) { ADC_close(handle->adc0); handle->adc0 = NULL; } if (handle->adc0_12) { ADC_close(handle->adc0_12); handle->adc0_12 = NULL; } if (handle->adc0_0) { ADC_close(handle->adc0_0); handle->adc0_0 = NULL; } if (handle->adc0_1) { ADC_close(handle->adc0_1); handle->adc0_1 = NULL; } if (handle->adc0_2) { ADC_close(handle->adc0_2); handle->adc0_2 = NULL; } if (handle->adc0_3) { ADC_close(handle->adc0_3); handle->adc0_3 = NULL; } // Close ADC1 channel if it exists if (handle->adc1) { ADC_close(handle->adc1); handle->adc1 = NULL; } }
/** * @file AdcSrv.c * @brief ADC Service Implementation * * This file implements the ADC service layer that provides high-level ADC * functionality including multi-channel sampling and statistical analysis. * It uses the low-level ADC driver for actual ADC operations. */ #include "AdcSrv.h" #include "AdcDrv.h" #include <unistd.h> /** * @brief Sampling delay in microseconds * * Defines the delay between consecutive ADC samples to allow proper * signal settling and prevent ADC overload. */ #define SAMPLE_DELAY_US 10000 /** * @brief Number of samples per channel per cycle * * Defines how many samples to take from each ADC channel in one * sampling cycle for statistical analysis. */ #define SAMPLE_COUNT 5 /** * @brief Static ADC driver instance * * This structure maintains the state of the underlying ADC driver * and is used by all ADC service operations. */ static AdcDrv_Handle adcDrv; /** * @brief Initialize ADC Service * * Initializes the ADC service by setting up the service handle and * initializing the underlying ADC driver. The service is marked as * running and configured with the default sample count. * * @param handle Pointer to ADC service handle structure * @return 0 on success, negative error code on failure */ int AdcSrv_init(AdcSrv_Handle *handle) { // Set initial service state handle->running = true; handle->sample_count = SAMPLE_COUNT; // Initialize underlying ADC driver int ret = AdcDrv_init(&adcDrv); if (ret != 0) { return ret; // Propagate error code } return 0; // Success } /** * @brief Execute Single Sampling Cycle * * Performs a complete sampling cycle on all ADC channels, collecting * multiple samples from each channel and calculating statistical data * (min, max, average) for each channel. * * @param handle Pointer to ADC service handle structure * @param stats0 Pointer to statistics structure for ADC0 channel 7 (AMP_ID) * @param stats0_12 Pointer to statistics structure for ADC0 channel 12 (HW_ID) * @param stats0_0 Pointer to statistics structure for ADC0 channel 0 (CH1_FET1_NTC) * @param stats0_1 Pointer to statistics structure for ADC0 channel 1 (CH1_FET2_NTC) * @param stats0_2 Pointer to statistics structure for ADC0 channel 2 (CH2_FET1_NTC) * @param stats0_3 Pointer to statistics structure for ADC0 channel 3 (CH2_FET2_NTC) * @param stats1 Pointer to statistics structure for ADC1 channel * @return 0 on success, -1 if service is not running, -2 if invalid parameters */ int AdcSrv_sampleCycle(AdcSrv_Handle *handle, AdcSampleStats *stats0, AdcSampleStats *stats0_12, AdcSampleStats *stats0_0, AdcSampleStats *stats0_1, AdcSampleStats *stats0_2, AdcSampleStats *stats0_3, AdcSampleStats *stats1) { // Check if service is running if (!handle->running) return -1; // Validate input parameters if (handle == NULL || stats0 == NULL || stats0_12 == NULL || stats0_0 == NULL || stats0_1 == NULL || stats0_2 == NULL || stats0_3 == NULL || stats1 == NULL) { return -2; // Invalid input parameters } // Initialize statistics variables uint16_t min0 = 0xFFFF, max0 = 0, sum0 = 0; uint16_t min0_12 = 0xFFFF, max0_12 = 0, sum0_12 = 0; uint16_t min0_0 = 0xFFFF, max0_0 = 0, sum0_0 = 0; uint16_t min0_1 = 0xFFFF, max0_1 = 0, sum0_1 = 0; uint16_t min0_2 = 0xFFFF, max0_2 = 0, sum0_2 = 0; uint16_t min0_3 = 0xFFFF, max0_3 = 0, sum0_3 = 0; uint16_t min1 = 0xFFFF, max1 = 0, sum1 = 0; int samples0 = 0, samples0_12 = 0, samples0_0 = 0, samples0_1 = 0, samples0_2 = 0, samples0_3 = 0, samples1 = 0; // Collect samples from all channels for (int i = 0; i < handle->sample_count; i++) { uint16_t val; int res; // Sample from channel 0 (A0_7 - AMP_ID) res = AdcDrv_readChannel0(&adcDrv, &val); if (res == 0) { // Update channel 0 statistics if (val < min0) min0 = val; if (val > max0) max0 = val; sum0 += val; samples0++; } // Sample from channel 0_12 (A0_12 - HW_ID) res = AdcDrv_readChannel0_12(&adcDrv, &val); if (res == 0) { // Update channel 0_12 statistics if (val < min0_12) min0_12 = val; if (val > max0_12) max0_12 = val; sum0_12 += val; samples0_12++; } // Sample from channel 0_0 (A0_0 - CH1_FET1_NTC) res = AdcDrv_readChannel0_0(&adcDrv, &val); if (res == 0) { // Update channel 0_0 statistics if (val < min0_0) min0_0 = val; if (val > max0_0) max0_0 = val; sum0_0 += val; samples0_0++; } // Sample from channel 0_1 (A0_1 - CH1_FET2_NTC) res = AdcDrv_readChannel0_1(&adcDrv, &val); if (res == 0) { // Update channel 0_1 statistics if (val < min0_1) min0_1 = val; if (val > max0_1) max0_1 = val; sum0_1 += val; samples0_1++; } // Sample from channel 0_2 (A0_2 - CH2_FET1_NTC) res = AdcDrv_readChannel0_2(&adcDrv, &val); if (res == 0) { // Update channel 0_2 statistics if (val < min0_2) min0_2 = val; if (val > max0_2) max0_2 = val; sum0_2 += val; samples0_2++; } // Sample from channel 0_3 (A0_3 - CH2_FET2_NTC) res = AdcDrv_readChannel0_3(&adcDrv, &val); if (res == 0) { // Update channel 0_3 statistics if (val < min0_3) min0_3 = val; if (val > max0_3) max0_3 = val; sum0_3 += val; samples0_3++; } // Sample from channel 1 res = AdcDrv_readChannel1(&adcDrv, &val); if (res == 0) { // Update channel 1 statistics if (val < min1) min1 = val; if (val > max1) max1 = val; sum1 += val; samples1++; } // Delay between samples usleep(SAMPLE_DELAY_US); } // Calculate and store channel 0 statistics if (samples0 > 0) { stats0->min = min0; stats0->max = max0; stats0->avg = sum0 / samples0; stats0->microvolts = ADC_convertRawToMicroVolts(adcDrv.adc0, stats0->avg); } // Calculate and store channel 0_12 statistics if (samples0_12 > 0) { stats0_12->min = min0_12; stats0_12->max = max0_12; stats0_12->avg = sum0_12 / samples0_12; stats0_12->microvolts = ADC_convertRawToMicroVolts(adcDrv.adc0_12, stats0_12->avg); } // Calculate and store channel 0_0 statistics if (samples0_0 > 0) { stats0_0->min = min0_0; stats0_0->max = max0_0; stats0_0->avg = sum0_0 / samples0_0; stats0_0->microvolts = ADC_convertRawToMicroVolts(adcDrv.adc0_0, stats0_0->avg); } // Calculate and store channel 0_1 statistics if (samples0_1 > 0) { stats0_1->min = min0_1; stats0_1->max = max0_1; stats0_1->avg = sum0_1 / samples0_1; stats0_1->microvolts = ADC_convertRawToMicroVolts(adcDrv.adc0_1, stats0_1->avg); } // Calculate and store channel 0_2 statistics if (samples0_2 > 0) { stats0_2->min = min0_2; stats0_2->max = max0_2; stats0_2->avg = sum0_2 / samples0_2; stats0_2->microvolts = ADC_convertRawToMicroVolts(adcDrv.adc0_2, stats0_2->avg); } // Calculate and store channel 0_3 statistics if (samples0_3 > 0) { stats0_3->min = min0_3; stats0_3->max = max0_3; stats0_3->avg = sum0_3 / samples0_3; stats0_3->microvolts = ADC_convertRawToMicroVolts(adcDrv.adc0_3, stats0_3->avg); } // Calculate and store channel 1 statistics if (samples1 > 0) { stats1->min = min1; stats1->max = max1; stats1->avg = sum1 / samples1; stats1->microvolts = ADC_convertRawToMicroVolts(adcDrv.adc1, stats1->avg); } return 0; } /** * @brief Close ADC Service * * Stops the ADC service and cleans up resources by marking the service * as not running and closing the underlying ADC driver. * * @param handle Pointer to ADC service handle structure */ void AdcSrv_close(AdcSrv_Handle *handle) { // Mark service as stopped handle->running = false; // Clean up underlying driver resources AdcDrv_close(&adcDrv); }
/* * Copyright (c) 2023, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ======== ti_drivers_config.c ======== * Configured TI-Drivers module definitions */ #include <stddef.h> #include <stdint.h> #include <ti/devices/DeviceFamily.h> #include "ti_drivers_config.h" /* * ============================= Display ============================= */ #include <ti/display/Display.h> #include <ti/display/DisplayUart.h> #define CONFIG_Display_COUNT 1 const uint_least8_t CONFIG_UART_0 = 0; const uint_least8_t CONFIG_UART_1 = 1; const uint_least8_t UART_count = CONFIG_UART_COUNT; #define DISPLAY_UARTBUFFERSIZE 100 static char displayUARTBuffer[DISPLAY_UARTBUFFERSIZE]; DisplayUart_Object displayUartObject; const DisplayUart_HWAttrs displayUartHWAttrs = {.uartIdx = CONFIG_UART_1, .baudRate = 115200, .mutexTimeout = (unsigned int) (-1), .strBuf = displayUARTBuffer, .strBufLen = DISPLAY_UARTBUFFERSIZE}; const Display_Config Display_config[CONFIG_Display_COUNT] = { /* CONFIG_Display_0 */ /* XDS110 UART */ {.fxnTablePtr = &DisplayUartMin_fxnTable, .object = &displayUartObject, .hwAttrs = &displayUartHWAttrs}, }; const uint_least8_t Display_count = CONFIG_Display_COUNT; /* * =============================== DMA =============================== */ #include <ti/drivers/dma/DMAMSPM0.h> const uint_least8_t CONFIG_DMA_0 = 0; const uint_least8_t DMA_Count = CONFIG_DMA_COUNT; DMAMSPM0_Object DMAObject[CONFIG_DMA_CH_COUNT] = { {.dmaTransfer = { .rxTrigger = DMA_UART0_RX_TRIG, .rxTriggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL, .transferMode = DL_DMA_SINGLE_TRANSFER_MODE, .extendedMode = DL_DMA_NORMAL_MODE, .destWidth = DL_DMA_WIDTH_BYTE, .srcWidth = DL_DMA_WIDTH_BYTE, .destIncrement = DL_DMA_ADDR_INCREMENT, .dmaChannel = 0, .dmaTransferSource = NULL, .dmaTransferDestination = NULL, .enableDMAISR = false, }}, }; static const DMAMSPM0_HWAttrs DMAMSP0HWAttrs[CONFIG_DMA_COUNT] = { { .dmaIsrFxn = NULL, .intPriority = DEFAULT_DMA_PRIORITY, .roundRobinPriority = 0, }, }; const DMAMSPM0_Cfg DMAMSPM0_Config[CONFIG_DMA_COUNT] = { { &DMAMSP0HWAttrs[CONFIG_DMA_0], &DMAObject[CONFIG_DMA_0], }, }; /* * =============================== GPIO =============================== */ #include <ti/drivers/GPIO.h> #include <ti/drivers/gpio/GPIOMSPM0.h> /* The range of pins available on this device */ const uint_least8_t GPIO_pinLowerBound = 0; const uint_least8_t GPIO_pinUpperBound = 60; /* * ======== gpioPinConfigs ======== * Array of Pin configurations */ GPIO_PinConfig gpioPinConfigs[60] = { GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA0 - I2C SDA */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA1 - I2C SCL */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA2 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA3 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA4 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA5 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA6 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA7 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA8 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA9 */ GPIO_CFG_OUTPUT | GPIO_CFG_OUT_HIGH, /* PA10:CONFIG_GPIO_UART2_0_TX */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_PD, /* PA11:CONFIG_GPIO_UART2_0_RX */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA12 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA13 */ /* Owned by CONFIG_ADC_0, channel 12 as ADC Pin */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_NOPULL, /* PA14:CONFIG_GPIO_ADC_0_AIN12 (HW_ID) */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA15 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA16 */ /* Owned by CONFIG_ADC_1, channel 2 as ADC Pin */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_NOPULL, /* PA17:CONFIG_GPIO_ADC_1_AIN */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA18 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA19 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA20 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA21 */ /* Owned by CONFIG_ADC_0, channel 7 as ADC Pin */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_NOPULL, /* PA22:CONFIG_GPIO_ADC_0_AIN7 (AMP_ID) */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA23 */ /* Owned by CONFIG_ADC_0, channel 3 as ADC Pin */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_NOPULL, /* PA24:CONFIG_GPIO_ADC_0_AIN3 (CH2_FET2_NTC) */ /* Owned by CONFIG_ADC_0, channel 2 as ADC Pin */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_NOPULL, /* PA25:CONFIG_GPIO_ADC_0_AIN2 (CH2_FET1_NTC) */ /* Owned by CONFIG_ADC_0, channel 1 as ADC Pin */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_NOPULL, /* PA26:CONFIG_GPIO_ADC_0_AIN1 (CH1_FET2_NTC) */ /* Owned by CONFIG_ADC_0, channel 0 as ADC Pin */ GPIO_CFG_INPUT | GPIO_CFG_IN_INT_NONE | GPIO_CFG_IN_NOPULL, /* PA27:CONFIG_GPIO_ADC_0_AIN0 (CH1_FET1_NTC) */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA28 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA29 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA30 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PA31 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB0 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB1 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB2 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB3 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB4 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB5 */ GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH | IOMUX_PINCM23,/* PB6 - AMP_RST */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB7 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB8 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB9 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB10 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB11 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB12 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB13 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB14 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB15 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB16 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB17 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB18 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB19 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB20 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB21 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB22 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB23 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB24 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB25 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB26 */ GPIO_CFG_INPUT | GPIO_DO_NOT_CONFIG, /* PB27 */ }; /* * ======== gpioCallbackFunctions ======== * Array of callback function pointers * Change at runtime with GPIO_setCallback() */ GPIO_CallbackFxn gpioCallbackFunctions[60]; /* * ======== gpioUserArgs ======== * Array of user argument pointers * Change at runtime with GPIO_setUserArg() * Get values with GPIO_getUserArg() */ void *gpioUserArgs[60]; const uint_least8_t CONFIG_GPIO_LED_0_CONST = CONFIG_GPIO_LED_0; const uint_least8_t CONFIG_GPIO_ADC_0_AIN_CONST = CONFIG_GPIO_ADC_0_AIN; const uint_least8_t CONFIG_GPIO_ADC_1_AIN_CONST = CONFIG_GPIO_ADC_1_AIN; const uint_least8_t CONFIG_GPIO_UART_0_TX_CONST = CONFIG_GPIO_UART_0_TX; const uint_least8_t CONFIG_GPIO_UART_0_RX_CONST = CONFIG_GPIO_UART_0_RX; const uint_least8_t CONFIG_I2C_CONTROLLER_CONST = CONFIG_I2C_0; /* * ======== GPIO_config ======== */ const GPIO_Config GPIO_config = {.configs = (GPIO_PinConfig *) gpioPinConfigs, .callbacks = (GPIO_CallbackFxn *) gpioCallbackFunctions, .userArgs = gpioUserArgs, .intPriority = (~0)}; /* * =============================== I2C Controller =============================== */ #include <ti/drivers/I2C.h> #include <ti/drivers/i2c/I2CMSPM0.h> #define CONFIG_I2C_COUNT 1 /* * ======== i2cObjects ======== */ I2CMSPM0_Object I2CMSPM0Objects[CONFIG_I2C_COUNT]; /* * ======== i2cHWAttrs ======== */ const I2CMSPM0_HWAttrs I2CMSPM0HWAttrs[CONFIG_I2C_COUNT] = { /* CONFIG_I2C_CONTROLLER */ /* LaunchPad I2C */ { .i2c = I2C_INST, .intNum = I2C_INST_INT_IRQN, .intPriority = (~0), .sdaPincm = GPIO_I2C_IOMUX_SDA, .sdaPinIndex = GPIO_I2C_SDA_PIN, .sdaPinMux = GPIO_I2C_IOMUX_SDA_FUNC, .sclPincm = GPIO_I2C_IOMUX_SCL, .sclPinIndex = GPIO_I2C_SCL_PIN, .sclPinMux = GPIO_I2C_IOMUX_SCL_FUNC, .clockSource = DL_I2C_CLOCK_BUSCLK, .clockDivider = DL_I2C_CLOCK_DIVIDE_1, .txIntFifoThr = DL_I2C_TX_FIFO_LEVEL_BYTES_1, .rxIntFifoThr = DL_I2C_RX_FIFO_LEVEL_BYTES_1, .isClockStretchingEnabled = true, .i2cClk = I2C_CLOCK_MHZ, }, }; /* * ======== I2C_config ======== */ const I2C_Config I2C_config[CONFIG_I2C_COUNT] = { /* CONFIG_I2C_CONTROLLER */ /* LaunchPad I2C */ {.object = &I2CMSPM0Objects[CONFIG_I2C_0], .hwAttrs = &I2CMSPM0HWAttrs[CONFIG_I2C_0]}, }; const uint_least8_t CONFIG_I2C_CONST = CONFIG_I2C_0; const uint_least8_t I2C_count = CONFIG_I2C_COUNT; /* * =============================== ADC =============================== */ #include <ti/drivers/ADC.h> #include <ti/drivers/adc/ADCMSPM0.h> #define CONFIG_ADC_COUNT 8 // 1个ADC0实例 + 1个ADC1实例 + 6个ADC0通道 /* * ======== adcMSPM0Objects ======== */ ADCMSPM0_Object adcObjects[CONFIG_ADC_COUNT]; /* * ======== adcMSPM0HWAttrs ======== */ const ADCMSPM0_HWAttrs adcHWAttrs[CONFIG_ADC_COUNT] = { /* CONFIG_ADC_0 - Main ADC0 instance (A0_7 - AMP_ID) */ {.adc = ADC_0_INST, .adcInputDIO = CONFIG_GPIO_ADC_0_AIN7, .adcInputPincm = CONFIG_GPIO_ADC_0_AIN7_PINCM, .adcInputPinMux = CONFIG_GPIO_ADC_0_AIN7_PINMUX, .adcPosRefDIO = GPIO_INVALID_INDEX, .adcNegRefDIO = GPIO_INVALID_INDEX, .adcChannel = 7, .refSource = ADCMSPM0_VDDA_REFERENCE, .samplingDuration = 16, .refVoltage = 3300000, /* uV */ .resolutionBits = ADCMSPM0_RESOLUTION_12_BIT, .adcClkkDivider = ADCMSPM0_CLKDIV_8, .adcClkSelect = ADCMSPM0_CLK_ULPCLK, .adcClkFreqRange = ADCMSPM0_CLK_FREQ_RANGE_24TO32, .conversionMode = ADCMSPM0_SINGLE_CH_SINGLE_CONV, .conversionStartAddr = 0, .conversionEndAddr = 0, .repeatConversionMode = ADCMSPM0_REPEAT_MODE_ENABLED, .samplingMode = ADCMSPM0_SAMPLING_MODE_AUTO, .sampleTrigger = ADCMSPM0_SAMPLING_TRIG_SW, .conversionDataFormat = ADCMSPM0_CONV_DATA_FORMAT_UNSIGNED, .sampleTimerSrc = ADCMSPM0_SAMP_TMR_SOURCE_SCOMP0, .conversionTrigger = ADCMSPM0_NEXT_CONV_WITH_TRIG, .adcHWAveraging = ADCMSPM0_HW_AVG_DISABLED, .idxMEMCTLx = 0}, /* ADC0 Channel 2 - A0_12 (HW_ID) */ {.adc = ADC_0_INST, .adcInputDIO = CONFIG_GPIO_ADC_0_AIN12, .adcInputPincm = CONFIG_GPIO_ADC_0_AIN12_PINCM, .adcInputPinMux = CONFIG_GPIO_ADC_0_AIN12_PINMUX, .adcPosRefDIO = GPIO_INVALID_INDEX, .adcNegRefDIO = GPIO_INVALID_INDEX, .adcChannel = 12, .refSource = ADCMSPM0_VDDA_REFERENCE, .samplingDuration = 16, .refVoltage = 3300000, /* uV */ .resolutionBits = ADCMSPM0_RESOLUTION_12_BIT, .adcClkkDivider = ADCMSPM0_CLKDIV_8, .adcClkSelect = ADCMSPM0_CLK_ULPCLK, .adcClkFreqRange = ADCMSPM0_CLK_FREQ_RANGE_24TO32, .conversionMode = ADCMSPM0_SINGLE_CH_SINGLE_CONV, .conversionStartAddr = 0, .conversionEndAddr = 0, .repeatConversionMode = ADCMSPM0_REPEAT_MODE_ENABLED, .samplingMode = ADCMSPM0_SAMPLING_MODE_AUTO, .sampleTrigger = ADCMSPM0_SAMPLING_TRIG_SW, .conversionDataFormat = ADCMSPM0_CONV_DATA_FORMAT_UNSIGNED, .sampleTimerSrc = ADCMSPM0_SAMP_TMR_SOURCE_SCOMP0, .conversionTrigger = ADCMSPM0_NEXT_CONV_WITH_TRIG, .adcHWAveraging = ADCMSPM0_HW_AVG_DISABLED, .idxMEMCTLx = 0}, /* ADC0 Channel 3 - A0_0 (CH1_FET1_NTC) */ {.adc = ADC_0_INST, .adcInputDIO = CONFIG_GPIO_ADC_0_AIN0, .adcInputPincm = CONFIG_GPIO_ADC_0_AIN0_PINCM, .adcInputPinMux = CONFIG_GPIO_ADC_0_AIN0_PINMUX, .adcPosRefDIO = GPIO_INVALID_INDEX, .adcNegRefDIO = GPIO_INVALID_INDEX, .adcChannel = 0, .refSource = ADCMSPM0_VDDA_REFERENCE, .samplingDuration = 16, .refVoltage = 3300000, /* uV */ .resolutionBits = ADCMSPM0_RESOLUTION_12_BIT, .adcClkkDivider = ADCMSPM0_CLKDIV_8, .adcClkSelect = ADCMSPM0_CLK_ULPCLK, .adcClkFreqRange = ADCMSPM0_CLK_FREQ_RANGE_24TO32, .conversionMode = ADCMSPM0_SINGLE_CH_SINGLE_CONV, .conversionStartAddr = 0, .conversionEndAddr = 0, .repeatConversionMode = ADCMSPM0_REPEAT_MODE_ENABLED, .samplingMode = ADCMSPM0_SAMPLING_MODE_AUTO, .sampleTrigger = ADCMSPM0_SAMPLING_TRIG_SW, .conversionDataFormat = ADCMSPM0_CONV_DATA_FORMAT_UNSIGNED, .sampleTimerSrc = ADCMSPM0_SAMP_TMR_SOURCE_SCOMP0, .conversionTrigger = ADCMSPM0_NEXT_CONV_WITH_TRIG, .adcHWAveraging = ADCMSPM0_HW_AVG_DISABLED, .idxMEMCTLx = 0}, /* ADC0 Channel 4 - A0_1 (CH1_FET2_NTC) */ {.adc = ADC_0_INST, .adcInputDIO = CONFIG_GPIO_ADC_0_AIN1, .adcInputPincm = CONFIG_GPIO_ADC_0_AIN1_PINCM, .adcInputPinMux = CONFIG_GPIO_ADC_0_AIN1_PINMUX, .adcPosRefDIO = GPIO_INVALID_INDEX, .adcNegRefDIO = GPIO_INVALID_INDEX, .adcChannel = 1, .refSource = ADCMSPM0_VDDA_REFERENCE, .samplingDuration = 16, .refVoltage = 3300000, /* uV */ .resolutionBits = ADCMSPM0_RESOLUTION_12_BIT, .adcClkkDivider = ADCMSPM0_CLKDIV_8, .adcClkSelect = ADCMSPM0_CLK_ULPCLK, .adcClkFreqRange = ADCMSPM0_CLK_FREQ_RANGE_24TO32, .conversionMode = ADCMSPM0_SINGLE_CH_SINGLE_CONV, .conversionStartAddr = 0, .conversionEndAddr = 0, .repeatConversionMode = ADCMSPM0_REPEAT_MODE_ENABLED, .samplingMode = ADCMSPM0_SAMPLING_MODE_AUTO, .sampleTrigger = ADCMSPM0_SAMPLING_TRIG_SW, .conversionDataFormat = ADCMSPM0_CONV_DATA_FORMAT_UNSIGNED, .sampleTimerSrc = ADCMSPM0_SAMP_TMR_SOURCE_SCOMP0, .conversionTrigger = ADCMSPM0_NEXT_CONV_WITH_TRIG, .adcHWAveraging = ADCMSPM0_HW_AVG_DISABLED, .idxMEMCTLx = 0}, /* ADC0 Channel 5 - A0_2 (CH2_FET1_NTC) */ {.adc = ADC_0_INST, .adcInputDIO = CONFIG_GPIO_ADC_0_AIN2, .adcInputPincm = CONFIG_GPIO_ADC_0_AIN2_PINCM, .adcInputPinMux = CONFIG_GPIO_ADC_0_AIN2_PINMUX, .adcPosRefDIO = GPIO_INVALID_INDEX, .adcNegRefDIO = GPIO_INVALID_INDEX, .adcChannel = 2, .refSource = ADCMSPM0_VDDA_REFERENCE, .samplingDuration = 16, .refVoltage = 3300000, /* uV */ .resolutionBits = ADCMSPM0_RESOLUTION_12_BIT, .adcClkkDivider = ADCMSPM0_CLKDIV_8, .adcClkSelect = ADCMSPM0_CLK_ULPCLK, .adcClkFreqRange = ADCMSPM0_CLK_FREQ_RANGE_24TO32, .conversionMode = ADCMSPM0_SINGLE_CH_SINGLE_CONV, .conversionStartAddr = 0, .conversionEndAddr = 0, .repeatConversionMode = ADCMSPM0_REPEAT_MODE_ENABLED, .samplingMode = ADCMSPM0_SAMPLING_MODE_AUTO, .sampleTrigger = ADCMSPM0_SAMPLING_TRIG_SW, .conversionDataFormat = ADCMSPM0_CONV_DATA_FORMAT_UNSIGNED, .sampleTimerSrc = ADCMSPM0_SAMP_TMR_SOURCE_SCOMP0, .conversionTrigger = ADCMSPM0_NEXT_CONV_WITH_TRIG, .adcHWAveraging = ADCMSPM0_HW_AVG_DISABLED, .idxMEMCTLx = 0}, /* ADC0 Channel 6 - A0_3 (CH2_FET2_NTC) */ {.adc = ADC_0_INST, .adcInputDIO = CONFIG_GPIO_ADC_0_AIN3, .adcInputPincm = CONFIG_GPIO_ADC_0_AIN3_PINCM, .adcInputPinMux = CONFIG_GPIO_ADC_0_AIN3_PINMUX, .adcPosRefDIO = GPIO_INVALID_INDEX, .adcNegRefDIO = GPIO_INVALID_INDEX, .adcChannel = 3, .refSource = ADCMSPM0_VDDA_REFERENCE, .samplingDuration = 16, .refVoltage = 3300000, /* uV */ .resolutionBits = ADCMSPM0_RESOLUTION_12_BIT, .adcClkkDivider = ADCMSPM0_CLKDIV_8, .adcClkSelect = ADCMSPM0_CLK_ULPCLK, .adcClkFreqRange = ADCMSPM0_CLK_FREQ_RANGE_24TO32, .conversionMode = ADCMSPM0_SINGLE_CH_SINGLE_CONV, .conversionStartAddr = 0, .conversionEndAddr = 0, .repeatConversionMode = ADCMSPM0_REPEAT_MODE_ENABLED, .samplingMode = ADCMSPM0_SAMPLING_MODE_AUTO, .sampleTrigger = ADCMSPM0_SAMPLING_TRIG_SW, .conversionDataFormat = ADCMSPM0_CONV_DATA_FORMAT_UNSIGNED, .sampleTimerSrc = ADCMSPM0_SAMP_TMR_SOURCE_SCOMP0, .conversionTrigger = ADCMSPM0_NEXT_CONV_WITH_TRIG, .adcHWAveraging = ADCMSPM0_HW_AVG_DISABLED, .idxMEMCTLx = 0}, /* CONFIG_ADC_1 */ {.adc = ADC_1_INST, .adcInputDIO = CONFIG_GPIO_ADC_1_AIN, .adcInputPincm = CONFIG_GPIO_ADC_1_AIN_PINCM, .adcInputPinMux = CONFIG_GPIO_ADC_1_AIN_PINMUX, .adcPosRefDIO = GPIO_INVALID_INDEX, .adcNegRefDIO = GPIO_INVALID_INDEX, .adcChannel = 2, .refSource = ADCMSPM0_VDDA_REFERENCE, .samplingDuration = 16, .refVoltage = 3300000, /* uV */ .resolutionBits = ADCMSPM0_RESOLUTION_12_BIT, .adcClkkDivider = ADCMSPM0_CLKDIV_8, .adcClkSelect = ADCMSPM0_CLK_SYSOSC, .adcClkFreqRange = ADCMSPM0_CLK_FREQ_RANGE_24TO32, .conversionMode = ADCMSPM0_SINGLE_CH_SINGLE_CONV, .conversionStartAddr = 0, .conversionEndAddr = 0, .repeatConversionMode = ADCMSPM0_REPEAT_MODE_ENABLED, .samplingMode = ADCMSPM0_SAMPLING_MODE_AUTO, .sampleTrigger = ADCMSPM0_SAMPLING_TRIG_SW, .conversionDataFormat = ADCMSPM0_CONV_DATA_FORMAT_UNSIGNED, .sampleTimerSrc = ADCMSPM0_SAMP_TMR_SOURCE_SCOMP0, .conversionTrigger = ADCMSPM0_NEXT_CONV_WITH_TRIG, .adcHWAveraging = ADCMSPM0_HW_AVG_DISABLED, .idxMEMCTLx = 0}, /* Additional ADC0 Channels */ }; /* * ======== ADC_config ======== */ const ADC_Config ADC_config[CONFIG_ADC_COUNT] = { /* CONFIG_ADC_0 - Main ADC0 instance (A0_7 - AMP_ID) */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_0], .hwAttrs = &adcHWAttrs[CONFIG_ADC_0]}, /* CONFIG_ADC_1 */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_1], .hwAttrs = &adcHWAttrs[CONFIG_ADC_1]}, /* Additional ADC0 Channels */ /* CONFIG_ADC_2 - A0_12 (HW_ID) */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_2], .hwAttrs = &adcHWAttrs[CONFIG_ADC_2]}, /* CONFIG_ADC_3 - A0_0 (CH1_FET1_NTC) */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_3], .hwAttrs = &adcHWAttrs[CONFIG_ADC_3]}, /* CONFIG_ADC_4 - A0_1 (CH1_FET2_NTC) */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_4], .hwAttrs = &adcHWAttrs[CONFIG_ADC_4]}, /* CONFIG_ADC_5 - A0_2 (CH2_FET1_NTC) */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_5], .hwAttrs = &adcHWAttrs[CONFIG_ADC_5]}, /* CONFIG_ADC_6 - A0_3 (CH2_FET2_NTC) */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_6], .hwAttrs = &adcHWAttrs[CONFIG_ADC_6]}, /* CONFIG_ADC_7 - Additional ADC0 channel placeholder */ {.fxnTablePtr = &ADCMSPM0_fxnTable, .object = &adcObjects[CONFIG_ADC_7], .hwAttrs = &adcHWAttrs[CONFIG_ADC_7]}, }; const uint_least8_t CONFIG_ADC_0_CONST = CONFIG_ADC_0; const uint_least8_t CONFIG_ADC_1_CONST = CONFIG_ADC_1; const uint_least8_t CONFIG_ADC_2_CONST = CONFIG_ADC_2; const uint_least8_t CONFIG_ADC_3_CONST = CONFIG_ADC_3; const uint_least8_t CONFIG_ADC_4_CONST = CONFIG_ADC_4; const uint_least8_t CONFIG_ADC_5_CONST = CONFIG_ADC_5; const uint_least8_t CONFIG_ADC_6_CONST = CONFIG_ADC_6; const uint_least8_t CONFIG_ADC_7_CONST = CONFIG_ADC_7; const uint_least8_t ADC_count = CONFIG_ADC_COUNT; /* * =============================== UART0 =============================== */ #include <ti/drivers/uart/UARTMSPM0.h> static const UARTMSP_HWAttrs UARTMSPHWAttrs[CONFIG_UART_COUNT] = { { .regs = UART0, .irq = UART0_INT_IRQn, .rxPin = IOMUX_PINCM22, /* PA11 */ .rxPinFunction = IOMUX_PINCM22_PF_UART0_RX, .txPin = IOMUX_PINCM21, /* PA10 */ .txPinFunction = IOMUX_PINCM21_PF_UART0_TX, .mode = DL_UART_MODE_NORMAL, .direction = DL_UART_DIRECTION_TX_RX, .flowControl = DL_UART_FLOW_CONTROL_NONE, .clockSource = DL_UART_CLOCK_BUSCLK, .clockDivider = DL_UART_CLOCK_DIVIDE_RATIO_4, .rxIntFifoThr = DL_UART_RX_FIFO_LEVEL_ONE_ENTRY, .txIntFifoThr = DL_UART_TX_FIFO_LEVEL_EMPTY, }, { .regs = UART1, .irq = UART1_INT_IRQn, .rxPin = IOMUX_PINCM20, /* PA9 */ .rxPinFunction = IOMUX_PINCM20_PF_UART1_RX, .txPin = IOMUX_PINCM19, /* PA8 */ .txPinFunction = IOMUX_PINCM19_PF_UART1_TX, .mode = DL_UART_MODE_NORMAL, .direction = DL_UART_DIRECTION_TX_RX, .flowControl = DL_UART_FLOW_CONTROL_NONE, .clockSource = DL_UART_CLOCK_BUSCLK, .clockDivider = DL_UART_CLOCK_DIVIDE_RATIO_4, .rxIntFifoThr = DL_UART_RX_FIFO_LEVEL_ONE_ENTRY, .txIntFifoThr = DL_UART_TX_FIFO_LEVEL_EMPTY, }, }; UART_Data_Object UARTObject[CONFIG_UART_COUNT] = { { .object = { .supportFxns = &UARTMSPSupportFxns, .buffersSupported = true, .eventsSupported = false, .callbacksSupported = false, .dmaSupported = false, .noOfDMAChannels = 0, }, .buffersObject = { .rxBufPtr = rxBuffer, .txBufPtr = txBuffer, .rxBufSize = sizeof(rxBuffer), .txBufSize = sizeof(txBuffer), }, }, { .object = { .supportFxns = &UARTMSPSupportFxns, .buffersSupported = true, .eventsSupported = false, .callbacksSupported = false, .dmaSupported = false, .noOfDMAChannels = 0, }, .buffersObject = { .rxBufPtr = rxBuffer, .txBufPtr = txBuffer, .rxBufSize = sizeof(rxBuffer), .txBufSize = sizeof(txBuffer), }, }, }; const UART_Config UART_config[CONFIG_UART_COUNT] = { { &UARTObject[CONFIG_UART_0], &UARTMSPHWAttrs[CONFIG_UART_0], }, { &UARTObject[CONFIG_UART_1], &UARTMSPHWAttrs[CONFIG_UART_1], }, }; void UART0_IRQHandler(void) { UARTMSP_interruptHandler((UART_Handle) &UART_config[CONFIG_UART_0]); } void UART1_IRQHandler(void) { UARTMSP_interruptHandler((UART_Handle) &UART_config[CONFIG_UART_1]); } void UARTMSP_eventCallback( UART_Handle handle, uint32_t event, uint32_t data, void *userArg) { }