📄 printf.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 + -