你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的半主机机制

[复制链接]
flyingstar 发布时间:2025-8-6 14:47
半主机机制的作用
$ S3 {7 ?8 t# u4 I% u: D1 \, z
    半主机是用于ARM目标的一种机制,可将来自STM32单片机应用程序的输入输出请求传送至运行仿真器的PC主机。使用此机制可以启用C库中的函数,如printf()和scanf(),来使用PC主机的屏幕和键盘。这样就可以看到单片机的输入输出,方便进行调试。注意:这种机制的运行需要仿真器,否则无法运行。

' X& x# Y, j" R7 q& }) q* p0 T* Y
    简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。

+ L) V- C1 o3 J5 D# E2 T
    开发时单片机需要独立运行,开发者就应该去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口。
3 L) E+ ]. [. `- i( z: W
非半主机机制下printf函数的实现方法
; ^* X# t7 E! \, {
Use MicroLIB(微库)

, r! K' e; n: }$ n
    因为使用微库的话,不会使用半主机模式。
5 j* g; j/ Q! H0 o7 ~
    如下图,在点开MDK软件的魔术棒,勾选Target选项卡中的“Use MicroLIB”。这样就可以使用printf()函数,通过USART输出数据到电脑串口助手。相关推荐:STM32打印数据到串口助手。
' v" {/ w8 H) j
640.png
9 o4 m( I9 r3 I( i1 K9 Z2 t
7 h& x  O/ h, u' m' I: ]) w7 y; P
在主程序中添加代码

7 J% Y+ p* i) s, l$ B
    不使用Use MicroLIB(微库),就要在工程中加入以下代码, 以支持printf函数 。代码是写在USART的初始化文件中,记得修改USARTx,换成你要输出的USART端口号。
! ~  S4 d; `- g, y' u
7 H/ j9 x: Z6 F$ X
/****************************************************************************** ( }, D1 f$ A; F& X' J8 j7 j
* 【功  能】 printf函数重定向支持代码
% }) e: d, L: t2 m% r' S5 D9 `*           加入以下代码, 使用printf函数时, 不再需要选择use MicroLIB    # j) S8 H, ^% D7 `8 l
* 参  数:
2 g2 p, n: ~# t' W9 V* 返回值:' W* j* o7 m+ m& ?1 J1 U. r6 R9 p
******************************************************************************/  
4 [7 P0 m) T- j. C/ @; ^" X#pragma import(__use_no_semihosting)     //为确保没有从C库链接使用半主机的函数        7 B, V+ U$ ^0 b2 `
struct __FILE       { int handle; };     // 标准库需要的支持函数
3 B$ @- j6 c: aFILE __stdout;                           // FILE 在stdio.h文件4 V: ?2 c  E2 g+ f0 G3 z
void _sys_exit(int x)                    // 定义_sys_exit()以避免使用半主机模式
9 N: G( x# S- G9 L4 H$ p0 h{  x = x; }      
9 [0 N) z- ]1 G1 A  
" Z1 ^  y0 j2 h3 }2 r- Oint fputc(int ch, FILE *f)               // 重定向fputc函数,使printf的输出,由fputc输出到UART,  这里使用串口1(USART1)9 _% o5 l4 h8 I+ ~
{+ [( O; }* V" z1 @
       //if(xFlag.PrintfOK == 0) return 0;  // 判断USART是否已配置,防止在配置前调用printf被卡死
: s; |6 T6 I: s3 @( _0 `
/ ?0 |' V; E7 L+ f    while((USARTx ->SR&0X40)==0);        // 等待上一次串口数据发送完成
' Y  n7 f/ ?9 k3 a3 @6 q    USARTx ->DR = (u8) ch;                 // 写DR,串口1将发送数据9 \7 K, y4 b, z5 Y( l" C
      return ch;
9 I: C, A/ I* M8 A2 m}' A  ]+ \$ y: I( u/ W$ V
4 x7 A9 C" c. B; C8 r
: k6 a) H, y7 f7 `; d

9 {- `0 K# ?5 D' D, r% W5 h
3 k6 g' b% d& v4 h4 Q

! G% F% I& j6 X5 N3 l- J+ i& g- ]( q. {, p6 ]6 Q. k

1 |6 D% m: q  g# e$ ?  i# _& ^# E2 \' `6 e9 p% p
  D) X* z6 y: a5 }$ a( l
5 D8 ]! B5 J! [% m' P- C
4 Y# d; Z) }- ^/ V
. `. }* Q- A$ x; R5 F& A+ t0 `

/ ~3 f6 [9 l+ y( j
; B" ~, T( p, r
' r# S/ N" M( }$ P% s9 t$ S- D
赞 收藏 评论0 发布时间:2025-8-6 14:47

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版