|
半主机机制的作用 半主机是用于ARM目标的一种机制,可将来自STM32单片机应用程序的输入输出请求传送至运行仿真器的PC主机。使用此机制可以启用C库中的函数,如printf()和scanf(),来使用PC主机的屏幕和键盘。这样就可以看到单片机的输入输出,方便进行调试。注意:种机制的运行需要仿真器,否则无法运行。 简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。 开发时单片机需要独立运行,开发者就应该去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口。 非半主机机制下printf函数的实现方法 Use MicroLIB(微库) 因为使用微库的话,不会使用半主机模式。 如下图,在点开MDK软件的魔术棒,勾选Target选项卡中的“Use MicroLIB”。这样就可以使用printf()函数,通过USART输出数据到电脑串口助手。 在主程序中添加代码 不使用Use MicroLIB(微库),就要在工程中加入以下代码, 以支持printf函数 。代码是写在USART的初始化文件中,记得修改USARTx,换成你要输出的USART端口号。 - /******************************************************************************0 z9 j0 k1 Z7 W& G
- * 【功 能】 printf函数重定向支持代码
/ J% }3 ^0 r; u8 t, m# v4 ^ M# R0 M - * 加入以下代码, 使用printf函数时, 不再需要选择use MicroLIB & v" Q8 b5 ]. [) f3 R9 ~' r
- * 参 数:
9 u9 |; _( i U' r" e: i, { - * 返回值:3 |0 O( p g8 x4 h
- ******************************************************************************/ 7 a1 W3 V8 {, u: _( @
- #pragma import(__use_no_semihosting) //为确保没有从C库链接使用半主机的函数
! P" R( o( ]. N8 x' b, `/ B - struct __FILE { int handle; }; // 标准库需要的支持函数
$ Z+ U% ~1 t' e7 @$ y9 T$ I9 C - FILE __stdout; // FILE 在stdio.h文件1 C1 M" Q# F% Y2 S% f
- void _sys_exit(int x) // 定义_sys_exit()以避免使用半主机模式5 C; O- d, j) Z* O" |5 S
- { x = x; }
6 \8 q! @% @ ]+ ~6 @$ z
3 Q/ Y# c( [! n1 Q: _1 ~- int fputc(int ch, FILE *f) // 重定向fputc函数,使printf的输出,由fputc输出到UART, 这里使用串口1(USART1)
8 W$ V& V5 \0 V8 y/ A) ]8 g - {
) \% W' `; B0 I4 h% e' I. G# f - //if(xFlag.PrintfOK == 0) return 0; // 判断USART是否已配置,防止在配置前调用printf被卡死1 U4 b& L" p$ V- h
1 Y: p- U: g6 [0 a8 @6 e6 c- while((USARTx ->SR&0X40)==0); // 等待上一次串口数据发送完成 ( o7 J* ?) n2 M# \0 l4 e
- USARTx ->DR = (u8) ch; // 写DR,串口1将发送数据 & ^6 F7 B; B+ D$ V' G& D% B! n. h
- return ch;$ g0 Y6 I" E' K. ?( t5 I# n* |0 R
- }
复制代码
' g3 Y+ h: d( d5 P文章出处: STM32嵌入式开发 4 y2 [2 j& e4 v1 |6 S k% t1 P8 z
|