1 /**************************************************************************************************/
3 \defgroup peripheral_gr Peripheral Access
4 \brief Naming conventions and optional features for accessing peripherals.
7 The section below describes the naming conventions, requirements, and optional features for accessing device specific peripherals.
8 Most of the rules also apply to the core peripherals. The \ref device_h_pg contains typically these definition and also includes
9 the core specific header files.
12 The definitions for \ref peripheral_gr can be generated using the <a href="../../SVD/html/index.html"><b>CMSIS-SVD</b></a> System View Description for Peripherals.
13 Refer to <a href="../../SVD/html/svd_SVDConv_pg.html"><b>SVDConv.exe</b></a> for more information.
16 Each peripheral provides a data type definition with a name that is composed of:
17 - an optional prefix <b><<i>device abbreviation></i>_</b>
18 - <b><<i>peripheral name</i>></b>
19 - postfix \b _Type or \b _TypeDef to identify a type definition.
22 - \b UART_TypeDef for the peripheral \b UART.
23 - \b LPC_UART_TypeDef for the device family \b LPC and the peripheral \b UART.
25 The data type definition uses standard C data types defined by the ANSI C header file <stdint.h>.
27 - IO Type Qualifiers are used to specify the access to peripheral variables.
28 IO Type Qualifier | Type | Description
29 :------------------|:----------------|:------------
30 \b __IM | Struct member | Defines 'read only' permissions
31 \b __OM | Struct member | Defines 'write only' permissions
32 \b __IOM | Struct member | Defines 'read / write' permissions
33 \b __I | Scalar variable | Defines 'read only' permissions
34 \b __O | Scalar variable | Defines 'write only' permissions
35 \b __IO | Scalar variable | Defines 'read / write' permissions
38 \b __IM, \b __OM, \b __IOM are added in CMSIS-Core V4.20 to enhance support for C++. Prior version used \b __I, \b __O, \b __IO also for struct member definitions.
40 The typedef <b>\<<i>device abbreviation</i>\>_UART_TypeDef</b> shown below defines the generic register layout for all UART channels in a device.
46 __IM uint8_t RBR; /* Offset: 0x000 (R/ ) Receiver Buffer Register */
47 __OM uint8_t THR; /* Offset: 0x000 ( /W) Transmit Holding Register */
48 __IOM uint8_t DLL; /* Offset: 0x000 (R/W) Divisor Latch LSB */
52 __IOM uint8_t DLM; /* Offset: 0x004 (R/W) Divisor Latch MSB */
53 __IOM uint32_t IER; /* Offset: 0x004 (R/W) Interrupt Enable Register */
56 __IM uint32_t IIR; /* Offset: 0x008 (R/ ) Interrupt ID Register */
57 __OM uint8_t FCR; /* Offset: 0x008 ( /W) FIFO Control Register */
59 __IOM uint8_t LCR; /* Offset: 0x00C (R/W) Line Control Register */
61 __IM uint8_t LSR; /* Offset: 0x014 (R/ ) Line Status Register */
63 __IOM uint8_t SCR; /* Offset: 0x01C (R/W) Scratch Pad Register */
65 __IOM uint32_t ACR; /* Offset: 0x020 (R/W) Autobaud Control Register */
66 __IOM uint8_t ICR; /* Offset: 0x024 (R/W) IrDA Control Register */
68 __IOM uint8_t FDR; /* Offset: 0x028 (R/W) Fractional Divider Register */
70 __IOM uint8_t TER; /* Offset: 0x030 (R/W) Transmit Enable Register */
71 uint8_t RESERVED6[39];
72 __IM uint8_t FIFOLVL; /* Offset: 0x058 (R/ ) FIFO Level Register */
76 To access the registers of the UART defined above, pointers to this register structure are defined.
77 If more instances of a peripheral exist, the variables have a postfix (digit or letter) that identifies the peripheral.
80 In this example \b LPC_UART2 and \b LPC_UART3 are two pointers to UARTs defined with above register structure.
83 #define LPC_UART2 ((LPC_UART_TypeDef *) LPC_UART2_BASE )
84 #define LPC_UART3 ((LPC_UART_TypeDef *) LPC_UART3_BASE )
88 - The prefix <b>LPC</b> is optional.
90 The registers in the various UARTs can now be referred in the user code as shown below:\n
92 val = LPC_UART2->DR // is the data register of UART1.
97 \section core_cmsis_pal_min_reqs Minimal Requirements
99 To access the peripheral registers and related function in a device, the files <b><i>device.h</i></b> and <b>core_cm<i>#</i>.h</b> define as a minimum:
101 - The <b>Register Layout Typedef</b> for each peripheral that defines all register names.
102 RESERVED is used to introduce space into the structure for adjusting the addresses of
103 the peripheral registers.
109 __IOM uint32_t CTRL; /* Offset: 0x000 (R/W) SysTick Control and Status Register */
110 __IOM uint32_t LOAD; /* Offset: 0x004 (R/W) SysTick Reload Value Register */
111 __IOM uint32_t VAL; /* Offset: 0x008 (R/W) SysTick Current Value Register */
112 __IM uint32_t CALIB; /* Offset: 0x00C (R/ ) SysTick Calibration Register */
117 - <b>Base Address</b> for each peripheral (in case of multiple peripherals
118 that use the same <b>register layout typedef</b> multiple base addresses are defined).
122 #define SysTick_BASE (SCS_BASE + 0x0010) /* SysTick Base Address */
126 - <b>Access Definitions</b> for each peripheral. In case of multiple peripherals that are using the same
127 <b>register layout typdef</b>, multiple access definitions exist (LPC_UART0, LPC_UART2).
131 #define SysTick ((SysTick_Type *) Systick_BASE) /* SysTick access definition */
135 These definitions allow accessing peripheral registers with simple assignments.
145 \section core_cmsis_pal_opts Optional Features
147 Optionally, the file <b><i>device</i>.h</b> may define:
149 - \ref core_cmsis_pal_bitfields and \#define constants that simplify access to peripheral registers.
150 These constants may define bit-positions or other specific patterns that are required for
151 programming peripheral registers. The identifiers should start with
152 <b><<i>device abbreviation</i>>_</b> and <b><<i>peripheral name</i>>_</b>.
153 It is recommended to use CAPITAL letters for \#define constants.
155 - More complex functions (i.e. status query before
156 a sending register is accessed). Again, these functions start with
157 <b><<i>device abbreviation</i>>_</b> and <b><<i>peripheral name</i>>_</b>.
161 \section core_cmsis_pal_bitfields Register Bit Fields
164 For Core Register, macros define the position and the mask value for a bit field. It is recommended to create such definitions also
165 for other peripheral registers.
169 Bit field definitions for register CPUID in SCB (System Control Block).
173 /* SCB CPUID Register Definitions */
174 #define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
175 #define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
177 #define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
178 #define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
180 #define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
181 #define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
183 #define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
184 #define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
186 #define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
187 #define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
190 The macros <b>_VAL2FLD(field, value)</b> and <b>_FLD2VAL(field, value)</b> enable access to bit fields.
195 \def _VAL2FLD(field, value)
196 \param field name of bit field.
197 \param value value for the bit field. This parameter is interpreted as an uint32_t type.
198 \brief Mask and shift a bit field value for assigning the result to a peripheral register.
200 The macro \ref _VAL2FLD uses the \#define's <i>_Pos</i> and <i>_Msk</i> of the related bit field to shift bit-field values for
201 assigning to a register.
205 SCB->CPUID = _VAL2FLD(SCB_CPUID_REVISION, 0x3) | _VAL2FLD(SCB_CPUID_VARIANT, 0x3);
209 #define _VAL2FLD(field, value)
213 \def _FLD2VAL(field, value)
214 \param field name of bit field.
215 \param value value of the register. This parameter is interpreted as an uint32_t type.
216 \brief Extract from a peripheral register value the a bit field value.
218 The macro \ref _FLD2VAL uses the \#define's <i>_Pos</i> and <i>_Msk</i> of the related bit field to extract the value of a bit field from a register.
222 id = _FLD2VAL(SCB_CPUID_REVISION, SCB->CPUID);
226 #define _FLD2VAL(field, value)