1. /******************** (C) COPYRIGHT 2012 WildFire Team ***************************
  2. * 文件名 :usart1.c
  3. * 描述 :将printf函数重定向到USART1。这样就可以用printf函数将单片机的数据
  4. * 打印到PC上的超级终端或串口调试助手。
  5. * 库版本 :ST3.5.0
  6. **********************************************************************************/
  7. #include "usart1.h"
  8. #include <stdarg.h>
  9.  
  10. /*
  11. * 函数名:USART1_Config
  12. * 描述 :USART1 GPIO 配置,工作模式配置。115200 8-N-1
  13. * 输入 :无
  14. * 输出 : 无
  15. * 调用 :外部调用
  16. */
  17. void USART1_Config(void)
  18. {
  19. GPIO_InitTypeDef GPIO_InitStructure;
  20. USART_InitTypeDef USART_InitStructure;
  21.  
  22. /* config USART1 clock */
  23. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  24.  
  25. /* USART1 GPIO config */
  26. /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  27. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  28. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  29. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30. GPIO_Init(GPIOA, &GPIO_InitStructure);
  31. /* Configure USART1 Rx (PA.10) as input floating */
  32. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  33. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  34. GPIO_Init(GPIOA, &GPIO_InitStructure);
  35.  
  36. /* USART1 mode config */
  37. USART_InitStructure.USART_BaudRate = ;
  38. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  39. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  40. USART_InitStructure.USART_Parity = USART_Parity_No ;
  41. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  42. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  43. USART_Init(USART1, &USART_InitStructure);
  44. USART_Cmd(USART1, ENABLE);
  45. }
  46.  
  47. /*
  48. * 函数名:fputc
  49. * 描述 :重定向c库函数printf到USART1
  50. * 输入 :无
  51. * 输出 :无
  52. * 调用 :由printf调用
  53. */
  54. int fputc(int ch, FILE *f)
  55. {
  56. /* 将Printf内容发往串口 */
  57. USART_SendData(USART1, (unsigned char) ch);
  58. while (!(USART1->SR & USART_FLAG_TXE));
  59.  
  60. return (ch);
  61. }
  62.  
  63. /*
  64. * 函数名:itoa
  65. * 描述 :将整形数据转换成字符串
  66. * 输入 :-radix =10 表示10进制,其他结果为0
  67. * -value 要转换的整形数
  68. * -buf 转换后的字符串
  69. * -radix = 10
  70. * 输出 :无
  71. * 返回 :无
  72. * 调用 :被USART1_printf()调用
  73. */
  74. static char *itoa(int value, char *string, int radix)
  75. {
  76. int i, d;
  77. int flag = ;
  78. char *ptr = string;
  79.  
  80. /* This implementation only works for decimal numbers. */
  81. if (radix != )
  82. {
  83. *ptr = ;
  84. return string;
  85. }
  86.  
  87. if (!value)
  88. {
  89. *ptr++ = 0x30;
  90. *ptr = ;
  91. return string;
  92. }
  93.  
  94. /* if this is a negative value insert the minus sign. */
  95. if (value < )
  96. {
  97. *ptr++ = '-';
  98.  
  99. /* Make the value positive. */
  100. value *= -;
  101. }
  102.  
  103. for (i = ; i > ; i /= )
  104. {
  105. d = value / i;
  106.  
  107. if (d || flag)
  108. {
  109. *ptr++ = (char)(d + 0x30);
  110. value -= (d * i);
  111. flag = ;
  112. }
  113. }
  114.  
  115. /* Null terminate the string. */
  116. *ptr = ;
  117.  
  118. return string;
  119.  
  120. } /* NCL_Itoa */
  121.  
  122. /*
  123. * 函数名:USART1_printf
  124. * 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库
  125. * 输入 :-USARTx 串口通道,这里只用到了串口1,即USART1
  126. * -Data 要发送到串口的内容的指针
  127. * -... 其他参数
  128. * 输出 :无
  129. * 返回 :无
  130. * 调用 :外部调用
  131. * 典型应用USART1_printf( USART1, "\r\n this is a demo \r\n" );
  132. * USART1_printf( USART1, "\r\n %d \r\n", i );
  133. * USART1_printf( USART1, "\r\n %s \r\n", j );
  134. */
  135. void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
  136. {
  137. const char *s;
  138. int d;
  139. char buf[];
  140.  
  141. va_list ap;
  142. va_start(ap, Data);
  143.  
  144. while ( *Data != ) // 判断是否到达字符串结束符
  145. {
  146. if ( *Data == 0x5c ) //'\'
  147. {
  148. switch ( *++Data )
  149. {
  150. case 'r': //回车符
  151. USART_SendData(USARTx, 0x0d);
  152. Data ++;
  153. break;
  154.  
  155. case 'n': //换行符
  156. USART_SendData(USARTx, 0x0a);
  157. Data ++;
  158. break;
  159.  
  160. default:
  161. Data ++;
  162. break;
  163. }
  164. }
  165. else if ( *Data == '%')
  166. { //
  167. switch ( *++Data )
  168. {
  169. case 's': //字符串
  170. s = va_arg(ap, const char *);
  171. for ( ; *s; s++)
  172. {
  173. USART_SendData(USARTx,*s);
  174. while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
  175. }
  176. Data++;
  177. break;
  178.  
  179. case 'd': //十进制
  180. d = va_arg(ap, int);
  181. itoa(d, buf, );
  182. for (s = buf; *s; s++)
  183. {
  184. USART_SendData(USARTx,*s);
  185. while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
  186. }
  187. Data++;
  188. break;
  189. default:
  190. Data++;
  191. break;
  192. }
  193. } /* end of else if */
  194. else
  195. USART_SendData(USARTx, *Data++);
  196. while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
  197. }
  198. }
  199. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/

STM32 printf函数的更多相关文章

  1. STM32 printf()函数和scanf()函数重定向到串口

    STM32 printf()函数和scanf()函数重定向到串口 printf()函数和scanf()函数重定向 在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到print ...

  2. 【stm32】实现STM32的串口数据发送和printf函数重定向

    在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进 ...

  3. STM32中如何对printf函数重定向

    通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...

  4. 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...

  5. 关于STM32中printf函数的重定向问题

    printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢? 答案是肯定的,那就是printf函数的 ...

  6. STM32 的 printf() 函数串口重定向(HAL库标准库都适用)

    1.建立工程 2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去 #include "stdio.h" #include "stm3 ...

  7. STM32 KEIL 下的 printf 函数

    1 //加入以下代码,支持printf函数,而不需要选择use MicroLIB 2 #if 1 3 #pragma import(__use_no_semihosting) 4 //标准库需要的支持 ...

  8. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  9. 如何在单片机上使用printf函数(printf)(avr)(stm)(lpc)(单片机)(转)

    摘要:    当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值,printf ...

随机推荐

  1. Java中的内部类————以及jdk1.8的lambda表达式

    一.内部类学习导图 1>.静态内部类: 使用static修饰符来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象.因此使用static修饰的内部类被称为静态内部类. publi ...

  2. 百练6247-过滤多余的空格-2015正式B题

    B:过滤多余的空格 总时间限制: 1000ms 内存限制:  65536kB 描述 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格. 输入 一行,一个字符串(长度不超过200),句子的 ...

  3. 百练8216-分段函数-2016正式A题

    百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问   A:分段函数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 编写程序 ...

  4. 九度OJ1111题-单词替换

    题目1111:单词替换 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6752 解决:1891 题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组 ...

  5. js 调用 手机 相机摄像机麦克风

    https://www.cnblogs.com/avon/p/5996368.html

  6. 安装,配置,启动FTP,SSH,NFS服务

    1.安装,配置,启动FTP服务 sudo apt-get install vsftpd 修改vsftpd的配置文件/etx/vsftpd/.config,将下面几行前面的“#”去掉 #local_en ...

  7. AangularJS入门总结三

    (参考的资料) 1. 数据绑定的原理: (1)  $watch 队列: 在DOM中每次绑定一些东西,就会往$watch队列中插入一条$watch: 每一个绑定到了DOM上的数据都会生成一个$watch ...

  8. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)

    4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...

  9. mac 打印机无法打印

    每次打印word的时候都无法正常打印,提示嘀嘀响声. 文件->页面设置-> 纸张A4 即可

  10. get android or ios appname

    get app name from GP or itunes var superagent = require('superagent'); var cheerio = require('cheeri ...