These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!

Committer:
frank26080115
Date:
Sun Mar 20 05:38:56 2011 +0000
Revision:
0:bf7b9fba3924

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frank26080115 0:bf7b9fba3924 1 /***********************************************************************//**
frank26080115 0:bf7b9fba3924 2 * @file uart_interrupt_test.c
frank26080115 0:bf7b9fba3924 3 * @purpose This example describes how to using UART in interrupt mode
frank26080115 0:bf7b9fba3924 4 * @version 2.0
frank26080115 0:bf7b9fba3924 5 * @date 21. May. 2010
frank26080115 0:bf7b9fba3924 6 * @author NXP MCU SW Application Team
frank26080115 0:bf7b9fba3924 7 *---------------------------------------------------------------------
frank26080115 0:bf7b9fba3924 8 * Software that is described herein is for illustrative purposes only
frank26080115 0:bf7b9fba3924 9 * which provides customers with programming information regarding the
frank26080115 0:bf7b9fba3924 10 * products. This software is supplied "AS IS" without any warranties.
frank26080115 0:bf7b9fba3924 11 * NXP Semiconductors assumes no responsibility or liability for the
frank26080115 0:bf7b9fba3924 12 * use of the software, conveys no license or title under any patent,
frank26080115 0:bf7b9fba3924 13 * copyright, or mask work right to the product. NXP Semiconductors
frank26080115 0:bf7b9fba3924 14 * reserves the right to make changes in the software without
frank26080115 0:bf7b9fba3924 15 * notification. NXP Semiconductors also make no representation or
frank26080115 0:bf7b9fba3924 16 * warranty that such application will be suitable for the specified
frank26080115 0:bf7b9fba3924 17 * use without further testing or modification.
frank26080115 0:bf7b9fba3924 18 **********************************************************************/
frank26080115 0:bf7b9fba3924 19 #include "lpc17xx_uart.h"
frank26080115 0:bf7b9fba3924 20 #include "lpc17xx_libcfg.h"
frank26080115 0:bf7b9fba3924 21 #include "lpc17xx_pinsel.h"
frank26080115 0:bf7b9fba3924 22
frank26080115 0:bf7b9fba3924 23 /* Example group ----------------------------------------------------------- */
frank26080115 0:bf7b9fba3924 24 /** @defgroup UART_Interrupt Interrupt
frank26080115 0:bf7b9fba3924 25 * @ingroup UART_Examples
frank26080115 0:bf7b9fba3924 26 * @{
frank26080115 0:bf7b9fba3924 27 */
frank26080115 0:bf7b9fba3924 28
frank26080115 0:bf7b9fba3924 29 /************************** PRIVATE DEFINTIONS *************************/
frank26080115 0:bf7b9fba3924 30 /* buffer size definition */
frank26080115 0:bf7b9fba3924 31 #define UART_RING_BUFSIZE 256
frank26080115 0:bf7b9fba3924 32
frank26080115 0:bf7b9fba3924 33 /* Buf mask */
frank26080115 0:bf7b9fba3924 34 #define __BUF_MASK (UART_RING_BUFSIZE-1)
frank26080115 0:bf7b9fba3924 35 /* Check buf is full or not */
frank26080115 0:bf7b9fba3924 36 #define __BUF_IS_FULL(head, tail) ((tail&__BUF_MASK)==((head+1)&__BUF_MASK))
frank26080115 0:bf7b9fba3924 37 /* Check buf will be full in next receiving or not */
frank26080115 0:bf7b9fba3924 38 #define __BUF_WILL_FULL(head, tail) ((tail&__BUF_MASK)==((head+2)&__BUF_MASK))
frank26080115 0:bf7b9fba3924 39 /* Check buf is empty */
frank26080115 0:bf7b9fba3924 40 #define __BUF_IS_EMPTY(head, tail) ((head&__BUF_MASK)==(tail&__BUF_MASK))
frank26080115 0:bf7b9fba3924 41 /* Reset buf */
frank26080115 0:bf7b9fba3924 42 #define __BUF_RESET(bufidx) (bufidx=0)
frank26080115 0:bf7b9fba3924 43 #define __BUF_INCR(bufidx) (bufidx=(bufidx+1)&__BUF_MASK)
frank26080115 0:bf7b9fba3924 44
frank26080115 0:bf7b9fba3924 45
frank26080115 0:bf7b9fba3924 46 /************************** PRIVATE TYPES *************************/
frank26080115 0:bf7b9fba3924 47
frank26080115 0:bf7b9fba3924 48 /** @brief UART Ring buffer structure */
frank26080115 0:bf7b9fba3924 49 typedef struct
frank26080115 0:bf7b9fba3924 50 {
frank26080115 0:bf7b9fba3924 51 __IO uint32_t tx_head; /*!< UART Tx ring buffer head index */
frank26080115 0:bf7b9fba3924 52 __IO uint32_t tx_tail; /*!< UART Tx ring buffer tail index */
frank26080115 0:bf7b9fba3924 53 __IO uint32_t rx_head; /*!< UART Rx ring buffer head index */
frank26080115 0:bf7b9fba3924 54 __IO uint32_t rx_tail; /*!< UART Rx ring buffer tail index */
frank26080115 0:bf7b9fba3924 55 __IO uint8_t tx[UART_RING_BUFSIZE]; /*!< UART Tx data ring buffer */
frank26080115 0:bf7b9fba3924 56 __IO uint8_t rx[UART_RING_BUFSIZE]; /*!< UART Rx data ring buffer */
frank26080115 0:bf7b9fba3924 57 } UART_RING_BUFFER_T;
frank26080115 0:bf7b9fba3924 58
frank26080115 0:bf7b9fba3924 59
frank26080115 0:bf7b9fba3924 60 /************************** PRIVATE VARIABLES *************************/
frank26080115 0:bf7b9fba3924 61 uint8_t menu1[] = "Hello NXP Semiconductors \n\r";
frank26080115 0:bf7b9fba3924 62 uint8_t menu2[] =
frank26080115 0:bf7b9fba3924 63 "UART interrupt mode demo using ring buffer \n\r\t "
frank26080115 0:bf7b9fba3924 64 "MCU LPC17xx - ARM Cortex-M3 \n\r\t "
frank26080115 0:bf7b9fba3924 65 "UART0 - 9600bps \n\r";
frank26080115 0:bf7b9fba3924 66 uint8_t menu3[] = "UART demo terminated!\n";
frank26080115 0:bf7b9fba3924 67
frank26080115 0:bf7b9fba3924 68 // UART Ring buffer
frank26080115 0:bf7b9fba3924 69 UART_RING_BUFFER_T rb;
frank26080115 0:bf7b9fba3924 70
frank26080115 0:bf7b9fba3924 71 // Current Tx Interrupt enable state
frank26080115 0:bf7b9fba3924 72 __IO FlagStatus TxIntStat;
frank26080115 0:bf7b9fba3924 73
frank26080115 0:bf7b9fba3924 74
frank26080115 0:bf7b9fba3924 75 /************************** PRIVATE FUNCTIONS *************************/
frank26080115 0:bf7b9fba3924 76 /* Interrupt service routines */
frank26080115 0:bf7b9fba3924 77 void UART0_IRQHandler(void);
frank26080115 0:bf7b9fba3924 78 void UART_IntErr(uint8_t bLSErrType);
frank26080115 0:bf7b9fba3924 79 void UART_IntTransmit(void);
frank26080115 0:bf7b9fba3924 80 void UART_IntReceive(void);
frank26080115 0:bf7b9fba3924 81
frank26080115 0:bf7b9fba3924 82 uint32_t UARTReceive(LPC_UART_TypeDef *UARTPort, uint8_t *rxbuf, uint8_t buflen);
frank26080115 0:bf7b9fba3924 83 uint32_t UARTSend(LPC_UART_TypeDef *UARTPort, uint8_t *txbuf, uint8_t buflen);
frank26080115 0:bf7b9fba3924 84 void print_menu(void);
frank26080115 0:bf7b9fba3924 85
frank26080115 0:bf7b9fba3924 86 /*----------------- INTERRUPT SERVICE ROUTINES --------------------------*/
frank26080115 0:bf7b9fba3924 87 /*********************************************************************//**
frank26080115 0:bf7b9fba3924 88 * @brief UART0 interrupt handler sub-routine
frank26080115 0:bf7b9fba3924 89 * @param[in] None
frank26080115 0:bf7b9fba3924 90 * @return None
frank26080115 0:bf7b9fba3924 91 **********************************************************************/
frank26080115 0:bf7b9fba3924 92 void UART0_IRQHandler(void)
frank26080115 0:bf7b9fba3924 93 {
frank26080115 0:bf7b9fba3924 94 uint32_t intsrc, tmp, tmp1;
frank26080115 0:bf7b9fba3924 95
frank26080115 0:bf7b9fba3924 96 /* Determine the interrupt source */
frank26080115 0:bf7b9fba3924 97 intsrc = UART_GetIntId(LPC_UART0);
frank26080115 0:bf7b9fba3924 98 tmp = intsrc & UART_IIR_INTID_MASK;
frank26080115 0:bf7b9fba3924 99
frank26080115 0:bf7b9fba3924 100 // Receive Line Status
frank26080115 0:bf7b9fba3924 101 if (tmp == UART_IIR_INTID_RLS){
frank26080115 0:bf7b9fba3924 102 // Check line status
frank26080115 0:bf7b9fba3924 103 tmp1 = UART_GetLineStatus(LPC_UART0);
frank26080115 0:bf7b9fba3924 104 // Mask out the Receive Ready and Transmit Holding empty status
frank26080115 0:bf7b9fba3924 105 tmp1 &= (UART_LSR_OE | UART_LSR_PE | UART_LSR_FE \
frank26080115 0:bf7b9fba3924 106 | UART_LSR_BI | UART_LSR_RXFE);
frank26080115 0:bf7b9fba3924 107 // If any error exist
frank26080115 0:bf7b9fba3924 108 if (tmp1) {
frank26080115 0:bf7b9fba3924 109 UART_IntErr(tmp1);
frank26080115 0:bf7b9fba3924 110 }
frank26080115 0:bf7b9fba3924 111 }
frank26080115 0:bf7b9fba3924 112
frank26080115 0:bf7b9fba3924 113 // Receive Data Available or Character time-out
frank26080115 0:bf7b9fba3924 114 if ((tmp == UART_IIR_INTID_RDA) || (tmp == UART_IIR_INTID_CTI)){
frank26080115 0:bf7b9fba3924 115 UART_IntReceive();
frank26080115 0:bf7b9fba3924 116 }
frank26080115 0:bf7b9fba3924 117
frank26080115 0:bf7b9fba3924 118 // Transmit Holding Empty
frank26080115 0:bf7b9fba3924 119 if (tmp == UART_IIR_INTID_THRE){
frank26080115 0:bf7b9fba3924 120 UART_IntTransmit();
frank26080115 0:bf7b9fba3924 121 }
frank26080115 0:bf7b9fba3924 122
frank26080115 0:bf7b9fba3924 123 }
frank26080115 0:bf7b9fba3924 124
frank26080115 0:bf7b9fba3924 125 /********************************************************************//**
frank26080115 0:bf7b9fba3924 126 * @brief UART receive function (ring buffer used)
frank26080115 0:bf7b9fba3924 127 * @param[in] None
frank26080115 0:bf7b9fba3924 128 * @return None
frank26080115 0:bf7b9fba3924 129 *********************************************************************/
frank26080115 0:bf7b9fba3924 130 void UART_IntReceive(void)
frank26080115 0:bf7b9fba3924 131 {
frank26080115 0:bf7b9fba3924 132 uint8_t tmpc;
frank26080115 0:bf7b9fba3924 133 uint32_t rLen;
frank26080115 0:bf7b9fba3924 134
frank26080115 0:bf7b9fba3924 135 while(1){
frank26080115 0:bf7b9fba3924 136 // Call UART read function in UART driver
frank26080115 0:bf7b9fba3924 137 rLen = UART_Receive((LPC_UART_TypeDef *)LPC_UART0, &tmpc, 1, NONE_BLOCKING);
frank26080115 0:bf7b9fba3924 138 // If data received
frank26080115 0:bf7b9fba3924 139 if (rLen){
frank26080115 0:bf7b9fba3924 140 /* Check if buffer is more space
frank26080115 0:bf7b9fba3924 141 * If no more space, remaining character will be trimmed out
frank26080115 0:bf7b9fba3924 142 */
frank26080115 0:bf7b9fba3924 143 if (!__BUF_IS_FULL(rb.rx_head,rb.rx_tail)){
frank26080115 0:bf7b9fba3924 144 rb.rx[rb.rx_head] = tmpc;
frank26080115 0:bf7b9fba3924 145 __BUF_INCR(rb.rx_head);
frank26080115 0:bf7b9fba3924 146 }
frank26080115 0:bf7b9fba3924 147 }
frank26080115 0:bf7b9fba3924 148 // no more data
frank26080115 0:bf7b9fba3924 149 else {
frank26080115 0:bf7b9fba3924 150 break;
frank26080115 0:bf7b9fba3924 151 }
frank26080115 0:bf7b9fba3924 152 }
frank26080115 0:bf7b9fba3924 153 }
frank26080115 0:bf7b9fba3924 154
frank26080115 0:bf7b9fba3924 155 /********************************************************************//**
frank26080115 0:bf7b9fba3924 156 * @brief UART transmit function (ring buffer used)
frank26080115 0:bf7b9fba3924 157 * @param[in] None
frank26080115 0:bf7b9fba3924 158 * @return None
frank26080115 0:bf7b9fba3924 159 *********************************************************************/
frank26080115 0:bf7b9fba3924 160 void UART_IntTransmit(void)
frank26080115 0:bf7b9fba3924 161 {
frank26080115 0:bf7b9fba3924 162 // Disable THRE interrupt
frank26080115 0:bf7b9fba3924 163 UART_IntConfig((LPC_UART_TypeDef *)LPC_UART0, UART_INTCFG_THRE, DISABLE);
frank26080115 0:bf7b9fba3924 164
frank26080115 0:bf7b9fba3924 165 /* Wait for FIFO buffer empty, transfer UART_TX_FIFO_SIZE bytes
frank26080115 0:bf7b9fba3924 166 * of data or break whenever ring buffers are empty */
frank26080115 0:bf7b9fba3924 167 /* Wait until THR empty */
frank26080115 0:bf7b9fba3924 168 while (UART_CheckBusy((LPC_UART_TypeDef *)LPC_UART0) == SET);
frank26080115 0:bf7b9fba3924 169
frank26080115 0:bf7b9fba3924 170 while (!__BUF_IS_EMPTY(rb.tx_head,rb.tx_tail))
frank26080115 0:bf7b9fba3924 171 {
frank26080115 0:bf7b9fba3924 172 /* Move a piece of data into the transmit FIFO */
frank26080115 0:bf7b9fba3924 173 if (UART_Send((LPC_UART_TypeDef *)LPC_UART0, (uint8_t *)&rb.tx[rb.tx_tail], 1, NONE_BLOCKING)){
frank26080115 0:bf7b9fba3924 174 /* Update transmit ring FIFO tail pointer */
frank26080115 0:bf7b9fba3924 175 __BUF_INCR(rb.tx_tail);
frank26080115 0:bf7b9fba3924 176 } else {
frank26080115 0:bf7b9fba3924 177 break;
frank26080115 0:bf7b9fba3924 178 }
frank26080115 0:bf7b9fba3924 179 }
frank26080115 0:bf7b9fba3924 180
frank26080115 0:bf7b9fba3924 181 /* If there is no more data to send, disable the transmit
frank26080115 0:bf7b9fba3924 182 interrupt - else enable it or keep it enabled */
frank26080115 0:bf7b9fba3924 183 if (__BUF_IS_EMPTY(rb.tx_head, rb.tx_tail)) {
frank26080115 0:bf7b9fba3924 184 UART_IntConfig((LPC_UART_TypeDef *)LPC_UART0, UART_INTCFG_THRE, DISABLE);
frank26080115 0:bf7b9fba3924 185 // Reset Tx Interrupt state
frank26080115 0:bf7b9fba3924 186 TxIntStat = RESET;
frank26080115 0:bf7b9fba3924 187 }
frank26080115 0:bf7b9fba3924 188 else{
frank26080115 0:bf7b9fba3924 189 // Set Tx Interrupt state
frank26080115 0:bf7b9fba3924 190 TxIntStat = SET;
frank26080115 0:bf7b9fba3924 191 UART_IntConfig((LPC_UART_TypeDef *)LPC_UART0, UART_INTCFG_THRE, ENABLE);
frank26080115 0:bf7b9fba3924 192 }
frank26080115 0:bf7b9fba3924 193 }
frank26080115 0:bf7b9fba3924 194
frank26080115 0:bf7b9fba3924 195
frank26080115 0:bf7b9fba3924 196 /*********************************************************************//**
frank26080115 0:bf7b9fba3924 197 * @brief UART Line Status Error
frank26080115 0:bf7b9fba3924 198 * @param[in] bLSErrType UART Line Status Error Type
frank26080115 0:bf7b9fba3924 199 * @return None
frank26080115 0:bf7b9fba3924 200 **********************************************************************/
frank26080115 0:bf7b9fba3924 201 void UART_IntErr(uint8_t bLSErrType)
frank26080115 0:bf7b9fba3924 202 {
frank26080115 0:bf7b9fba3924 203 uint8_t test;
frank26080115 0:bf7b9fba3924 204 // Loop forever
frank26080115 0:bf7b9fba3924 205 while (1){
frank26080115 0:bf7b9fba3924 206 // For testing purpose
frank26080115 0:bf7b9fba3924 207 test = bLSErrType;
frank26080115 0:bf7b9fba3924 208 }
frank26080115 0:bf7b9fba3924 209 }
frank26080115 0:bf7b9fba3924 210
frank26080115 0:bf7b9fba3924 211 /*-------------------------PRIVATE FUNCTIONS------------------------------*/
frank26080115 0:bf7b9fba3924 212 /*********************************************************************//**
frank26080115 0:bf7b9fba3924 213 * @brief UART transmit function for interrupt mode (using ring buffers)
frank26080115 0:bf7b9fba3924 214 * @param[in] UARTPort Selected UART peripheral used to send data,
frank26080115 0:bf7b9fba3924 215 * should be UART0
frank26080115 0:bf7b9fba3924 216 * @param[out] txbuf Pointer to Transmit buffer
frank26080115 0:bf7b9fba3924 217 * @param[in] buflen Length of Transmit buffer
frank26080115 0:bf7b9fba3924 218 * @return Number of bytes actually sent to the ring buffer
frank26080115 0:bf7b9fba3924 219 **********************************************************************/
frank26080115 0:bf7b9fba3924 220 uint32_t UARTSend(LPC_UART_TypeDef *UARTPort, uint8_t *txbuf, uint8_t buflen)
frank26080115 0:bf7b9fba3924 221 {
frank26080115 0:bf7b9fba3924 222 uint8_t *data = (uint8_t *) txbuf;
frank26080115 0:bf7b9fba3924 223 uint32_t bytes = 0;
frank26080115 0:bf7b9fba3924 224
frank26080115 0:bf7b9fba3924 225 /* Temporarily lock out UART transmit interrupts during this
frank26080115 0:bf7b9fba3924 226 read so the UART transmit interrupt won't cause problems
frank26080115 0:bf7b9fba3924 227 with the index values */
frank26080115 0:bf7b9fba3924 228 UART_IntConfig(UARTPort, UART_INTCFG_THRE, DISABLE);
frank26080115 0:bf7b9fba3924 229
frank26080115 0:bf7b9fba3924 230 /* Loop until transmit run buffer is full or until n_bytes
frank26080115 0:bf7b9fba3924 231 expires */
frank26080115 0:bf7b9fba3924 232 while ((buflen > 0) && (!__BUF_IS_FULL(rb.tx_head, rb.tx_tail)))
frank26080115 0:bf7b9fba3924 233 {
frank26080115 0:bf7b9fba3924 234 /* Write data from buffer into ring buffer */
frank26080115 0:bf7b9fba3924 235 rb.tx[rb.tx_head] = *data;
frank26080115 0:bf7b9fba3924 236 data++;
frank26080115 0:bf7b9fba3924 237
frank26080115 0:bf7b9fba3924 238 /* Increment head pointer */
frank26080115 0:bf7b9fba3924 239 __BUF_INCR(rb.tx_head);
frank26080115 0:bf7b9fba3924 240
frank26080115 0:bf7b9fba3924 241 /* Increment data count and decrement buffer size count */
frank26080115 0:bf7b9fba3924 242 bytes++;
frank26080115 0:bf7b9fba3924 243 buflen--;
frank26080115 0:bf7b9fba3924 244 }
frank26080115 0:bf7b9fba3924 245
frank26080115 0:bf7b9fba3924 246 /*
frank26080115 0:bf7b9fba3924 247 * Check if current Tx interrupt enable is reset,
frank26080115 0:bf7b9fba3924 248 * that means the Tx interrupt must be re-enabled
frank26080115 0:bf7b9fba3924 249 * due to call UART_IntTransmit() function to trigger
frank26080115 0:bf7b9fba3924 250 * this interrupt type
frank26080115 0:bf7b9fba3924 251 */
frank26080115 0:bf7b9fba3924 252 if (TxIntStat == RESET) {
frank26080115 0:bf7b9fba3924 253 UART_IntTransmit();
frank26080115 0:bf7b9fba3924 254 }
frank26080115 0:bf7b9fba3924 255 /*
frank26080115 0:bf7b9fba3924 256 * Otherwise, re-enables Tx Interrupt
frank26080115 0:bf7b9fba3924 257 */
frank26080115 0:bf7b9fba3924 258 else {
frank26080115 0:bf7b9fba3924 259 UART_IntConfig(UARTPort, UART_INTCFG_THRE, ENABLE);
frank26080115 0:bf7b9fba3924 260 }
frank26080115 0:bf7b9fba3924 261
frank26080115 0:bf7b9fba3924 262 return bytes;
frank26080115 0:bf7b9fba3924 263 }
frank26080115 0:bf7b9fba3924 264
frank26080115 0:bf7b9fba3924 265
frank26080115 0:bf7b9fba3924 266 /*********************************************************************//**
frank26080115 0:bf7b9fba3924 267 * @brief UART read function for interrupt mode (using ring buffers)
frank26080115 0:bf7b9fba3924 268 * @param[in] UARTPort Selected UART peripheral used to send data,
frank26080115 0:bf7b9fba3924 269 * should be UART0
frank26080115 0:bf7b9fba3924 270 * @param[out] rxbuf Pointer to Received buffer
frank26080115 0:bf7b9fba3924 271 * @param[in] buflen Length of Received buffer
frank26080115 0:bf7b9fba3924 272 * @return Number of bytes actually read from the ring buffer
frank26080115 0:bf7b9fba3924 273 **********************************************************************/
frank26080115 0:bf7b9fba3924 274 uint32_t UARTReceive(LPC_UART_TypeDef *UARTPort, uint8_t *rxbuf, uint8_t buflen)
frank26080115 0:bf7b9fba3924 275 {
frank26080115 0:bf7b9fba3924 276 uint8_t *data = (uint8_t *) rxbuf;
frank26080115 0:bf7b9fba3924 277 uint32_t bytes = 0;
frank26080115 0:bf7b9fba3924 278
frank26080115 0:bf7b9fba3924 279 /* Temporarily lock out UART receive interrupts during this
frank26080115 0:bf7b9fba3924 280 read so the UART receive interrupt won't cause problems
frank26080115 0:bf7b9fba3924 281 with the index values */
frank26080115 0:bf7b9fba3924 282 UART_IntConfig(UARTPort, UART_INTCFG_RBR, DISABLE);
frank26080115 0:bf7b9fba3924 283
frank26080115 0:bf7b9fba3924 284 /* Loop until receive buffer ring is empty or
frank26080115 0:bf7b9fba3924 285 until max_bytes expires */
frank26080115 0:bf7b9fba3924 286 while ((buflen > 0) && (!(__BUF_IS_EMPTY(rb.rx_head, rb.rx_tail))))
frank26080115 0:bf7b9fba3924 287 {
frank26080115 0:bf7b9fba3924 288 /* Read data from ring buffer into user buffer */
frank26080115 0:bf7b9fba3924 289 *data = rb.rx[rb.rx_tail];
frank26080115 0:bf7b9fba3924 290 data++;
frank26080115 0:bf7b9fba3924 291
frank26080115 0:bf7b9fba3924 292 /* Update tail pointer */
frank26080115 0:bf7b9fba3924 293 __BUF_INCR(rb.rx_tail);
frank26080115 0:bf7b9fba3924 294
frank26080115 0:bf7b9fba3924 295 /* Increment data count and decrement buffer size count */
frank26080115 0:bf7b9fba3924 296 bytes++;
frank26080115 0:bf7b9fba3924 297 buflen--;
frank26080115 0:bf7b9fba3924 298 }
frank26080115 0:bf7b9fba3924 299
frank26080115 0:bf7b9fba3924 300 /* Re-enable UART interrupts */
frank26080115 0:bf7b9fba3924 301 UART_IntConfig(UARTPort, UART_INTCFG_RBR, ENABLE);
frank26080115 0:bf7b9fba3924 302
frank26080115 0:bf7b9fba3924 303 return bytes;
frank26080115 0:bf7b9fba3924 304 }
frank26080115 0:bf7b9fba3924 305
frank26080115 0:bf7b9fba3924 306 /*********************************************************************//**
frank26080115 0:bf7b9fba3924 307 * @brief Print Welcome Screen Menu subroutine
frank26080115 0:bf7b9fba3924 308 * @param None
frank26080115 0:bf7b9fba3924 309 * @return None
frank26080115 0:bf7b9fba3924 310 **********************************************************************/
frank26080115 0:bf7b9fba3924 311 void print_menu(void)
frank26080115 0:bf7b9fba3924 312 {
frank26080115 0:bf7b9fba3924 313 uint32_t tmp, tmp2;
frank26080115 0:bf7b9fba3924 314 uint8_t *pDat;
frank26080115 0:bf7b9fba3924 315
frank26080115 0:bf7b9fba3924 316 tmp = sizeof(menu1);
frank26080115 0:bf7b9fba3924 317 tmp2 = 0;
frank26080115 0:bf7b9fba3924 318 pDat = (uint8_t *)&menu1[0];
frank26080115 0:bf7b9fba3924 319 while(tmp) {
frank26080115 0:bf7b9fba3924 320 tmp2 = UARTSend((LPC_UART_TypeDef *)LPC_UART0, pDat, tmp);
frank26080115 0:bf7b9fba3924 321 pDat += tmp2;
frank26080115 0:bf7b9fba3924 322 tmp -= tmp2;
frank26080115 0:bf7b9fba3924 323 }
frank26080115 0:bf7b9fba3924 324
frank26080115 0:bf7b9fba3924 325 tmp = sizeof(menu2);
frank26080115 0:bf7b9fba3924 326 tmp2 = 0;
frank26080115 0:bf7b9fba3924 327 pDat = (uint8_t *)&menu2[0];
frank26080115 0:bf7b9fba3924 328 while(tmp) {
frank26080115 0:bf7b9fba3924 329 tmp2 = UARTSend((LPC_UART_TypeDef *)LPC_UART0, pDat, tmp);
frank26080115 0:bf7b9fba3924 330 pDat += tmp2;
frank26080115 0:bf7b9fba3924 331 tmp -= tmp2;
frank26080115 0:bf7b9fba3924 332 }
frank26080115 0:bf7b9fba3924 333 }
frank26080115 0:bf7b9fba3924 334
frank26080115 0:bf7b9fba3924 335 /*-------------------------MAIN FUNCTION------------------------------*/
frank26080115 0:bf7b9fba3924 336 /*********************************************************************//**
frank26080115 0:bf7b9fba3924 337 * @brief c_entry: Main UART program body
frank26080115 0:bf7b9fba3924 338 * @param[in] None
frank26080115 0:bf7b9fba3924 339 * @return int
frank26080115 0:bf7b9fba3924 340 **********************************************************************/
frank26080115 0:bf7b9fba3924 341 int c_entry(void)
frank26080115 0:bf7b9fba3924 342 {
frank26080115 0:bf7b9fba3924 343 // UART Configuration structure variable
frank26080115 0:bf7b9fba3924 344 UART_CFG_Type UARTConfigStruct;
frank26080115 0:bf7b9fba3924 345 // UART FIFO configuration Struct variable
frank26080115 0:bf7b9fba3924 346 UART_FIFO_CFG_Type UARTFIFOConfigStruct;
frank26080115 0:bf7b9fba3924 347 // Pin configuration for UART0
frank26080115 0:bf7b9fba3924 348 PINSEL_CFG_Type PinCfg;
frank26080115 0:bf7b9fba3924 349
frank26080115 0:bf7b9fba3924 350 uint32_t idx, len;
frank26080115 0:bf7b9fba3924 351 __IO FlagStatus exitflag;
frank26080115 0:bf7b9fba3924 352 uint8_t buffer[10];
frank26080115 0:bf7b9fba3924 353
frank26080115 0:bf7b9fba3924 354 /*
frank26080115 0:bf7b9fba3924 355 * Initialize UART0 pin connect
frank26080115 0:bf7b9fba3924 356 */
frank26080115 0:bf7b9fba3924 357 PinCfg.Funcnum = 1;
frank26080115 0:bf7b9fba3924 358 PinCfg.OpenDrain = 0;
frank26080115 0:bf7b9fba3924 359 PinCfg.Pinmode = 0;
frank26080115 0:bf7b9fba3924 360 PinCfg.Pinnum = 2;
frank26080115 0:bf7b9fba3924 361 PinCfg.Portnum = 0;
frank26080115 0:bf7b9fba3924 362 PINSEL_ConfigPin(&PinCfg);
frank26080115 0:bf7b9fba3924 363 PinCfg.Pinnum = 3;
frank26080115 0:bf7b9fba3924 364 PINSEL_ConfigPin(&PinCfg);
frank26080115 0:bf7b9fba3924 365
frank26080115 0:bf7b9fba3924 366
frank26080115 0:bf7b9fba3924 367 /* Initialize UART Configuration parameter structure to default state:
frank26080115 0:bf7b9fba3924 368 * Baudrate = 9600bps
frank26080115 0:bf7b9fba3924 369 * 8 data bit
frank26080115 0:bf7b9fba3924 370 * 1 Stop bit
frank26080115 0:bf7b9fba3924 371 * None parity
frank26080115 0:bf7b9fba3924 372 */
frank26080115 0:bf7b9fba3924 373 UART_ConfigStructInit(&UARTConfigStruct);
frank26080115 0:bf7b9fba3924 374
frank26080115 0:bf7b9fba3924 375 // Initialize UART0 peripheral with given to corresponding parameter
frank26080115 0:bf7b9fba3924 376 UART_Init((LPC_UART_TypeDef *)LPC_UART0, &UARTConfigStruct);
frank26080115 0:bf7b9fba3924 377
frank26080115 0:bf7b9fba3924 378
frank26080115 0:bf7b9fba3924 379 /* Initialize FIFOConfigStruct to default state:
frank26080115 0:bf7b9fba3924 380 * - FIFO_DMAMode = DISABLE
frank26080115 0:bf7b9fba3924 381 * - FIFO_Level = UART_FIFO_TRGLEV0
frank26080115 0:bf7b9fba3924 382 * - FIFO_ResetRxBuf = ENABLE
frank26080115 0:bf7b9fba3924 383 * - FIFO_ResetTxBuf = ENABLE
frank26080115 0:bf7b9fba3924 384 * - FIFO_State = ENABLE
frank26080115 0:bf7b9fba3924 385 */
frank26080115 0:bf7b9fba3924 386 UART_FIFOConfigStructInit(&UARTFIFOConfigStruct);
frank26080115 0:bf7b9fba3924 387
frank26080115 0:bf7b9fba3924 388 // Initialize FIFO for UART0 peripheral
frank26080115 0:bf7b9fba3924 389 UART_FIFOConfig((LPC_UART_TypeDef *)LPC_UART0, &UARTFIFOConfigStruct);
frank26080115 0:bf7b9fba3924 390
frank26080115 0:bf7b9fba3924 391
frank26080115 0:bf7b9fba3924 392 // Enable UART Transmit
frank26080115 0:bf7b9fba3924 393 UART_TxCmd((LPC_UART_TypeDef *)LPC_UART0, ENABLE);
frank26080115 0:bf7b9fba3924 394
frank26080115 0:bf7b9fba3924 395 /* Enable UART Rx interrupt */
frank26080115 0:bf7b9fba3924 396 UART_IntConfig((LPC_UART_TypeDef *)LPC_UART0, UART_INTCFG_RBR, ENABLE);
frank26080115 0:bf7b9fba3924 397 /* Enable UART line status interrupt */
frank26080115 0:bf7b9fba3924 398 UART_IntConfig((LPC_UART_TypeDef *)LPC_UART0, UART_INTCFG_RLS, ENABLE);
frank26080115 0:bf7b9fba3924 399 /*
frank26080115 0:bf7b9fba3924 400 * Do not enable transmit interrupt here, since it is handled by
frank26080115 0:bf7b9fba3924 401 * UART_Send() function, just to reset Tx Interrupt state for the
frank26080115 0:bf7b9fba3924 402 * first time
frank26080115 0:bf7b9fba3924 403 */
frank26080115 0:bf7b9fba3924 404 TxIntStat = RESET;
frank26080115 0:bf7b9fba3924 405
frank26080115 0:bf7b9fba3924 406 // Reset ring buf head and tail idx
frank26080115 0:bf7b9fba3924 407 __BUF_RESET(rb.rx_head);
frank26080115 0:bf7b9fba3924 408 __BUF_RESET(rb.rx_tail);
frank26080115 0:bf7b9fba3924 409 __BUF_RESET(rb.tx_head);
frank26080115 0:bf7b9fba3924 410 __BUF_RESET(rb.tx_tail);
frank26080115 0:bf7b9fba3924 411
frank26080115 0:bf7b9fba3924 412 /* preemption = 1, sub-priority = 1 */
frank26080115 0:bf7b9fba3924 413 NVIC_SetPriority(UART0_IRQn, ((0x01<<3)|0x01));
frank26080115 0:bf7b9fba3924 414 /* Enable Interrupt for UART0 channel */
frank26080115 0:bf7b9fba3924 415 NVIC_EnableIRQ(UART0_IRQn);
frank26080115 0:bf7b9fba3924 416
frank26080115 0:bf7b9fba3924 417
frank26080115 0:bf7b9fba3924 418 // print welcome screen
frank26080115 0:bf7b9fba3924 419 print_menu();
frank26080115 0:bf7b9fba3924 420
frank26080115 0:bf7b9fba3924 421 // reset exit flag
frank26080115 0:bf7b9fba3924 422 exitflag = RESET;
frank26080115 0:bf7b9fba3924 423
frank26080115 0:bf7b9fba3924 424 /* Read some data from the buffer */
frank26080115 0:bf7b9fba3924 425 while (exitflag == RESET)
frank26080115 0:bf7b9fba3924 426 {
frank26080115 0:bf7b9fba3924 427 len = 0;
frank26080115 0:bf7b9fba3924 428 while (len == 0)
frank26080115 0:bf7b9fba3924 429 {
frank26080115 0:bf7b9fba3924 430 len = UARTReceive((LPC_UART_TypeDef *)LPC_UART0, buffer, sizeof(buffer));
frank26080115 0:bf7b9fba3924 431 }
frank26080115 0:bf7b9fba3924 432
frank26080115 0:bf7b9fba3924 433 /* Got some data */
frank26080115 0:bf7b9fba3924 434 idx = 0;
frank26080115 0:bf7b9fba3924 435 while (idx < len)
frank26080115 0:bf7b9fba3924 436 {
frank26080115 0:bf7b9fba3924 437 if (buffer[idx] == 27)
frank26080115 0:bf7b9fba3924 438 {
frank26080115 0:bf7b9fba3924 439 /* ESC key, set exit flag */
frank26080115 0:bf7b9fba3924 440 UARTSend((LPC_UART_TypeDef *)LPC_UART0, menu3, sizeof(menu3));
frank26080115 0:bf7b9fba3924 441 exitflag = SET;
frank26080115 0:bf7b9fba3924 442 }
frank26080115 0:bf7b9fba3924 443 else if (buffer[idx] == 'r')
frank26080115 0:bf7b9fba3924 444 {
frank26080115 0:bf7b9fba3924 445 print_menu();
frank26080115 0:bf7b9fba3924 446 }
frank26080115 0:bf7b9fba3924 447 else
frank26080115 0:bf7b9fba3924 448 {
frank26080115 0:bf7b9fba3924 449 /* Echo it back */
frank26080115 0:bf7b9fba3924 450 UARTSend((LPC_UART_TypeDef *)LPC_UART0, &buffer[idx], 1);
frank26080115 0:bf7b9fba3924 451 }
frank26080115 0:bf7b9fba3924 452 idx++;
frank26080115 0:bf7b9fba3924 453 }
frank26080115 0:bf7b9fba3924 454 }
frank26080115 0:bf7b9fba3924 455
frank26080115 0:bf7b9fba3924 456 // wait for current transmission complete - THR must be empty
frank26080115 0:bf7b9fba3924 457 while (UART_CheckBusy((LPC_UART_TypeDef *)LPC_UART0));
frank26080115 0:bf7b9fba3924 458
frank26080115 0:bf7b9fba3924 459 // DeInitialize UART0 peripheral
frank26080115 0:bf7b9fba3924 460 UART_DeInit((LPC_UART_TypeDef *)LPC_UART0);
frank26080115 0:bf7b9fba3924 461
frank26080115 0:bf7b9fba3924 462 /* Loop forever */
frank26080115 0:bf7b9fba3924 463 while(1);
frank26080115 0:bf7b9fba3924 464 return 1;
frank26080115 0:bf7b9fba3924 465 }
frank26080115 0:bf7b9fba3924 466
frank26080115 0:bf7b9fba3924 467 /* With ARM and GHS toolsets, the entry point is main() - this will
frank26080115 0:bf7b9fba3924 468 allow the linker to generate wrapper code to setup stacks, allocate
frank26080115 0:bf7b9fba3924 469 heap area, and initialize and copy code and data segments. For GNU
frank26080115 0:bf7b9fba3924 470 toolsets, the entry point is through __start() in the crt0_gnu.asm
frank26080115 0:bf7b9fba3924 471 file, and that startup code will setup stacks and data */
frank26080115 0:bf7b9fba3924 472 int main(void)
frank26080115 0:bf7b9fba3924 473 {
frank26080115 0:bf7b9fba3924 474 return c_entry();
frank26080115 0:bf7b9fba3924 475 }
frank26080115 0:bf7b9fba3924 476
frank26080115 0:bf7b9fba3924 477 #ifdef DEBUG
frank26080115 0:bf7b9fba3924 478 /*******************************************************************************
frank26080115 0:bf7b9fba3924 479 * @brief Reports the name of the source file and the source line number
frank26080115 0:bf7b9fba3924 480 * where the CHECK_PARAM error has occurred.
frank26080115 0:bf7b9fba3924 481 * @param[in] file Pointer to the source file name
frank26080115 0:bf7b9fba3924 482 * @param[in] line assert_param error line source number
frank26080115 0:bf7b9fba3924 483 * @return None
frank26080115 0:bf7b9fba3924 484 *******************************************************************************/
frank26080115 0:bf7b9fba3924 485 void check_failed(uint8_t *file, uint32_t line)
frank26080115 0:bf7b9fba3924 486 {
frank26080115 0:bf7b9fba3924 487 /* User can add his own implementation to report the file name and line number,
frank26080115 0:bf7b9fba3924 488 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
frank26080115 0:bf7b9fba3924 489
frank26080115 0:bf7b9fba3924 490 /* Infinite loop */
frank26080115 0:bf7b9fba3924 491 while(1);
frank26080115 0:bf7b9fba3924 492 }
frank26080115 0:bf7b9fba3924 493 #endif
frank26080115 0:bf7b9fba3924 494
frank26080115 0:bf7b9fba3924 495 /*
frank26080115 0:bf7b9fba3924 496 * @}
frank26080115 0:bf7b9fba3924 497 */