pio.h
上传用户:jnhtjd
上传日期:2022-07-16
资源大小:403k
文件大小:7k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. /// unit
  31. ///
  32. /// !!!Purpose
  33. /// 
  34. /// This file provides a basic API for PIO configuration and usage of
  35. /// user-controlled pins. Please refer to the board.h file for a list of
  36. /// available pin definitions.
  37. /// 
  38. /// !!!Usage
  39. /// 
  40. /// -# Define a constant pin description array such as the following one, using
  41. ///    the existing definitions provided by the board.h file if possible:
  42. ///    code
  43. ///       const Pin pPins[] = {PIN_USART0_TXD, PIN_USART0_RXD};
  44. ///    endcode
  45. ///    Alternatively, it is possible to add new pins by provided the full Pin
  46. ///    structure:
  47. ///    code
  48. ///    // Pin instance to configure PA10 & PA11 as inputs with the internal
  49. ///    // pull-up enabled.
  50. ///    const Pin pPins = {
  51. ///         (1 << 10) | (1 << 11),
  52. ///         AT91C_BASE_PIOA,
  53. ///         AT91C_ID_PIOA,
  54. ///         PIO_INPUT,
  55. ///         PIO_PULLUP
  56. ///    };
  57. ///    endcode
  58. /// -# Configure a pin array by calling PIO_Configure() with a pointer to the
  59. ///    array and its size (which is computed using the PIO_LISTSIZE macro).
  60. /// -# Change and get the value of a user-controlled pin using the PIO_Set,
  61. ///    PIO_Clear and PIO_Get methods.
  62. /// -# Get the level being currently output by a user-controlled pin configured
  63. ///    as an output using PIO_GetOutputDataStatus().
  64. //------------------------------------------------------------------------------
  65.  
  66. #ifndef PIO_H
  67. #define PIO_H
  68. //------------------------------------------------------------------------------
  69. //         Headers
  70. //------------------------------------------------------------------------------
  71. #include <board.h>
  72. //------------------------------------------------------------------------------
  73. //         Global Definitions
  74. //------------------------------------------------------------------------------
  75. /// The pin is controlled by the associated signal of peripheral A.
  76. #define PIO_PERIPH_A                0
  77. /// The pin is controlled by the associated signal of peripheral B.
  78. #define PIO_PERIPH_B                1
  79. /// The pin is an input.
  80. #define PIO_INPUT                   2
  81. /// The pin is an output and has a default level of 0.
  82. #define PIO_OUTPUT_0                3
  83. /// The pin is an output and has a default level of 1.
  84. #define PIO_OUTPUT_1                4
  85. /// Default pin configuration (no attribute).
  86. #define PIO_DEFAULT                 (0 << 0)
  87. /// The internal pin pull-up is active.
  88. #define PIO_PULLUP                  (1 << 0)
  89. /// The internal glitch filter is active.
  90. #define PIO_DEGLITCH                (1 << 1)
  91. /// The pin is open-drain.
  92. #define PIO_OPENDRAIN               (1 << 2)
  93. //------------------------------------------------------------------------------
  94. //         Global Macros
  95. //------------------------------------------------------------------------------
  96. //------------------------------------------------------------------------------
  97. /// Calculates the size of an array of Pin instances. The array must be defined
  98. /// locally (i.e. not a pointer), otherwise the computation will not be correct.
  99. /// param pPins  Local array of Pin instances.
  100. /// return Number of elements in array.
  101. //------------------------------------------------------------------------------
  102. #define PIO_LISTSIZE(pPins)    (sizeof(pPins) / sizeof(Pin))
  103. //------------------------------------------------------------------------------
  104. //         Global Types
  105. //------------------------------------------------------------------------------
  106. //------------------------------------------------------------------------------
  107. /// Describes the type and attribute of one PIO pin or a group of similar pins.
  108. /// The #type# field can have the following values:
  109. ///    - PIO_PERIPH_A
  110. ///    - PIO_PERIPH_B
  111. ///    - PIO_OUTPUT_0
  112. ///    - PIO_OUTPUT_1
  113. ///    - PIO_INPUT
  114. ///
  115. /// The #attribute# field is a bitmask that can either be set to PIO_DEFAULt,
  116. /// or combine (using bitwise OR '|') any number of the following constants:
  117. ///    - PIO_PULLUP
  118. ///    - PIO_DEGLITCH
  119. ///    - PIO_OPENDRAIN
  120. //------------------------------------------------------------------------------
  121. typedef struct {
  122.     /// Bitmask indicating which pin(s) to configure.
  123.     unsigned int mask; 
  124.     /// Pointer to the PIO controller which has the pin(s).
  125.     AT91S_PIO    *pio;
  126.     /// Peripheral ID of the PIO controller which has the pin(s).
  127.     unsigned char id;
  128.     /// Pin type.
  129.     unsigned char type;
  130.     /// Pin attribute.
  131.     unsigned char attribute;
  132. } Pin;
  133. //------------------------------------------------------------------------------
  134. //         Global Functions
  135. //------------------------------------------------------------------------------
  136. extern unsigned char PIO_Configure(const Pin *list, unsigned int size);
  137. extern void PIO_Set(const Pin *pin);
  138. extern void PIO_Clear(const Pin *pin);
  139. extern unsigned char PIO_Get(const Pin *pin);
  140. extern unsigned int PIO_GetISR(const Pin *pin);
  141. extern unsigned char PIO_GetOutputDataStatus(const Pin *pin);
  142. #endif //#ifndef PIO_H