| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /***************************************************************
- *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
- *文件名: lib_printf.c
- *作 者: Liut
- *版 本: V1.00
- *日 期: 2017/07/14
- *描 述: 串口打印库函数
- *备 注: 适用于 ES8P508x芯片
- 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
- ***************************************************************/
- #include "lib_printf.h"
- #include <stdarg.h>
- /***************************************************************
- 函数名:fputc
- 描 述:重定向c库函数printf到UART
- 输入值:。。。
- 输出值:。。。
- 返回值:。。。
- ***************************************************************/
- /*使用printf()函数需要调用微库:Use MicroLIB*/
- int fputc(int ch, FILE *f)
- {
- FlagStatus Status = RESET;
- uint32_t Count=0;
- #if defined __PRINTF_USE_UART3__
- UART_SendByte(UART3, (unsigned char) ch);
- do
- {
- Status = UART_GetFlagStatus(UART3,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- return (EOF);
- #elif defined __PRINTF_USE_UART2__
- UART_SendByte(UART2, (unsigned char) ch);
- do
- {
- Status = UART_GetFlagStatus(UART2,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- return (EOF);
- #elif defined __PRINTF_USE_UART1__
- UART_SendByte(UART1, (unsigned char) ch);
- do
- {
- Status = UART_GetFlagStatus(UART1,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- return (EOF);
- #else
- UART_SendByte(UART0, (unsigned char) ch);
- do
- {
- Status = UART_GetFlagStatus(UART0,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- return (EOF);
- #endif
- return (ch);
- }
- #ifdef __clang__ //当使用的是idesigner编译器时,则不调用微库
- /***************************************************************
- 描 述:将整形数据转换成字符串
- 输入值: -radix =10 表示10进制,其他结果为0
- * -value 要转换的整形数
- * -buf 转换后的字符串
- * -radix = 10
- 返回值:无
- ***************************************************************/
- static char *itoa(int value, char *string, int radix)
- {
- int i, d;
- int flag = 0;
- char *ptr = string;
- /* This implementation only works for decimal numbers. */
- if (radix != 10)
- {
- *ptr = 0;
- return string;
- }
- if (!value)
- {
- *ptr++ = 0x30;
- *ptr = 0;
- return string;
- }
- /* if this is a negative value insert the minus sign. */
- if (value < 0)
- {
- *ptr++ = '-';
- /* Make the value positive. */
- value *= -1;
- }
- for (i = 10000; i > 0; i /= 10)
- {
- d = value / i;
- if (d || flag)
- {
- *ptr++ = (char)(d + 0x30);
- value -= (d * i);
- flag = 1;
- }
- }
- /* Null terminate the string. */
- *ptr = 0;
- return string;
- }
- /***************************************************************
- 描 述:格式化输出,类似于C库中的printf,但这里没有用到C库
- 输入值: -UARTx 串口通道,
- * -Data 要发送到串口的内容的指针
- * -... 其他参数
- 返回值:无
- 典型应用: UART_printf("\r\n this is a demo \r\n" );
- * UART1_printf("\r\n %d \r\n", i );
- * UART1_printf("\r\n %s \r\n", j );
- ***************************************************************/
- /* 未调用C库的时候可以使用此函数代替C库中的printf,但功能无printf全,
- 只支持\r \n %d %s */
- ErrorStatus UART_printf(uint8_t *Data,...)
- {
- UART_TypeDef *UARTx;
- const char *s;
- int d;
- char buf[16];
- ErrorStatus RET = SUCCESS;
- FlagStatus Status = RESET;
- uint32_t Count=0;
- va_list ap;
-
- /**
- **
- **使用宏定义选择使用哪一个串口
- **
- ***/
- #if defined __PRINTF_USE_UART3__
-
- UARTx = UART3;
-
- #elif defined __PRINTF_USE_UART2__
-
- UARTx = UART2;
-
- #elif defined __PRINTF_USE_UART1__
- UARTx = UART1;
-
- #else
- UARTx = UART0;
-
- #endif
-
- va_start(ap, Data);
- while ( *Data != 0) // 判断是否到达字符串结束符
- {
- if ( *Data == 0x5c ) //'\'
- {
- switch ( *++Data )
- {
- case 'r': //回车符
- Count=0;
- UART_SendByte(UARTx, 0x0d);
- do
- {
- Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- RET = ERROR;
- Data ++;
- break;
- case 'n': //换行符
- Count=0;
- UART_SendByte(UARTx, 0x0a);
- do
- {
- Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- RET = ERROR;
- Data ++;
- break;
- default:
- Data ++;
- break;
- }
- }
- else if ( *Data == '%')
- {
- switch ( *++Data )
- {
- case 's': //字符串
- s = va_arg(ap, const char *);
- for ( ; *s; s++)
- {
- Count=0;
- UART_SendByte(UARTx,*s);
- do
- {
- Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- RET = ERROR;
- }
- Data++;
- break;
- case 'd': //十进制
- d = va_arg(ap, int);
- itoa(d, buf, 10);
- for (s = buf; *s; s++)
- {
- Count=0;
- UART_SendByte(UARTx,*s);
- do
- {
- Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- RET = ERROR;
- }
- Data++;
- break;
- default:
- Data++;
- break;
- }
- } /* end of else if */
- else
- {
- Count=0;
- UART_SendByte(UARTx, *Data++);
- do
- {
- Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
- Count++;
- }while((Status == RESET)&&(Count != 0x1CE2));
- if(Count == 0x1CE2)
- RET = ERROR;
- }
- }
- return RET;
- }
- #endif
- /*************************END OF FILE**********************/
|