2 FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd.
\r
5 VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
\r
7 ***************************************************************************
\r
9 * FreeRTOS provides completely free yet professionally developed, *
\r
10 * robust, strictly quality controlled, supported, and cross *
\r
11 * platform software that has become a de facto standard. *
\r
13 * Help yourself get started quickly and support the FreeRTOS *
\r
14 * project by purchasing a FreeRTOS tutorial book, reference *
\r
15 * manual, or both from: http://www.FreeRTOS.org/Documentation *
\r
19 ***************************************************************************
\r
21 This file is part of the FreeRTOS distribution.
\r
23 FreeRTOS is free software; you can redistribute it and/or modify it under
\r
24 the terms of the GNU General Public License (version 2) as published by the
\r
25 Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
\r
27 >>! NOTE: The modification to the GPL is included to allow you to distribute
\r
28 >>! a combined work that includes FreeRTOS without being obliged to provide
\r
29 >>! the source code for proprietary components outside of the FreeRTOS
\r
32 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
\r
33 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
34 FOR A PARTICULAR PURPOSE. Full license text is available from the following
\r
35 link: http://www.freertos.org/a00114.html
\r
39 ***************************************************************************
\r
41 * Having a problem? Start by reading the FAQ "My application does *
\r
42 * not run, what could be wrong?" *
\r
44 * http://www.FreeRTOS.org/FAQHelp.html *
\r
46 ***************************************************************************
\r
48 http://www.FreeRTOS.org - Documentation, books, training, latest versions,
\r
49 license and Real Time Engineers Ltd. contact details.
\r
51 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
\r
52 including FreeRTOS+Trace - an indispensable productivity tool, a DOS
\r
53 compatible FAT file system, and our tiny thread aware UDP/IP stack.
\r
55 http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
\r
56 Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
\r
57 licenses offer ticketed support, indemnification and middleware.
\r
59 http://www.SafeRTOS.com - High Integrity Systems also provide a safety
\r
60 engineered and independently SIL3 certified version for use in safety and
\r
61 mission critical applications that require provable dependability.
\r
67 /* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER for port 1.
\r
69 Note that this driver is written to test the RTOS port and is not intended
\r
70 to represent an optimised solution. */
\r
72 /* Processor Expert generated includes. */
\r
75 /* Scheduler include files. */
\r
76 #include "FreeRTOS.h"
\r
80 /* Demo application include files. */
\r
83 /* The queues used to communicate between the task code and the interrupt
\r
84 service routines. */
\r
85 static xQueueHandle xRxedChars;
\r
86 static xQueueHandle xCharsForTx;
\r
88 /* Interrupt identification bits. */
\r
89 #define serOVERRUN_INTERRUPT ( 0x08 )
\r
90 #define serRX_INTERRUPT ( 0x20 )
\r
91 #define serTX_INTERRUPT ( 0x80 )
\r
93 /*-----------------------------------------------------------*/
\r
97 * Initialise port for interrupt driven communications.
\r
99 xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
\r
101 /* Hardware setup is performed by the Processor Expert generated code.
\r
102 This function just creates the queues used to communicate between the
\r
103 interrupt code and the task code - then sets the required baud rate. */
\r
105 xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
\r
106 xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) );
\r
108 COM0_SetBaudRateMode( ( char ) ulWantedBaud );
\r
112 /*-----------------------------------------------------------*/
\r
114 signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime )
\r
116 /* Get the next character from the buffer queue. Return false if no characters
\r
117 are available, or arrive before xBlockTime expires. */
\r
118 if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
\r
127 /*-----------------------------------------------------------*/
\r
129 signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime )
\r
131 /* Place the character in the queue of characters to be transmitted. */
\r
132 if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
\r
137 /* Turn on the Tx interrupt so the ISR will remove the character from the
\r
138 queue and send it. This does not need to be in a critical section as
\r
139 if the interrupt has already removed the character the next interrupt
\r
140 will simply turn off the Tx interrupt again. */
\r
141 SCI0CR2_SCTIE = 1;;
\r
145 /*-----------------------------------------------------------*/
\r
147 void vSerialClose( xComPortHandle xPort )
\r
149 /* Not supported. */
\r
152 /*-----------------------------------------------------------*/
\r
156 * Interrupt service routine for the serial port. Must be in non-banked
\r
160 #pragma CODE_SEG __NEAR_SEG NON_BANKED
\r
162 __interrupt void vCOM0_ISR( void )
\r
164 volatile unsigned char ucByte, ucStatus;
\r
165 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
\r
167 /* What caused the interrupt? */
\r
168 ucStatus = SCI0SR1;
\r
170 if( ucStatus & serOVERRUN_INTERRUPT )
\r
172 /* The interrupt was caused by an overrun. Clear the error by reading
\r
173 the data register. */
\r
177 if( ucStatus & serRX_INTERRUPT )
\r
179 /* The interrupt was caused by a character being received.
\r
180 Read the received byte. */
\r
183 /* Post the character onto the queue of received characters - noting
\r
184 whether or not this wakes a task. */
\r
185 xQueueSendFromISR( xRxedChars, ( void * ) &ucByte, &xHigherPriorityTaskWoken );
\r
188 if( ( ucStatus & serTX_INTERRUPT ) && ( SCI0CR2_SCTIE ) )
\r
190 /* The interrupt was caused by a character being transmitted. */
\r
191 if( xQueueReceiveFromISR( xCharsForTx, ( void * ) &ucByte, &xHigherPriorityTaskWoken ) == pdTRUE )
\r
193 /* Clear the SCRF bit. */
\r
198 /* Disable transmit interrupt */
\r
199 SCI0CR2_SCTIE = 0;
\r
203 if( xHigherPriorityTaskWoken )
\r
209 #pragma CODE_SEG DEFAULT
\r