半主机机制的作用 半主机是用于ARM目标的一种机制,可将来自STM32单片机应用程序的输入输出请求传送至运行仿真器的PC主机。使用此机制可以启用C库中的函数,如printf()和scanf(),来使用PC主机的屏幕和键盘。这样就可以看到单片机的输入输出,方便进行调试。注意:种机制的运行需要仿真器,否则无法运行。 简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。 开发时单片机需要独立运行,开发者就应该去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口。 非半主机机制下printf函数的实现方法 Use MicroLIB(微库) 因为使用微库的话,不会使用半主机模式。 如下图,在点开MDK软件的魔术棒,勾选Target选项卡中的“Use MicroLIB”。这样就可以使用printf()函数,通过USART输出数据到电脑串口助手。 在主程序中添加代码 不使用Use MicroLIB(微库),就要在工程中加入以下代码, 以支持printf函数 。代码是写在USART的初始化文件中,记得修改USARTx,换成你要输出的USART端口号。 - /******************************************************************************, B8 i W% ~+ Z5 V5 O X/ M
- * 【功 能】 printf函数重定向支持代码
1 x8 A$ R- ~# t# G/ I' Q - * 加入以下代码, 使用printf函数时, 不再需要选择use MicroLIB
0 f! w6 |0 m$ n+ _* ]' L; r4 q - * 参 数:* I* ` T% q) b1 [" D, R2 m
- * 返回值:; b5 j+ A' i6 r8 |* L! ], R- o4 M
- ******************************************************************************/ 8 W2 H& b+ a/ l
- #pragma import(__use_no_semihosting) //为确保没有从C库链接使用半主机的函数 # b* c' b& U' R( b8 n
- struct __FILE { int handle; }; // 标准库需要的支持函数9 }/ u- q8 Q- k6 k0 `
- FILE __stdout; // FILE 在stdio.h文件6 V1 y, u, c' G0 H$ X/ r% p1 h+ w
- void _sys_exit(int x) // 定义_sys_exit()以避免使用半主机模式! f/ ~' _% e- w C/ X& G
- { x = x; }
# d# X1 n, z5 l) H3 q - . K+ x; T% _! [4 S$ Z4 U! M1 Y
- int fputc(int ch, FILE *f) // 重定向fputc函数,使printf的输出,由fputc输出到UART, 这里使用串口1(USART1)
1 [0 D0 Y/ A+ b3 @4 ^* r - { ! s2 J( X$ Q, N0 D6 S6 G
- //if(xFlag.PrintfOK == 0) return 0; // 判断USART是否已配置,防止在配置前调用printf被卡死8 D% |' Z) F$ n
; O" `2 i; v2 o% \8 h- while((USARTx ->SR&0X40)==0); // 等待上一次串口数据发送完成
: r9 P d& y( B+ n h% W2 m - USARTx ->DR = (u8) ch; // 写DR,串口1将发送数据 ! W. b5 R& Y* ~# S
- return ch;+ ]) \# f; z4 o- v, E
- }
复制代码 ' C/ y- i# n4 R" H* `# B0 L$ A1 w
文章出处: STM32嵌入式开发 * H, [6 N; u \( H. L: V$ }% G
|