Modification of Mbed-dev library for LQFP48 package microcontrollers: STM32F103C8 (STM32F103C8T6) and STM32F103CB (STM32F103CBT6) (Bluepill boards, Maple mini etc. )

Fork of mbed-STM32F103C8_org by Nothing Special

Library for STM32F103C8 (Bluepill boards etc.).
Use this instead of mbed library.
This library allows the size of the code in the FLASH up to 128kB. Therefore, code also runs on microcontrollers STM32F103CB (eg. Maple mini).
But in the case of STM32F103C8, check the size of the resulting code would not exceed 64kB.

To compile a program with this library, use NUCLEO-F103RB as the target name. !

Changes:

  • Corrected initialization of the HSE + crystal clock (mbed permanent bug), allowing the use of on-board xtal (8MHz).(1)
  • Additionally, it also set USB clock (48Mhz).(2)
  • Definitions of pins and peripherals adjusted to LQFP48 case.
  • Board led LED1 is now PC_13 (3)
  • USER_BUTTON is now PC_14 (4)

    Now the library is complete rebuilt based on mbed-dev v160 (and not yet fully tested).

notes
(1) - In case 8MHz xtal on board, CPU frequency is 72MHz. Without xtal is 64MHz.
(2) - Using the USB interface is only possible if STM32 is clocking by on-board 8MHz xtal or external clock signal 8MHz on the OSC_IN pin.
(3) - On Bluepill board led operation is reversed, i.e. 0 - led on, 1 - led off.
(4) - Bluepill board has no real user button

Information

After export to SW4STM (AC6):

  • add line #include "mbed_config.h" in files Serial.h and RawSerial.h
  • in project properties change Optimisation Level to Optimise for size (-Os)
Committer:
mega64
Date:
Thu Apr 27 23:56:38 2017 +0000
Revision:
148:8b0b02bf146f
Parent:
147:38a0c20c7b3e
Remove unnecessary folders

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mega64 147:38a0c20c7b3e 1
mega64 147:38a0c20c7b3e 2 /** \addtogroup hal */
mega64 147:38a0c20c7b3e 3 /** @{*/
mega64 147:38a0c20c7b3e 4 /* mbed Microcontroller Library
mega64 147:38a0c20c7b3e 5 * Copyright (c) 2006-2013 ARM Limited
mega64 147:38a0c20c7b3e 6 *
mega64 147:38a0c20c7b3e 7 * Licensed under the Apache License, Version 2.0 (the "License");
mega64 147:38a0c20c7b3e 8 * you may not use this file except in compliance with the License.
mega64 147:38a0c20c7b3e 9 * You may obtain a copy of the License at
mega64 147:38a0c20c7b3e 10 *
mega64 147:38a0c20c7b3e 11 * http://www.apache.org/licenses/LICENSE-2.0
mega64 147:38a0c20c7b3e 12 *
mega64 147:38a0c20c7b3e 13 * Unless required by applicable law or agreed to in writing, software
mega64 147:38a0c20c7b3e 14 * distributed under the License is distributed on an "AS IS" BASIS,
mega64 147:38a0c20c7b3e 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mega64 147:38a0c20c7b3e 16 * See the License for the specific language governing permissions and
mega64 147:38a0c20c7b3e 17 * limitations under the License.
mega64 147:38a0c20c7b3e 18 */
mega64 147:38a0c20c7b3e 19 #ifndef MBED_SERIAL_API_H
mega64 147:38a0c20c7b3e 20 #define MBED_SERIAL_API_H
mega64 147:38a0c20c7b3e 21
mega64 147:38a0c20c7b3e 22 #include "device.h"
mega64 147:38a0c20c7b3e 23 #include "hal/buffer.h"
mega64 147:38a0c20c7b3e 24 #include "hal/dma_api.h"
mega64 147:38a0c20c7b3e 25
mega64 147:38a0c20c7b3e 26 #if DEVICE_SERIAL
mega64 147:38a0c20c7b3e 27
mega64 147:38a0c20c7b3e 28 #define SERIAL_EVENT_TX_SHIFT (2)
mega64 147:38a0c20c7b3e 29 #define SERIAL_EVENT_RX_SHIFT (8)
mega64 147:38a0c20c7b3e 30
mega64 147:38a0c20c7b3e 31 #define SERIAL_EVENT_TX_MASK (0x00FC)
mega64 147:38a0c20c7b3e 32 #define SERIAL_EVENT_RX_MASK (0x3F00)
mega64 147:38a0c20c7b3e 33
mega64 147:38a0c20c7b3e 34 #define SERIAL_EVENT_ERROR (1 << 1)
mega64 147:38a0c20c7b3e 35
mega64 147:38a0c20c7b3e 36 /**
mega64 147:38a0c20c7b3e 37 * @defgroup SerialTXEvents Serial TX Events Macros
mega64 147:38a0c20c7b3e 38 *
mega64 147:38a0c20c7b3e 39 * @{
mega64 147:38a0c20c7b3e 40 */
mega64 147:38a0c20c7b3e 41 #define SERIAL_EVENT_TX_COMPLETE (1 << (SERIAL_EVENT_TX_SHIFT + 0))
mega64 147:38a0c20c7b3e 42 #define SERIAL_EVENT_TX_ALL (SERIAL_EVENT_TX_COMPLETE)
mega64 147:38a0c20c7b3e 43 /**@}*/
mega64 147:38a0c20c7b3e 44
mega64 147:38a0c20c7b3e 45 /**
mega64 147:38a0c20c7b3e 46 * @defgroup SerialRXEvents Serial RX Events Macros
mega64 147:38a0c20c7b3e 47 *
mega64 147:38a0c20c7b3e 48 * @{
mega64 147:38a0c20c7b3e 49 */
mega64 147:38a0c20c7b3e 50 #define SERIAL_EVENT_RX_COMPLETE (1 << (SERIAL_EVENT_RX_SHIFT + 0))
mega64 147:38a0c20c7b3e 51 #define SERIAL_EVENT_RX_OVERRUN_ERROR (1 << (SERIAL_EVENT_RX_SHIFT + 1))
mega64 147:38a0c20c7b3e 52 #define SERIAL_EVENT_RX_FRAMING_ERROR (1 << (SERIAL_EVENT_RX_SHIFT + 2))
mega64 147:38a0c20c7b3e 53 #define SERIAL_EVENT_RX_PARITY_ERROR (1 << (SERIAL_EVENT_RX_SHIFT + 3))
mega64 147:38a0c20c7b3e 54 #define SERIAL_EVENT_RX_OVERFLOW (1 << (SERIAL_EVENT_RX_SHIFT + 4))
mega64 147:38a0c20c7b3e 55 #define SERIAL_EVENT_RX_CHARACTER_MATCH (1 << (SERIAL_EVENT_RX_SHIFT + 5))
mega64 147:38a0c20c7b3e 56 #define SERIAL_EVENT_RX_ALL (SERIAL_EVENT_RX_OVERFLOW | SERIAL_EVENT_RX_PARITY_ERROR | \
mega64 147:38a0c20c7b3e 57 SERIAL_EVENT_RX_FRAMING_ERROR | SERIAL_EVENT_RX_OVERRUN_ERROR | \
mega64 147:38a0c20c7b3e 58 SERIAL_EVENT_RX_COMPLETE | SERIAL_EVENT_RX_CHARACTER_MATCH)
mega64 147:38a0c20c7b3e 59 /**@}*/
mega64 147:38a0c20c7b3e 60
mega64 147:38a0c20c7b3e 61 #define SERIAL_RESERVED_CHAR_MATCH (255)
mega64 147:38a0c20c7b3e 62
mega64 147:38a0c20c7b3e 63 typedef enum {
mega64 147:38a0c20c7b3e 64 ParityNone = 0,
mega64 147:38a0c20c7b3e 65 ParityOdd = 1,
mega64 147:38a0c20c7b3e 66 ParityEven = 2,
mega64 147:38a0c20c7b3e 67 ParityForced1 = 3,
mega64 147:38a0c20c7b3e 68 ParityForced0 = 4
mega64 147:38a0c20c7b3e 69 } SerialParity;
mega64 147:38a0c20c7b3e 70
mega64 147:38a0c20c7b3e 71 typedef enum {
mega64 147:38a0c20c7b3e 72 RxIrq,
mega64 147:38a0c20c7b3e 73 TxIrq
mega64 147:38a0c20c7b3e 74 } SerialIrq;
mega64 147:38a0c20c7b3e 75
mega64 147:38a0c20c7b3e 76 typedef enum {
mega64 147:38a0c20c7b3e 77 FlowControlNone,
mega64 147:38a0c20c7b3e 78 FlowControlRTS,
mega64 147:38a0c20c7b3e 79 FlowControlCTS,
mega64 147:38a0c20c7b3e 80 FlowControlRTSCTS
mega64 147:38a0c20c7b3e 81 } FlowControl;
mega64 147:38a0c20c7b3e 82
mega64 147:38a0c20c7b3e 83 typedef void (*uart_irq_handler)(uint32_t id, SerialIrq event);
mega64 147:38a0c20c7b3e 84
mega64 147:38a0c20c7b3e 85 #if DEVICE_SERIAL_ASYNCH
mega64 147:38a0c20c7b3e 86 /** Asynch serial HAL structure
mega64 147:38a0c20c7b3e 87 */
mega64 147:38a0c20c7b3e 88 typedef struct {
mega64 147:38a0c20c7b3e 89 struct serial_s serial; /**< Target specific serial structure */
mega64 147:38a0c20c7b3e 90 struct buffer_s tx_buff; /**< TX buffer */
mega64 147:38a0c20c7b3e 91 struct buffer_s rx_buff; /**< RX buffer */
mega64 147:38a0c20c7b3e 92 uint8_t char_match; /**< Character to be matched */
mega64 147:38a0c20c7b3e 93 uint8_t char_found; /**< State of the matched character */
mega64 147:38a0c20c7b3e 94 } serial_t;
mega64 147:38a0c20c7b3e 95
mega64 147:38a0c20c7b3e 96 #else
mega64 147:38a0c20c7b3e 97 /** Non-asynch serial HAL structure
mega64 147:38a0c20c7b3e 98 */
mega64 147:38a0c20c7b3e 99 typedef struct serial_s serial_t;
mega64 147:38a0c20c7b3e 100
mega64 147:38a0c20c7b3e 101 #endif
mega64 147:38a0c20c7b3e 102
mega64 147:38a0c20c7b3e 103 #ifdef __cplusplus
mega64 147:38a0c20c7b3e 104 extern "C" {
mega64 147:38a0c20c7b3e 105 #endif
mega64 147:38a0c20c7b3e 106
mega64 147:38a0c20c7b3e 107 /**
mega64 147:38a0c20c7b3e 108 * \defgroup hal_GeneralSerial Serial Configuration Functions
mega64 147:38a0c20c7b3e 109 * @{
mega64 147:38a0c20c7b3e 110 */
mega64 147:38a0c20c7b3e 111
mega64 147:38a0c20c7b3e 112 /** Initialize the serial peripheral. It sets the default parameters for serial
mega64 147:38a0c20c7b3e 113 * peripheral, and configures its specifieds pins.
mega64 147:38a0c20c7b3e 114 *
mega64 147:38a0c20c7b3e 115 * @param obj The serial object
mega64 147:38a0c20c7b3e 116 * @param tx The TX pin name
mega64 147:38a0c20c7b3e 117 * @param rx The RX pin name
mega64 147:38a0c20c7b3e 118 */
mega64 147:38a0c20c7b3e 119 void serial_init(serial_t *obj, PinName tx, PinName rx);
mega64 147:38a0c20c7b3e 120
mega64 147:38a0c20c7b3e 121 /** Release the serial peripheral, not currently invoked. It requires further
mega64 147:38a0c20c7b3e 122 * resource management.
mega64 147:38a0c20c7b3e 123 *
mega64 147:38a0c20c7b3e 124 * @param obj The serial object
mega64 147:38a0c20c7b3e 125 */
mega64 147:38a0c20c7b3e 126 void serial_free(serial_t *obj);
mega64 147:38a0c20c7b3e 127
mega64 147:38a0c20c7b3e 128 /** Configure the baud rate
mega64 147:38a0c20c7b3e 129 *
mega64 147:38a0c20c7b3e 130 * @param obj The serial object
mega64 147:38a0c20c7b3e 131 * @param baudrate The baud rate to be configured
mega64 147:38a0c20c7b3e 132 */
mega64 147:38a0c20c7b3e 133 void serial_baud(serial_t *obj, int baudrate);
mega64 147:38a0c20c7b3e 134
mega64 147:38a0c20c7b3e 135 /** Configure the format. Set the number of bits, parity and the number of stop bits
mega64 147:38a0c20c7b3e 136 *
mega64 147:38a0c20c7b3e 137 * @param obj The serial object
mega64 147:38a0c20c7b3e 138 * @param data_bits The number of data bits
mega64 147:38a0c20c7b3e 139 * @param parity The parity
mega64 147:38a0c20c7b3e 140 * @param stop_bits The number of stop bits
mega64 147:38a0c20c7b3e 141 */
mega64 147:38a0c20c7b3e 142 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits);
mega64 147:38a0c20c7b3e 143
mega64 147:38a0c20c7b3e 144 /** The serial interrupt handler registration
mega64 147:38a0c20c7b3e 145 *
mega64 147:38a0c20c7b3e 146 * @param obj The serial object
mega64 147:38a0c20c7b3e 147 * @param handler The interrupt handler which will be invoked when the interrupt fires
mega64 147:38a0c20c7b3e 148 * @param id The SerialBase object
mega64 147:38a0c20c7b3e 149 */
mega64 147:38a0c20c7b3e 150 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id);
mega64 147:38a0c20c7b3e 151
mega64 147:38a0c20c7b3e 152 /** Configure serial interrupt. This function is used for word-approach
mega64 147:38a0c20c7b3e 153 *
mega64 147:38a0c20c7b3e 154 * @param obj The serial object
mega64 147:38a0c20c7b3e 155 * @param irq The serial IRQ type (RX or TX)
mega64 147:38a0c20c7b3e 156 * @param enable Set to non-zero to enable events, or zero to disable them
mega64 147:38a0c20c7b3e 157 */
mega64 147:38a0c20c7b3e 158 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable);
mega64 147:38a0c20c7b3e 159
mega64 147:38a0c20c7b3e 160 /** Get character. This is a blocking call, waiting for a character
mega64 147:38a0c20c7b3e 161 *
mega64 147:38a0c20c7b3e 162 * @param obj The serial object
mega64 147:38a0c20c7b3e 163 */
mega64 147:38a0c20c7b3e 164 int serial_getc(serial_t *obj);
mega64 147:38a0c20c7b3e 165
mega64 147:38a0c20c7b3e 166 /** Send a character. This is a blocking call, waiting for a peripheral to be available
mega64 147:38a0c20c7b3e 167 * for writing
mega64 147:38a0c20c7b3e 168 *
mega64 147:38a0c20c7b3e 169 * @param obj The serial object
mega64 147:38a0c20c7b3e 170 * @param c The character to be sent
mega64 147:38a0c20c7b3e 171 */
mega64 147:38a0c20c7b3e 172 void serial_putc(serial_t *obj, int c);
mega64 147:38a0c20c7b3e 173
mega64 147:38a0c20c7b3e 174 /** Check if the serial peripheral is readable
mega64 147:38a0c20c7b3e 175 *
mega64 147:38a0c20c7b3e 176 * @param obj The serial object
mega64 147:38a0c20c7b3e 177 * @return Non-zero value if a character can be read, 0 if nothing to read
mega64 147:38a0c20c7b3e 178 */
mega64 147:38a0c20c7b3e 179 int serial_readable(serial_t *obj);
mega64 147:38a0c20c7b3e 180
mega64 147:38a0c20c7b3e 181 /** Check if the serial peripheral is writable
mega64 147:38a0c20c7b3e 182 *
mega64 147:38a0c20c7b3e 183 * @param obj The serial object
mega64 147:38a0c20c7b3e 184 * @return Non-zero value if a character can be written, 0 otherwise.
mega64 147:38a0c20c7b3e 185 */
mega64 147:38a0c20c7b3e 186 int serial_writable(serial_t *obj);
mega64 147:38a0c20c7b3e 187
mega64 147:38a0c20c7b3e 188 /** Clear the serial peripheral
mega64 147:38a0c20c7b3e 189 *
mega64 147:38a0c20c7b3e 190 * @param obj The serial object
mega64 147:38a0c20c7b3e 191 */
mega64 147:38a0c20c7b3e 192 void serial_clear(serial_t *obj);
mega64 147:38a0c20c7b3e 193
mega64 147:38a0c20c7b3e 194 /** Set the break
mega64 147:38a0c20c7b3e 195 *
mega64 147:38a0c20c7b3e 196 * @param obj The serial object
mega64 147:38a0c20c7b3e 197 */
mega64 147:38a0c20c7b3e 198 void serial_break_set(serial_t *obj);
mega64 147:38a0c20c7b3e 199
mega64 147:38a0c20c7b3e 200 /** Clear the break
mega64 147:38a0c20c7b3e 201 *
mega64 147:38a0c20c7b3e 202 * @param obj The serial object
mega64 147:38a0c20c7b3e 203 */
mega64 147:38a0c20c7b3e 204 void serial_break_clear(serial_t *obj);
mega64 147:38a0c20c7b3e 205
mega64 147:38a0c20c7b3e 206 /** Configure the TX pin for UART function.
mega64 147:38a0c20c7b3e 207 *
mega64 147:38a0c20c7b3e 208 * @param tx The pin name used for TX
mega64 147:38a0c20c7b3e 209 */
mega64 147:38a0c20c7b3e 210 void serial_pinout_tx(PinName tx);
mega64 147:38a0c20c7b3e 211
mega64 147:38a0c20c7b3e 212 /** Configure the serial for the flow control. It sets flow control in the hardware
mega64 147:38a0c20c7b3e 213 * if a serial peripheral supports it, otherwise software emulation is used.
mega64 147:38a0c20c7b3e 214 *
mega64 147:38a0c20c7b3e 215 * @param obj The serial object
mega64 147:38a0c20c7b3e 216 * @param type The type of the flow control. Look at the available FlowControl types.
mega64 147:38a0c20c7b3e 217 * @param rxflow The TX pin name
mega64 147:38a0c20c7b3e 218 * @param txflow The RX pin name
mega64 147:38a0c20c7b3e 219 */
mega64 147:38a0c20c7b3e 220 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow);
mega64 147:38a0c20c7b3e 221
mega64 147:38a0c20c7b3e 222 #if DEVICE_SERIAL_ASYNCH
mega64 147:38a0c20c7b3e 223
mega64 147:38a0c20c7b3e 224 /**@}*/
mega64 147:38a0c20c7b3e 225
mega64 147:38a0c20c7b3e 226 /**
mega64 147:38a0c20c7b3e 227 * \defgroup hal_AsynchSerial Asynchronous Serial Hardware Abstraction Layer
mega64 147:38a0c20c7b3e 228 * @{
mega64 147:38a0c20c7b3e 229 */
mega64 147:38a0c20c7b3e 230
mega64 147:38a0c20c7b3e 231 /** Begin asynchronous TX transfer. The used buffer is specified in the serial object,
mega64 147:38a0c20c7b3e 232 * tx_buff
mega64 147:38a0c20c7b3e 233 *
mega64 147:38a0c20c7b3e 234 * @param obj The serial object
mega64 147:38a0c20c7b3e 235 * @param tx The transmit buffer
mega64 147:38a0c20c7b3e 236 * @param tx_length The number of bytes to transmit
mega64 147:38a0c20c7b3e 237 * @param tx_width Deprecated argument
mega64 147:38a0c20c7b3e 238 * @param handler The serial handler
mega64 147:38a0c20c7b3e 239 * @param event The logical OR of events to be registered
mega64 147:38a0c20c7b3e 240 * @param hint A suggestion for how to use DMA with this transfer
mega64 147:38a0c20c7b3e 241 * @return Returns number of data transfered, otherwise returns 0
mega64 147:38a0c20c7b3e 242 */
mega64 147:38a0c20c7b3e 243 int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint);
mega64 147:38a0c20c7b3e 244
mega64 147:38a0c20c7b3e 245 /** Begin asynchronous RX transfer (enable interrupt for data collecting)
mega64 147:38a0c20c7b3e 246 * The used buffer is specified in the serial object - rx_buff
mega64 147:38a0c20c7b3e 247 *
mega64 147:38a0c20c7b3e 248 * @param obj The serial object
mega64 147:38a0c20c7b3e 249 * @param rx The receive buffer
mega64 147:38a0c20c7b3e 250 * @param rx_length The number of bytes to receive
mega64 147:38a0c20c7b3e 251 * @param rx_width Deprecated argument
mega64 147:38a0c20c7b3e 252 * @param handler The serial handler
mega64 147:38a0c20c7b3e 253 * @param event The logical OR of events to be registered
mega64 147:38a0c20c7b3e 254 * @param handler The serial handler
mega64 147:38a0c20c7b3e 255 * @param char_match A character in range 0-254 to be matched
mega64 147:38a0c20c7b3e 256 * @param hint A suggestion for how to use DMA with this transfer
mega64 147:38a0c20c7b3e 257 */
mega64 147:38a0c20c7b3e 258 void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint);
mega64 147:38a0c20c7b3e 259
mega64 147:38a0c20c7b3e 260 /** Attempts to determine if the serial peripheral is already in use for TX
mega64 147:38a0c20c7b3e 261 *
mega64 147:38a0c20c7b3e 262 * @param obj The serial object
mega64 147:38a0c20c7b3e 263 * @return Non-zero if the RX transaction is ongoing, 0 otherwise
mega64 147:38a0c20c7b3e 264 */
mega64 147:38a0c20c7b3e 265 uint8_t serial_tx_active(serial_t *obj);
mega64 147:38a0c20c7b3e 266
mega64 147:38a0c20c7b3e 267 /** Attempts to determine if the serial peripheral is already in use for RX
mega64 147:38a0c20c7b3e 268 *
mega64 147:38a0c20c7b3e 269 * @param obj The serial object
mega64 147:38a0c20c7b3e 270 * @return Non-zero if the RX transaction is ongoing, 0 otherwise
mega64 147:38a0c20c7b3e 271 */
mega64 147:38a0c20c7b3e 272 uint8_t serial_rx_active(serial_t *obj);
mega64 147:38a0c20c7b3e 273
mega64 147:38a0c20c7b3e 274 /** The asynchronous TX and RX handler.
mega64 147:38a0c20c7b3e 275 *
mega64 147:38a0c20c7b3e 276 * @param obj The serial object
mega64 147:38a0c20c7b3e 277 * @return Returns event flags if an RX transfer termination condition was met; otherwise returns 0
mega64 147:38a0c20c7b3e 278 */
mega64 147:38a0c20c7b3e 279 int serial_irq_handler_asynch(serial_t *obj);
mega64 147:38a0c20c7b3e 280
mega64 147:38a0c20c7b3e 281 /** Abort the ongoing TX transaction. It disables the enabled interupt for TX and
mega64 147:38a0c20c7b3e 282 * flushes the TX hardware buffer if TX FIFO is used
mega64 147:38a0c20c7b3e 283 *
mega64 147:38a0c20c7b3e 284 * @param obj The serial object
mega64 147:38a0c20c7b3e 285 */
mega64 147:38a0c20c7b3e 286 void serial_tx_abort_asynch(serial_t *obj);
mega64 147:38a0c20c7b3e 287
mega64 147:38a0c20c7b3e 288 /** Abort the ongoing RX transaction. It disables the enabled interrupt for RX and
mega64 147:38a0c20c7b3e 289 * flushes the RX hardware buffer if RX FIFO is used
mega64 147:38a0c20c7b3e 290 *
mega64 147:38a0c20c7b3e 291 * @param obj The serial object
mega64 147:38a0c20c7b3e 292 */
mega64 147:38a0c20c7b3e 293 void serial_rx_abort_asynch(serial_t *obj);
mega64 147:38a0c20c7b3e 294
mega64 147:38a0c20c7b3e 295 /**@}*/
mega64 147:38a0c20c7b3e 296
mega64 147:38a0c20c7b3e 297 #endif
mega64 147:38a0c20c7b3e 298
mega64 147:38a0c20c7b3e 299 #ifdef __cplusplus
mega64 147:38a0c20c7b3e 300 }
mega64 147:38a0c20c7b3e 301 #endif
mega64 147:38a0c20c7b3e 302
mega64 147:38a0c20c7b3e 303 #endif
mega64 147:38a0c20c7b3e 304
mega64 147:38a0c20c7b3e 305 #endif
mega64 147:38a0c20c7b3e 306
mega64 147:38a0c20c7b3e 307 /** @}*/