/* * Copyright (C) 2015 Infineon Technologies AG. All rights reserved. * * Infineon Technologies AG (Infineon) is supplying this software for use with * Infineon's microcontrollers. * This file can be freely distributed within development tools that are * supporting such microcontrollers. * * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. * INFINEON SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, * OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. * */ /** * @file * @date 04 Dec, 2014 * @version 1.0.0 * * @brief XMC4500 CPU board VADC measurement example * * This is an example depicting usage of the ADC driver. * The ADC driver is used to configure various functional blocks of the * peripheral, setting up of a single entry queue and converting the lone * entry by means of a software generated queue conversion request periodically * in the SysTick handler. The SysTick timer is configured to fire every 10ms. * The results are send via UART and can be visualize in a PC using a terminal program * * History
* * Version 1.0.0 Initial
* */ /********************************************************************************************************************* * HEADER FILES ********************************************************************************************************************/ #include #include #include #include /********************************************************************************************************************* * MACROS ********************************************************************************************************************/ /* Pin P14.1 is measured and converted */ #define CHANNEL_NUMBER (1U) #define VADC_GROUP_PTR (VADC_G0) /* Register result */ #define RES_REG_NUMBER (0) /* UART pins */ #define UART_TX P1_5 #define UART_RX P1_4 /* ADC Conversion rate (ms) */ #define TICK_PERIOD (10U) /********************************************************************************************************************* * GLOBAL DATA ********************************************************************************************************************/ /* Initialization data of VADC Global resources */ XMC_VADC_GLOBAL_CONFIG_t g_global_config = { .clock_config = { .analog_clock_divider = 3, .msb_conversion_clock = 0, .arbiter_clock_divider = 1 }, }; /* Initialization data of a VADC group */ XMC_VADC_GROUP_CONFIG_t g_group_config = { .class1 = { .conversion_mode_standard = XMC_VADC_CONVMODE_12BIT, .sample_time_std_conv = 3U, } }; XMC_VADC_QUEUE_CONFIG_t g_queue_config; /* Channel configuration data */ XMC_VADC_CHANNEL_CONFIG_t g_channel_config = { .input_class = XMC_VADC_CHANNEL_CONV_GROUP_CLASS1, .result_reg_number = RES_REG_NUMBER, .alias_channel = XMC_VADC_CHANNEL_ALIAS_DISABLED }; /* Result configuration data */ XMC_VADC_RESULT_CONFIG_t g_result_config = { .wait_for_read_mode = true }; /* Queue Entry */ XMC_VADC_QUEUE_ENTRY_t g_queue_entry = { .channel_num = CHANNEL_NUMBER, .refill_needed = true, /* Refill is needed */ .generate_interrupt = true, /* Interrupt generation is needed */ .external_trigger = true /* External trigger is required */ }; XMC_UART_CH_CONFIG_t uart_config = { .data_bits = 8U, .stop_bits = 1U, .baudrate = 115200U }; /********************************************************************************************************************* * MAIN APPLICATION ********************************************************************************************************************/ /* Result handler */ void VADC0_G0_0_IRQHandler(void) { XMC_VADC_RESULT_SIZE_t result; /* Read the result register */ result = XMC_VADC_GROUP_GetResult(VADC_GROUP_PTR, RES_REG_NUMBER); /* Acknowledge the interrupt */ XMC_VADC_GROUP_QueueClearReqSrcEvent(VADC_GROUP_PTR); /* Transmit measurement result */ XMC_UART_CH_Transmit(XMC_UART0_CH0, (result & 0xf00U) >> 8U); XMC_UART_CH_Transmit(XMC_UART0_CH0, result & 0x0ffU); } /* Trigger periodically a conversion request */ void SysTick_Handler(void) { /* Trigger next conversion */ XMC_VADC_GROUP_QueueTriggerConversion(VADC_GROUP_PTR); } /* Application entry point */ int main(void) { XMC_UART_CH_Init(XMC_UART0_CH0, &uart_config); XMC_UART_CH_SetInputSource(XMC_UART0_CH0, XMC_UART_CH_INPUT_RXD, USIC0_C0_DX0_P1_4); XMC_UART_CH_Start(XMC_UART0_CH0); XMC_GPIO_SetMode(UART_TX, XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2); XMC_GPIO_SetMode(UART_RX, XMC_GPIO_MODE_INPUT_TRISTATE); /* Initialize the VADC global registers */ XMC_VADC_GLOBAL_Init(VADC, &g_global_config); /* Configure a conversion kernel */ XMC_VADC_GROUP_Init(VADC_GROUP_PTR, &g_group_config); XMC_VADC_GROUP_QueueInit(VADC_GROUP_PTR, &g_queue_config); /* Configure a channel belonging to the aforesaid conversion kernel */ XMC_VADC_GROUP_ChannelInit(VADC_GROUP_PTR,CHANNEL_NUMBER, &g_channel_config); /* Configure a result resource belonging to the aforesaid conversion kernel */ XMC_VADC_GROUP_ResultInit(VADC_GROUP_PTR, RES_REG_NUMBER, &g_result_config); /* Add the channel to the queue */ XMC_VADC_GROUP_QueueInsertChannel(VADC_GROUP_PTR, g_queue_entry); /* Connect Request Source Event to the NVIC nodes */ XMC_VADC_GROUP_QueueSetReqSrcEventInterruptNode(VADC_GROUP_PTR, XMC_VADC_SR_GROUP_SR0); /* Enable IRQ */ NVIC_SetPriority(VADC0_G0_0_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 63, 0)); NVIC_EnableIRQ(VADC0_G0_0_IRQn); /* Enable the analog converters */ XMC_VADC_GROUP_SetPowerMode(VADC_GROUP_PTR, XMC_VADC_GROUP_POWERMODE_NORMAL); /* Perform calibration of the converter */ XMC_VADC_GLOBAL_StartupCalibration(VADC); /* System timer configuration */ SysTick_Config(SystemCoreClock / TICK_PERIOD); while(1); }