/****************************************************************************** * * (c) Copyright 2002-2010,2013 Xilinx, Inc. All rights reserved. * * This file contains confidential and proprietary information of Xilinx, Inc. * and is protected under U.S. and international copyright and other * intellectual property laws. * * DISCLAIMER * This disclaimer is not a license and does not grant any rights to the * materials distributed herewith. Except as otherwise provided in a valid * license issued to you by Xilinx, and to the maximum extent permitted by * applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL * FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, * IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF * MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; * and (2) Xilinx shall not be liable (whether in contract or tort, including * negligence, or under any other theory of liability) for any loss or damage * of any kind or nature related to, arising under or in connection with these * materials, including for any direct, or any indirect, special, incidental, * or consequential loss or damage (including loss of data, profits, goodwill, * or any type of loss or damage suffered as a result of any action brought by * a third party) even if such damage or loss was reasonably foreseeable or * Xilinx had been advised of the possibility of the same. * * CRITICAL APPLICATIONS * Xilinx products are not designed or intended to be fail-safe, or for use in * any application requiring fail-safe performance, such as life-support or * safety devices or systems, Class III medical devices, nuclear facilities, * applications related to the deployment of airbags, or any other applications * that could lead to death, personal injury, or severe property or * environmental damage (individually and collectively, "Critical * Applications"). Customer assumes the sole risk and liability of any use of * Xilinx products in Critical Applications, subject only to applicable laws * and regulations governing limitations on product liability. * * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE * AT ALL TIMES. * ******************************************************************************/ /*****************************************************************************/ /** * @file xtmrctr_low_level_example.c * * This file contains a design example using the Timer Counter (XTmrCtr) * low level driver and hardware device in a polled mode. * * @note * * None * *
* MODIFICATION HISTORY:
*
* Ver   Who  Date	 Changes
* ----- ---- -------- -----------------------------------------------
* 1.00b jhl  02/13/02 First release
* 1.00b sv   04/26/05 Minor changes to comply to Doxygen and coding guidelines
* 2.00a ktn  10/30/09 Updated the example as the macros in the driver are
*                     renamed by removing _m in the definition.
*                     Minor changes as per coding guidelines are done.
*
******************************************************************************/ /***************************** Include Files *********************************/ #include "xparameters.h" #include "xstatus.h" #include "xtmrctr_l.h" /************************** Constant Definitions *****************************/ /* * The following constants map to the XPAR parameters created in the * xparameters.h file. They are only defined here such that a user can easily * change all the needed parameters in one place. */ #define TMRCTR_BASEADDR XPAR_TMRCTR_0_BASEADDR /* * This example only uses the 1st of the 2 timer counters contained in a * single timer counter hardware device */ #define TIMER_COUNTER_0 0 /**************************** Type Definitions *******************************/ /***************** Macros (Inline Functions) Definitions *********************/ /************************** Function Prototypes ******************************/ int TmrCtrLowLevelExample(u32 TmrCtrBaseAddress, u8 TimerCounter); /************************** Variable Definitions *****************************/ /*****************************************************************************/ /** * This function is the main function of the Tmrctr low level example. * * @param None. * * @return XST_SUCCESS to indicate success, else XST_FAILURE to indicate * a Failure. * * @note None. * * *****************************************************************************/ int main(void) { int Status; /* * Run the Timer Counter - Low Level example . */ Status = TmrCtrLowLevelExample(TMRCTR_BASEADDR, TIMER_COUNTER_0); if (Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; } /*****************************************************************************/ /** * This function does a minimal test on the timer counter device and * the low level driver as a design example. The purpose of this function is * to illustrate how to use the XTmrCtr low level driver. * * * @param TmrCtrBaseAddress is the base address of the device. * @param TmrCtrNumber is the timer counter of the device to operate on. * Each device may contain multiple timer counters. * The timer number is a zero based number with a range of * 0 - (XTC_DEVICE_TIMER_COUNT - 1). * * @return XST_SUCCESS to indicate success, else XST_FAILURE to indicate * a Failure. * * @note * * This function contains a loop which waits for the value of a timer counter * to change. If the hardware is not working correctly, this function may not * return. * ****************************************************************************/ int TmrCtrLowLevelExample(u32 TmrCtrBaseAddress, u8 TmrCtrNumber) { u32 Value1; u32 Value2; u32 ControlStatus; /* * Clear the Control Status Register */ XTmrCtr_SetControlStatusReg(TmrCtrBaseAddress, TmrCtrNumber,0x0); /* * Set the value that is loaded into the timer counter and cause it to * be loaded into the timer counter */ XTmrCtr_SetLoadReg(TmrCtrBaseAddress, TmrCtrNumber, 0xDEADBEEF); XTmrCtr_LoadTimerCounterReg(TmrCtrBaseAddress, TmrCtrNumber); /* * Clear the Load Timer bit in the Control Status Register */ ControlStatus = XTmrCtr_GetControlStatusReg(TmrCtrBaseAddress, TmrCtrNumber); XTmrCtr_SetControlStatusReg(TmrCtrBaseAddress, TmrCtrNumber, ControlStatus & (~XTC_CSR_LOAD_MASK)); /* * Get a snapshot of the timer counter value before it's started * to compare against later */ Value1 = XTmrCtr_GetTimerCounterReg(TmrCtrBaseAddress, TmrCtrNumber); /* * Start the timer counter such that it's incrementing by default */ XTmrCtr_Enable(TmrCtrBaseAddress, TmrCtrNumber); /* * Read the value of the timer counter and wait for it to change, * since it's incrementing it should change, if the hardware is not * working for some reason, this loop could be infinite such that the * function does not return */ while (1) { Value2 = XTmrCtr_GetTimerCounterReg(TmrCtrBaseAddress, TmrCtrNumber); if (Value1 != Value2) { break; } } /* * Disable the timer counter such that it stops incrementing */ XTmrCtr_Disable(TmrCtrBaseAddress, TmrCtrNumber); return XST_SUCCESS; }