⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printf.c

📁 内部包含如何用rs232来和rs485通信的示范代码
💻 C
字号:
/**************************************************************************** * * MODULE:             Printf Function * * COMPONENT:          Printf.c,v * * VERSION:            Build_Release_030308_RC1 * * REVISION:           1.2 * * DATED:              2008/02/29 17:55:45 * * STATUS:             Exp * * AUTHOR:             LJM * * DESCRIPTION: * Code to provide a simple printf function * * LAST MODIFIED BY:   dclar *                     $Modtime: $ * * **************************************************************************** * *  (c) Copyright 2005 JENNIC Ltd * ****************************************************************************//****************************************************************************//***        Include files                                                 ***//****************************************************************************/#include <stdarg.h>#include <ctype.h>#include <Printf.h>#include <AppHardwareApi.h>/****************************************************************************//***        Macro Definitions                                             ***//****************************************************************************//****************************************************************************//***        Type Definitions                                              ***//****************************************************************************/#define UART	  E_AHI_UART_0#define E_AHI_UART_RATE  	E_AHI_UART_RATE_9600/*#if UART == E_AHI_UART_0    #define UART_START_ADR  	0x30000000UL#else    #define UART_START_ADR  	0x40000000UL#endif#define UART_LCR_OFFSET 	0x0C#define UART_DLM_OFFSET 	0x04*//****************************************************************************//***        Local Function Prototypes                                     ***//****************************************************************************/PRIVATE void vNum2String(uint32 u32Number, uint8 u8Base);//PRIVATE void vUART_SetBuadRate(uint32 u32BaudRate);/****************************************************************************//***        Exported Variables                                            ***//****************************************************************************//****************************************************************************//***        Local Variables                                               ***//****************************************************************************//* pointer to whatever putchar function the user gives us */PRIVATE void (*vPutChar) (char c) = NULL;/****************************************************************************//***        Exported Functions                                            ***//****************************************************************************//** Before using these functions, you must call vInitPrintf* and give it a pointer to a function that will write the individual* characters to whatever device you decide to use for displaying output.** example below :-**   #include "Printf.h"**   void main(void)*   {**       vInitPrintf((void*)vPutC);  // pass the pointer to the putc function**       vPrintf("\nHello World!");  // show some text !*       while(1);*   }**   void vPutC(char c)*   {*       do something with c here, maybe write it to a uart*   }**/PUBLIC void vInitPrintf(void (*fp)(char c)){    vPutChar = fp;}/* * printf() *  Print to display - really trivial impelementation! */PUBLIC void vPrintf(const char *fmt, ...){    char *bp = (char *)fmt;    va_list ap;    char c;    char *p;    int32 i;    va_start(ap, fmt);    while ((c = *bp++)) {        if (c != '%') {            if (c == '\n'){                vPutChar('\n');                vPutChar('\r');            } else {                vPutChar(c);            }            continue;        }        switch ((c = *bp++)) {        /* %d - show a decimal value */        case 'd':            vNum2String(va_arg(ap, uint32), 10);            break;        /* %x - show a value in hex */        case 'x':            vPutChar('0');            vPutChar('x');            vNum2String(va_arg(ap, uint32), 16);            break;        /* %b - show a value in binary */        case 'b':            vPutChar('0');            vPutChar('b');            vNum2String(va_arg(ap, uint32), 2);            break;        /* %c - show a character */        case 'c':            vPutChar(va_arg(ap, int));            break;        case 'i':            i = va_arg(ap, int32);            if(i < 0){                vPutChar('-');                vNum2String((~i)+1, 10);            } else {                vNum2String(i, 10);            }            break;        /* %s - show a string */        case 's':            p = va_arg(ap, char *);            do {                vPutChar(*p++);            } while (*p);            break;        /* %% - show a % character */        case '%':            vPutChar('%');            break;        /* %something else not handled ! */        default:            vPutChar('?');            break;        }    }    return;}/****************************************************************************//***  Functions To Allow Printf To Work Via The UART                      ***//****************************************************************************//**************************************************************************** * * NAME: vUART_printInit * * DESCRIPTION: * Initialises the UART print environment * * RETURNS: * void * ****************************************************************************/PUBLIC void vUART_printInit(void){    vInitPrintf((void*)vPutC);    vUART_Init(FALSE);}/**************************************************************************** * * NAME: vUART_Init * * DESCRIPTION: * Initialises the UART * * RETURNS: * void * ****************************************************************************/PUBLIC void vUART_Init(bool bWaitForKey){    uint8 u8RxChar =0;    /* Enable UART 0: 19200-8-N-1 */    vAHI_UartEnable(UART);    vAHI_UartReset(UART, TRUE, TRUE);    vAHI_UartReset(UART, FALSE, FALSE);    // vUART_SetBuadRate(E_AHI_UART_RATE);    vAHI_UartSetClockDivisor(UART, E_AHI_UART_RATE);    vAHI_UartSetControl(UART, FALSE, FALSE, E_AHI_UART_WORD_LEN_8, TRUE, FALSE);    vAHI_UartSetInterrupt(UART, FALSE, FALSE, TRUE, TRUE, E_AHI_UART_FIFO_LEVEL_1);    if(bWaitForKey ==TRUE)    {        vPrintf("Waiting For Go \n");        // wait for a go "G" !        while (u8RxChar != 71) {            // wait for somthing in rx fifo            while ((u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_DR  ) == 0);            u8RxChar = u8AHI_UartReadData(UART);        }    }}/**************************************************************************** * * NAME: vPutC * * DESCRIPTION: * UART Callback Function To Allow printf to work over the Serial Port * * RETURNS: * void * ****************************************************************************/PUBLIC void vPutC(unsigned char c){    //wait for tx fifo empty (bit 5 set in LSR when empty)    while ((u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_THRE ) == 0);    // ..and send the character    vAHI_UartWriteData(UART,c);}/****************************************************************************//***        Local Functions                                               ***//****************************************************************************//* * vNum2String() *  Convert a number to a string */PRIVATE void vNum2String(uint32 u32Number, uint8 u8Base){    char buf[33];    char *p = buf + 33;    uint32 c, n;    *--p = '\0';    do {        n = u32Number / u8Base;        c = u32Number - (n * u8Base);        if (c < 10) {            *--p = '0' + c;        } else {            *--p = 'a' + (c - 10);        }        u32Number /= u8Base;    } while (u32Number != 0);    while (*p){        vPutChar(*p);        p++;    }    return;}/****************************************************************************//***        END OF FILE                                                   ***//****************************************************************************//*PRIVATE void vUART_SetBuadRate(uint32 u32BaudRate){    uint8 *pu8Reg;    uint8  u8TempLcr;    uint16 u16Divisor;    uint32 u32Remainder;    // Put UART into clock divisor setting mode    pu8Reg    = (uint8 *)(UART_START_ADR + UART_LCR_OFFSET);    u8TempLcr = *pu8Reg;    *pu8Reg   = u8TempLcr | 0x80;    // Write to divisor registers:     //  Divisor register = 16MHz / (16 x baud rate)    u16Divisor = (uint16)(16000000UL / (16UL * u32BaudRate));    // Correct for rounding errors    u32Remainder = (uint32)(16000000UL % (16UL * u32BaudRate));    if (u32Remainder >= ((16UL * u32BaudRate) / 2))    {        u16Divisor += 1;    }    pu8Reg  = (uint8 *)UART_START_ADR;    *pu8Reg = (uint8)(u16Divisor & 0xFF);    pu8Reg  = (uint8 *)(UART_START_ADR + UART_DLM_OFFSET);    *pu8Reg = (uint8)(u16Divisor >> 8);    // Put back into normal mode    pu8Reg    = (uint8 *)(UART_START_ADR + UART_LCR_OFFSET);    u8TempLcr = *pu8Reg;    *pu8Reg   = u8TempLcr & 0x7F;}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -