现在的位置: 首页 > 综合 > 正文

dsPIC33F串口UART-FreeRTOS

2014年08月29日 ⁄ 综合 ⁄ 共 3655字 ⁄ 字号 评论关闭
#include "p33FJ64GP206.h"

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "Usart1.h"
#define SYSCLK 7372870/2 		//XT 
#define BAUDRATE2 9600

#define UART1_TX_TRIS   TRISFbits.TRISF3
#define UART1_RX_TRIS   TRISFbits.TRISF2
#define BAUDRATEREG2 	SYSCLK/16/BAUDRATE2 -1
#define uart1QUEUE_SIZE		1

xQueueHandle xStartUSART1Task( void );
xQueueHandle xUART1Queue;
/*****************************************************************************
 * Function: UART1Init
 *
 * Precondition: None.
 *
 * Overview: Setup UART1 module.
 *
 * Input: None.
 *
 * Output: None.
 *
 *****************************************************************************/
void Init_UART1()
{
    // Set directions of UART IOs
    UART1_TX_TRIS = 0;
    UART1_RX_TRIS = 1;
    U1BRG = BAUDRATEREG2;

    U1MODE = 0;
    U1STA = 0;
    U1MODE = 0x8800 ;
    U1STA = 0x2400 ;
}

/*****************************************************************************
 * Function: UART1PutChar
 *
 * Precondition: UART1Init must be called before.
 *
 * Overview: Wait for free UART transmission buffer and send a byte.
 *
 * Input: Byte to be sent.
 *
 * Output: None.
 *
 *****************************************************************************/
void  UART1PutChar(char Ch){
    // wait for empty buffer  
    while(U1STAbits.UTXBF == 1);
      U1TXREG = Ch;
}



/*****************************************************************************
 * Function: UART1PutDec
 *
 * Precondition: UART1Init must be called before.
 *
 * Overview: This function converts decimal data into a string
 * and outputs it into UART.
 *
 * Input: Binary data.
 *
 * Output: None.
 *
 *****************************************************************************/
void  UART1PutDec(unsigned int Dec){
unsigned int Res;
    Res = Dec;

    if(Res/1000) 
		UART1PutChar(Res/1000+'0');
    Res = Res - (Res/1000)*1000;
	if(Res/100) 
        UART1PutChar(Res/100+'0');
    Res = Res - (Res/100)*100;

    if(Res/10) 
        UART1PutChar(Res/10+'0');
    Res = Res - (Res/10)*10;
 
    UART1PutChar(Res+'0');
}

/***************************************************************************
* Function Name     : UART1puts                                            *
* Description       : This function puts the data string to be transmitted *
*                     into the transmit buffer (till NULL character)       *
* Parameters        : unsigned int * address of the string buffer to be    *  
*                     transmitted                                          *
* Return Value      : None                                                 *
***************************************************************************/

void UART1puts(unsigned int *buffer)
{
    char * temp_ptr = (char *) buffer;

    /* transmit till NULL character is encountered */

    if(U1MODEbits.PDSEL == 3)        /* check if TX is 8bits or 9bits */
    {
        while(*buffer != '\0') 
        {
            while(U1STAbits.UTXBF); /* wait if the buffer is full */
            U1TXREG = *buffer++;    /* transfer data word to TX reg */
        }
    }
    else
    {
        while(*temp_ptr != '\0')
        {
            while(U1STAbits.UTXBF);  /* wait if the buffer is full */
            U1TXREG = *temp_ptr++;   /* transfer data byte to TX reg */
        }
    }
}
xQueueHandle xStartUART1Task( void )
{
	/* Create the queue used by the LCD task.  Messages for display on the LCD
	are received via this queue. */
	xUART1Queue = xQueueCreate( uart1QUEUE_SIZE, sizeof( xUART1Message ) );

	/* Start the task that will write to the LCD.  The LCD hardware is
	initialised from within the task itself so delays can be used. */
	xTaskCreate( vUSART1Task, ( signed portCHAR * ) "UART", configMINIMAL_STACK_SIZE*2, NULL, tskIDLE_PRIORITY , NULL );

	return xUART1Queue;
}
static void vUSART1Task( void *pvParameters )
{
xUART1Message xMessage;

	/* Initialise the hardware.  This uses delays so must not be called prior
		to the scheduler being started
	*/
	Init_UART1();
	volatile int a;
	for(a=0;a<0x4000;a++);
	/* Welcome message. */
	UART1puts("www.FreeRTOS.org	");

	for( ;; )
	{
		/* Wait for a message to arrive that requires displaying. */
		while( xQueueReceive( xUART1Queue, &xMessage, portMAX_DELAY ) != pdPASS );

		/* Clear the current display value. */

		/* Switch rows each time so we can see that the display is still being
		updated. */
		UART1puts( xMessage.pcMessage );

		/* Delay the requested amount of time to ensure the text just written 
		to the LCD is not overwritten. */
		vTaskDelay( xMessage.xMinDisplayTime );		
	}
}
/*****************************************************************************
 * EOF
 *****************************************************************************/

抱歉!评论已关闭.