在调试过程中往往需要通过打印来看系统运行状态;在STM32平台上,打印重定向有多种实现方案;其一是编译时使用keil自带的MacroLIB,据说这个库对一些C语言基础设施做了新的实现,代码结构更加紧凑;但这种库没法取得源码,所以就不能进一步研究具体怎么实现的,很遗憾;还有一种实现方案是使用标准C(I/O)库,但这种方式下要注意修改避免使用semihosting(半主机模式),下面对两种方案做以简单说明。

方案一 使用mcrolib库:

  1、首先在option里边勾选mcrolib

  

  2、重写putchar函数,已验证,如果使用当前库,printf会调用putchar;换句话说就是printf的具体实现会调用putchar

  /// 重定向printf到uart
  int fputc(int ch, FILE *f)
  {
//发送一字节数据到UART
     ch = 0x0a;
USART_SendData(macUSARTx, (uint8_t) ch);
//检测UART状态
while (USART_GetFlagStatus(macUSARTx, USART_FLAG_TXE) == RESET); return (ch);
  }

  3、在使用printf之前初始化UART,之后调用即可。效果如下:

  

方案二 使用默认C库:

  这种方案要注意一点,程序不能使用半主机模式,据说半主机模式是STM32的默认模式,用调试器时会用到,所以在程序中要明确加上以下语句

#pragma import(__use_no_semihosting)
_sys_exit(int x)
{
x = x;
}
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;

  然后再重写putchar函数,可参考上面的。

  

最新文章

  1. [LeetCode] Random Pick Index 随机拾取序列
  2. iOS打包ipa给客户测试流程
  3. TopCoder比赛总结表
  4. javascript瀑布流布局效果
  5. NOIP2009普及组细胞分裂(数论)——yhx
  6. [Js]面向对象的拖拽
  7. 使用supervisor的一些注意事项
  8. 【Python】一个简单的例子
  9. FirstOrDefault
  10. 转 Android HTTPS详解
  11. 数字化工厂解决方案——OA办公自动化与ERP
  12. 【翻译】旧技术成就新勒索软件,Petya添加蠕虫特性
  13. ThoughtWorks 2017技术雷达
  14. hdu-3294(最长回文子串)
  15. 喵哈哈村的魔法考试 Round #10 (Div.2) 题解
  16. IntelliJ IDEA 缺少 javax 包 支持
  17. Android开发学习笔记-自定义TextView属性模版
  18. 51Nod:1265 四点共面
  19. C# 编写最小化时隐藏为任务栏图标的Window appllication
  20. Android基础总结(七)BroadcastReceiver

热门文章

  1. ubuntu+anaconda+mxnet环境配置
  2. storm-sql-kafka问题情况
  3. 微信小程序表单验证
  4. Android ANR(应用无响应)解决分析【转】
  5. Multiple markers at this line - Missing semicolon时的解决方法
  6. java导出excel 浏览器直接下载或者或以文件形式导出
  7. 2>&1的意思
  8. linux配置虚拟机的网络服务
  9. Windows7下Jupyter Notebook使用入门
  10. UI组件--element-ui合计行在横向滚动条下面的解决方法