转自http://www.stmcu.org/module/forum/thread-598294-1-1.html
看了原子哥的usart部分printf函数重定向的问题,自己动手试了试,单片机可以通过串口打印信息,printf函数重定向后使用十分方便。
所谓重定向是指修改printf的底层函数,使printf打印到单片机的外设中。
还有一个概念是半主机。
半主机是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如,使用此机制可以启用 C 库中的函数,如 printf() 和 scanf(),来使用主机的屏幕和键盘,而不是在目标系统上配备屏幕和键盘。
这种机制很有用,因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备。
半主机是通过一组定义好的软件指令(如 SVC)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。 调试代理提供与主机之间的必需通信。
半主机接口对 ARM 公司提供的所有调试代理都是通用的。 在无需移植的情况下使用 RealView ARMulator® ISS、指令集系统模型 (ISSM)、实时系统模型 (RTSM)、RealView ICE 或 RealMonitor 时,会执行半主机操作。
标准库使用半主机模式,半主机是通过一组定义好的软件指令 (如 SVC)SVC 指令 (以前称为 SWI 指令)来实现的,这些指令通过程序控制生成异常。 应用程序调用相应的半主机调用,然后调试代理处理该异常。调试代理(这里的调试代理是仿真器)提供与主机之间的必需通信。也就是说使用半主机模式必须使用仿真器调试。
ARMv7 之前的 ARM 处理器使用 SVC 指令 (以前称为 SWI 指令)进行半主机调
用。 但是,如果要为 ARMv6-M 或 ARMv7-M (如 Cortex™-M1 或 Cortex-M3 处
理器)进行编译,请使用 BKPT 指令来实现半主机。
简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。和半主机模式功能相同的是ITM调试机制。
有关ITM调试机制可以参考这里http://www.douban.com/note/248637026/
       上面介绍的半主机和ITM功能相当,他们都是调试机制,开发板均借助仿真器与电脑连接,实现单片机利用主机的屏幕键盘的输入输出。
这两种机制的运行均需要仿真器,否则无法运行。
       开发式一般单片机需要独立运行,开发者应去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口,lcd或者sd卡。
MDK中通常使用以下两种方法:
方法1.使用微库,因为使用微库的话,不会使用半主机模式.

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
return ch;

}  
方法2.仍然使用标准库,在主程序添加下面代码:
​#pragma import(__use_no_semihosting) 
​struct __FILE 

int handle; 
}; 
FILE __stdout;       
_sys_exit(int x) 

x = x; 

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
    USART1->DR = (u8) ch;      
return ch;
}
关于 microlib
microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。
上面给出了正确的方法,我在测试的过程中发现方法二中注释掉#pragma import(__use_no_semihosting) 程序依然运行正确,这个很让人费解。
也有使用#pragma import(__use_no_semihosting_swi)的。这几个的区别我没弄懂。
如果使用微库或者禁用半主机,没有重定义fputc函数,程序可以运行,但不知道结果打印到主机的哪个地方去了。既没有禁用半主机也没有重定义fputc函数,程序将一直停在中断处,如图:
网上的大部分资料都是禁用了半主机模式,没有使用过半主机模式借助主机的键盘输入参数,看了很多资料,都是讲半主机的,但讲的内容太浅显,
我没有学会使用半主机,更多的是学会了禁用半主机模式,我们好像忽略了半主机模式的意义。
另外,我们可以查到的大部分资料讲解的大同小异,它们更多的告诉我们正确的步骤,而不是让我们从源头了解一个问题,当然,大部分人看重的是实用,问题解决了,也就不再去思考背后的原理。
最有效最直接最权威的资料是mdk官方给出的资料,但是资料内容太多,看起来太多,不易懂,大部分人没有看下去的欲望。我们应该让使用手册看起来更直观,更易懂,更方便查阅,更高效地查阅。

STM32 printf半主机模式相关推荐

  1. Stm32:半主机模式

    一.什么是半主机模式? 简单的说,就是我们嵌入式程序中,类似printf的接口是会与我们PC进行通讯,以方便我们借助我们调试板的仿真器在PC上用开发工具进行调试. 二.为什么要禁用半主机模式? 在嵌入 ...

  2. STM32半主机模式

    在keil中编程时常会遇到__use_no_semihosting_swi的警告,这时你就是进入了半主机模式. 在嵌入式的编程中你是避免不了使用printf.fopen.fclose等函数的但是因为嵌 ...

  3. STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

    modbus协议 完成modbus协议的编程之后,设备可以分别作为modbus协议的主机或者从机进行测试,使用模拟软件测试完毕后,完整代码以三个版本的形式进行介绍 1.版本一:使用串口接收数据超时完成 ...

  4. STM32 printf 重定向 usart3

    jiause 问题描述: 今天调试串口,首先用串口1 printf打印输出,调试成功,在串口1成功的基础上,准备改用串口3 printf结果一直不成功. 串口没有一点反应. 解决过程:         ...

  5. STM32 - Printf重定向使用微库、不使用微库(Keil) (转载)

    Stm32芯片调试中经常用到串口来打印一些数据,因此如果能使用类似windows的Console中的printf就很完美了~ 方法1--使用微库: 1.使用微库(平台式keil-MDK),点击&quo ...

  6. Stm32 - Printf重定向(不)使用微库(Keil MDK)

    #define DEBUG_USART USART1 stm32芯片调试中经常用到串口来打印一些数据,因此如果能使用类似windows的Console中的printf就很完美了~ 方法1--使用微库: ...

  7. STM32做SPI主机用得多,SPI从机玩过吗?

    STM32如何配置为SPI从机? 前言 在平常的开发中,很多时候我们使用SPI都是使用主机模式去驱动一些传感器.存储器等等,很少会用到SPI从机.有时候,我们又需要STM32的SPI配置为从机去接收数 ...

  8. STM32的同步规则模式使用

    由于要采集电压.电流以计算功率.阻抗等信息,STM32的同步规则模式很适合于这种情景.使用时有几点需要注意的: 1.选择正确的模式:ADC_Mode_RegSimult,即DUALMOD[3:0] = ...

  9. mysql 半同步关闭_MySQL的半同步模式配置

    1.什么是半同步? 在有一台主服务器.多台从服务器的情况下,主服务器只会等待一台从服务器同步数据. 2.为什么要使用半同步? 在使用同步模式时,数据的写速度太慢. 在使用异步模式时,可能会造成从服务器 ...

最新文章

  1. 美国拟将14项关键技术列入出口管制清单 商务部回应
  2. 70个python毕设项目_10 个最值得 Python 新人练手的有趣项目
  3. Python 基本数据类型、运算符
  4. String 与StringBuilder
  5. Python 学习之列表
  6. ssh excel 导入 mysql_ssh poi解析excel并将数据存入数据库
  7. LeetCode 552. 学生出勤记录 II(动态规划)
  8. 关于Request.ServerVariables(HTTP_REFERER)
  9. 基于Java人机对弈系统_基于JAVA的中国象棋对弈系统(附答辩记录)
  10. 计算机网络中报文摘要概念,报文摘要详细介绍
  11. android捕获全局异常lin,全局获取 (Activity)Context,实现全局弹出 Dialog
  12. android音乐同步到iphone,安卓手机上的音乐还能转移到iPhone,你信不信
  13. python 四维数据怎么看性别_四维b超数据怎么看性别
  14. 【CRH】列车通过曲线时,曲线半径、超高值与车速的关系
  15. 创客路上,跟着嘻多猴快乐出发!
  16. 《黑客攻防技术宝典:Web实战篇》习题答案(三)
  17. iPhone或iPad如何在App Store(苹果应用商店)下载不同国家地区(如美区)的app
  18. 美国最严技术出口管制发布,封锁算法芯片量子计算技术
  19. JavaScript内置方法-Date对象
  20. 串连字符串strcat

热门文章

  1. 一些好的Android开源项目
  2. Jest测试入门到使用
  3. 关于Vue组件无法正常显示问题
  4. 【阅世界】20张赤裸裸的人性图,你敢看吗?
  5. 司法考试常用法律术语
  6. Python中拼音库PyPinyin的使用
  7. 阿里高级技术专家宋意:平凡人在阿里十年的成长之旅
  8. Mybatis学习文档——(狂神说系列)
  9. Eslint 的使用之微信小程序
  10. 大型软件是否占用计算机内存,电脑系统开机内存占用多少正常