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

在MDK-ARM5.17对STM32的USART1进行软件仿真时串口界面收不到数据

[复制链接]
吐息间丶时光中 发布时间:2017-2-14 16:34
本帖最后由 吐息间丶时光中 于 2017-2-21 00:01 编辑 . w- ?" t3 ?# U# f0 D

; _7 C' O( i2 I+ @* @1 S: V+ {小白是STM32初学者,遇到的一些问题在大神们面前太小儿科,还请大神不吝赐教
. @$ [/ D7 m3 H8 g/ J' o- H; g# r! L  f: P2 r1 {& u  Q8 q
【问题一:TE置位自动发送一个空闲帧】( l& q5 U9 u. y3 ?0 o9 m
    前几天看刘凯老师的STM32培训视频第18集学习USART这一模块,在MDK-ARM5.17上进行软件仿真过程遇到一个坎硬是过不去:按照参考手册配置完寄存器后,软件仿真调试时(无论是单步一条一条的运行程序,还是全速运行程序),TXE一直处于低电平(
也就导致串口窗口收不到数据)# b/ H( H( ]4 w' F3 L
    代码如下(与刘凯老师视频上的一致):

+ W' T* T7 @' x
  1. #include"stm32f10x.h"
    , f& x' I4 @% [- S% W3 b

  2. . e0 x, N3 `* z( _2 C
  3. #define RCC_APB2ENR_Addr        (RCC_BASE + 0x18)( k% E' t* N% {0 ~
  4. * k9 ~$ N/ k6 ?+ b+ v. \
  5. #define BitBind(Addr,BitNum)        *((__IO uint32_t *)((Addr&0xF0000000)+ 0x2000000 +\1 p: A' _) Z+ j9 Y/ A
  6.                                                                 ((Addr&0x000FFFFF)<<5)+ (BitNum<<2)))
    " L; d% d! N- p* y: X0 V
  7. " w* I* [% e( d
  8. #define RCC_APB2ENR(n)        BitBind(RCC_APB2ENR_Addr,n)
    # a8 G. z0 z& D* @

  9. : h! ?" ~9 f* R5 q7 m& D
  10. /**********************************************************************
    6 W: R7 s8 q9 \) i$ A
  11. * Function Name : MAIN/ g5 T# n9 g3 R0 j. `# l+ C/ w
  12. * Description         : main program
    # K) i) Z% z. q
  13. * Input                 : None: L- d1 z0 p* a
  14. * Output                 : None
    - Y  G; t/ E! c% k- j
  15. * Return                 : None6 j* p( @# t) Q, B% X: L; l
  16. **********************************************************************/
    . f' u4 w7 U# g% M% e& R
  17. int main(void)( P9 V! M& [, X8 w
  18. {/***UART寄存器方式编程***/8 C- D) }9 S- v; y/ E- K) x" f+ g
  19.         uint32_t BAUD=9600;                                //波特率9600bps$ s& x' T' S6 j0 [9 g
  20.         uint16_t DIV_Mantissa=0x00,DIV_Fraction=0x00;        //未经显示初始化的自动变量的值为未定义值(外部变量与静态变量将被初始化为0)  q! v5 W, X% j+ t" i8 X
  21.         float USARTDIV=0.0;                                //浮点型(如果单精度能解决,尽量用单精度,双精度算术运算特别费时)
    0 p1 x3 r8 ^2 l! |8 C$ `: D
  22.         
    # S5 T& P" o% M
  23.         //寄存器配置:USART使能、字长、停止位、波特率、发送使能
    " g9 U, ?8 a( Z
  24.         RCC_APB2ENR(14)=1;                                //USART1时钟使能
    + c+ f" K( w- c$ O6 l1 p' e1 e
  25. //        RCC_APB2ENR(2)=1;                                //GPIOA时钟使能(软件仿真不开启无影响); g5 @4 p5 @2 B7 W( c: z
  26. //        GPIOA->CRH |= (3<<4);                        //软件仿真选择通用推挽输出也有效果(但不建议)7 I' O; W1 ?8 r' b
  27.         GPIOA->CRH |= (11<<4);                        //PA9复用功能推挽输出(最大速度50MHz)【注意:此时实际是复用功能开漏输出模式】,PA10默认浮空输入模式6 x' L4 J/ E1 H8 x& S" b
  28.         GPIOA->CRH &= ~(1<<6);                        //PA9复用功能推挽输出(最大速度50MHz)
    " N' [# N5 c- s& x: G: v: E0 \, U
  29.         
    : A& f( y. ~" U' X$ z4 I; c
  30.         USART1->CR1 |= (1<<13);                        //USART使能2 a/ b" E7 G& M* a* @$ j
  31.         USART1->CR1 &= ~(1<<12);                //1个起始位、8个数据位
    8 z0 G- m/ d  `  J
  32.         USART1->CR1 &= ~(1<<10);                //禁止校验0 A4 Z8 Z  B9 x' J- g
  33.         USART1->CR2 &= ~(7<<11);                //1个停止位、禁止CK引脚(即异步)
    3 J* ]& J. I6 k; \3 l/ B
  34.         //波特率算法2 G1 [5 H6 a5 D) |- t
  35.         USARTDIV = (72000000)/(16.0*BAUD);                                //注:整数除法会截掉右边的小数部分" [& H) s$ D2 X% d& y
  36.         DIV_Mantissa = USARTDIV;                                                //取整! d0 l9 \3 y* B6 a% a$ x
  37.         DIV_Fraction = (USARTDIV-DIV_Mantissa)*16+0.5;        //小数部分四舍五入并取整
    4 f! s* J7 T6 \% I/ @
  38.         USART1->BRR = (DIV_Mantissa<<4)+DIV_Fraction;        //也即:USART1->BRR = 0x1D4C;                  u& J+ ]4 @* J( H6 B4 q) Q. N
  39. 0 |' ?, l0 }+ h
  40.         USART1->CR1 |= (1<<3);                        //发送使能0 _0 p! w5 [: n0 v- T
  41.         USART1->DR  = 0x66;                                //注意:DR只有9位有效位(调试时,串口窗口选择Mixed HEX ASCII Mode——混合十六进制和ASCII模式)
      t2 `8 L% T- l& ?2 g2 {9 y/ j
  42.         " s2 L& P" d2 @  x* |9 k; h- k6 @- U
  43.         return 0;% @) ~1 `6 s5 |: U7 Y1 w
  44. }- ~( x! |2 Q0 f9 j( B, K
复制代码
调试界面:
; ]# D' i8 Z1 x2 f$ k 1.png
6 f1 ]0 F! u: \( i) ~" z! ]$ Y- J. r, B8 ^3 W$ P) |$ ?
    起初以为是寄存器配置出错,所以把参考手册相关章节又看了一遍,后来发现并没有配置失误,于是又去查看了固件库里的USART配置函数,发现与自己的配置确实无异,就这样来来去去地鼓捣了两天……后来,在某一次调试时,小白将那全速运行按钮点了两次,奇迹出现——数据显示出来了!
! r& F" [$ a, O    那么问题是出现在这吗——因为刘凯老师视频里用的Keil版本是Ver4,而我的是Ver5,所以不同?而且网上也有很多吐槽Ver5有很多bug。怀着这种心态,刚开始那会小白也相信是这样。但小白的性格有点追求小小的完美,于是对自己刚发现的持半信半疑的态度,打算再看一看参考手册……或许是功夫不负有心人吧(实际是自己总是看视频,动脑太少),最终总算有了一个较满意的发现:将上面代码中的以下两句
5 |' ]( {+ Q) y2 Y# d- C' i
  1. USART1->CR1 |= (1<<3);                        //发送使能9 R" _' I& ~- |- X0 Q7 ]3 Q
  2.         USART1->DR  = 0x66;                                //注意:DR只有9位有效位(调试时,串口窗口选择Mixed HEX ASCII Mode——混合十六进制和ASCII模式)
复制代码
进行如下更改6 Q- D, h/ w+ _+ f
  1. USART1->CR1 |= (1<<3);                                                        //发送使能
    2 I' q- s* r* l0 g9 T: Z3 O
  2.         while((USART1->SR & 0x40) != 0x40);                                //置位TE将使得USART在第一个数据帧前发送一空闲帧
    8 O6 _- S" X- P0 T
  3.         USART1->DR  = 0x66;                                //注意:DR只有9位有效位(调试时,串口窗口选择Mixed HEX ASCII Mode——混合十六进制和ASCII模式)" \. y( ]6 J% p" p$ q* n
  4.         while((USART1->SR & 0x40) != 0x40);
    2 x; d* K" e% ~: D! m' V
  5.         USART1->CR1 &= ~(1<<3);                        //发送失能
复制代码
   经过以上更改后,再次在MDK-ARM5.17里进行软件仿真时,仅点击一次全速运行即可完成任务。如果是点击单步运行,仅在语句“while((USART1->SR & 0x40) != 0x40);”处单步一次无法单步到下一条语句(应该是MDK仿真发送完一个数据设定有一定的时间段),此处可以将光标定位在下一条语句后点击调试按钮“Run to Cursor Line”(Ctrl+F10)即可。
; K0 H; c" \! `9 ~/ h/ t
, Z& Q' I6 m4 e6 N! R更正后的完整代码如下:

- d. P4 |! D6 R" Z0 X
  1. #include"stm32f10x.h"* g; b' I" h$ @# w  {
  2. ) y. F" a8 \! A0 ?
  3. #define RCC_APB2ENR_Addr        (RCC_BASE + 0x18)' e1 s/ z. `' Z1 t* g1 G% F
  4. 8 |0 }8 f) ]& p' e7 v, G5 c  d9 `8 S
  5. #define BitBind(Addr,BitNum)        *((__IO uint32_t *)((Addr&0xF0000000)+ 0x2000000 +\' f3 D9 }4 M6 M; h
  6.                                                                 ((Addr&0x000FFFFF)<<5)+ (BitNum<<2))), S4 M! J, Z: g

  7. ' {5 J/ }/ |8 Q, N6 F2 N% r
  8. #define RCC_APB2ENR(n)        BitBind(RCC_APB2ENR_Addr,n)
    % S+ h$ j3 D! Z! F
  9. 0 h; o, d4 Y* K) K. a# f/ |
  10. /**********************************************************************
    0 S/ k1 ?# L0 b' v  C# @
  11. * Function Name : MAIN
    + W. j- v; H+ {) @
  12. * Description         : main program! b- h* F$ T& B5 {
  13. * Input                 : None
    / t1 d+ |3 y- p% |/ g8 R
  14. * Output                 : None
    ( ]: P0 P- F9 |! D" v$ I
  15. * Return                 : None4 q6 I/ ~0 v9 y! P& s# j
  16. **********************************************************************/
    / Q& F/ T: c: x% h5 C: U- B4 S
  17. int main(void)4 ~) r( }& F3 h4 a/ T0 t
  18. {/***UART寄存器方式编程***/; P* q4 K4 Z9 g2 w/ V, u. p$ u
  19.         uint32_t BAUD=9600;                                //波特率9600bps
    + n9 {- G" J2 @# Z: B/ Q. l
  20.         uint16_t DIV_Mantissa=0x00,DIV_Fraction=0x00;        //未经显示初始化的自动变量的值为未定义值(外部变量与静态变量将被初始化为0)6 ~0 A& A8 [5 j+ @; l! [$ R
  21.         float USARTDIV=0.0;                                //浮点型(如果单精度能解决,尽量用单精度,双精度算术运算特别费时)
    $ e( p. C  x3 T. w
  22.         
    % K( @4 Q- D" @) P5 z
  23.         //寄存器配置:USART使能、字长、停止位、波特率、发送使能. ~; e6 L% {. U* t, ?9 p) h; e# R) q! v
  24.         RCC_APB2ENR(14)=1;                                //USART1时钟使能( L2 R, X; I2 F- u$ ?* N- z
  25. //        RCC_APB2ENR(2)=1;                                //GPIOA时钟使能(软件仿真不开启无影响). J1 y" S% F1 o7 O6 ]. H
  26. //        GPIOA->CRH |= (3<<4);                        //软件仿真选择通用推挽输出也有效果(但不建议)
    6 {% L. [% x8 o0 `3 {" }
  27.         GPIOA->CRH |= (11<<4);                        //PA9复用功能推挽输出(最大速度50MHz)【注意:此时实际是复用功能开漏输出模式】,PA10默认浮空输入模式: H, V4 k9 @3 D; B( T, j8 m& u5 L
  28.         GPIOA->CRH &= ~(1<<6);                        //PA9复用功能推挽输出(最大速度50MHz)
    2 ^+ j8 N: L& I: X
  29.         ) J) K( t; F* {% U  q
  30.         USART1->CR1 |= (1<<13);                        //USART使能
    * T" `' v' i* E
  31.         USART1->CR1 &= ~(1<<12);                //1个起始位、8个数据位
    6 M" b3 W+ K, [! S8 r. f2 k8 u
  32.         USART1->CR1 &= ~(1<<10);                //禁止校验
    6 U: |5 q( f7 V" Q( Q
  33.         USART1->CR2 &= ~(7<<11);                //1个停止位、禁止CK引脚(即异步)" U( H; y. l0 H: J: I: r9 }/ t  f: O; X
  34.         //波特率算法1 D% z0 y" g7 v) ^6 @' E' J
  35.         USARTDIV = (72000000)/(16.0*BAUD);                                //注:整数除法会截掉右边的小数部分: q& \7 R: h, @9 l, K: G" {$ _
  36.         DIV_Mantissa = USARTDIV;                                                //取整% A* g: X; C$ u* L/ O( }# [2 J  J4 L
  37.         DIV_Fraction = (USARTDIV-DIV_Mantissa)*16+0.5;        //小数部分四舍五入并取整
    ; P& e; g5 l% v9 I
  38.         USART1->BRR = (DIV_Mantissa<<4)+DIV_Fraction;        //也即:USART1->BRR = 0x1D4C;               
    4 E  _2 D- p# I2 Y1 M

  39. / R/ L: w4 F' _& T% J/ q) c1 j, u6 q
  40.         USART1->CR1 |= (1<<3);                                                        //发送使能
    ( [1 v5 w: m" Y3 ]2 z; _
  41.         while((USART1->SR & 0x40) != 0x40);                                //置位TE将使得USART在第一个数据帧前发送一空闲帧' o9 s8 z' {' J0 y0 u
  42.         USART1->DR  = 0x66;                                //注意:DR只有9位有效位(调试时,串口窗口选择Mixed HEX ASCII Mode——混合十六进制和ASCII模式)
    , L% G4 z/ y6 q9 C- @! u4 G" C/ @
  43.         while((USART1->SR & 0x40) != 0x40);+ n1 J: d! p& [" w
  44.         USART1->CR1 &= ~(1<<3);                        //发送失能! C3 N; Q  B# b
  45.         ) j" g4 |, z8 F; @* V) M( ]& ^
  46.         return 0;# O+ c6 ^; E3 B/ d( ]4 i9 e& Y' l
  47. }
    5 i( l2 S* [% u
复制代码
   问题的根源也就是置位TE将使得USART在第一个数据帧前发送一空闲帧(参考手册有说明。截图如下),由于版本不同导致MDK仿真发送完一个数据设定的时间段或许有所区别,所以在MDK-ARM5.17上缺少了以上检测语句就达不到刘凯老师视频上的调试效果。
  e+ R  o8 P) \2 {5 Y7 N2 o- u 2.png
# `, n) W3 p* x
3 Y) g3 c! B- U/ M" ]2 M1 T7 k8 T    同理,该视频刘凯老师给的第二个带有for语句的例子,也必须加上如上检测语句:" H7 O6 P: `; H
  1. #include"stm32f10x.h"& ]  g, c- d. V
  2. 3 u! k# Z( q2 q2 D( j
  3. #define RCC_APB2ENR_Addr        (RCC_BASE + 0x18)
    ; K0 X8 U& Z$ O, G* h& [4 l0 S

  4.   v1 m+ \; j0 u+ m$ f
  5. #define BitBind(Addr,BitNum)        *((__IO uint32_t *)((Addr&0xF0000000)+ 0x2000000 +\
    # D  ?" Y  O3 y( U1 {
  6.                                                                 ((Addr&0x000FFFFF)<<5)+ (BitNum<<2)))6 x5 O5 n5 [/ j% n7 P

  7. ( T6 v& c3 H" e, {" a* M
  8. #define RCC_APB2ENR(n)        BitBind(RCC_APB2ENR_Addr,n)0 m+ @3 `. Z6 w* o
  9. 6 @( `9 t) d/ h# @
  10. /**********************************************************************
    8 t( d" l9 b2 ^6 N
  11. * Function Name : MAIN7 z) t( Y9 I6 S% W. n6 E0 X+ |6 b
  12. * Description         : main program
    : R. s( m8 B. Y' v5 M! J$ r
  13. * Input                 : None
    $ A7 f& g! R' v; [+ a
  14. * Output                 : None* ~8 G. x! c& \/ u( J. A4 P( S
  15. * Return                 : None
    ; J& O9 g. ?8 {1 f
  16. **********************************************************************/
    2 Q( K% o: C9 b9 \! q
  17. int main(void)2 I$ `3 d+ N' [0 x, i& G: u: O7 [
  18. {/***UART寄存器方式编程***/, x2 D' c2 Q5 J* o- D& l9 W! ?
  19.         uint8_t num=0x00,data=0x00;
    : v; G1 w5 \3 U
  20.         uint32_t BAUD=9600;                                //波特率9600bps- T9 f0 A6 x7 u* L2 V
  21.         uint16_t DIV_Mantissa=0x00,DIV_Fraction=0x00;        //未经显示初始化的自动变量的值为未定义值(外部变量与静态变量将被初始化为0)
    . I% x0 T. ~  ?% W0 B+ Z: ~. ]
  22.         float USARTDIV=0.0;                                //浮点型(如果单精度能解决,尽量用单精度,双精度算术运算特别费时)
    ( k% O% N2 C0 h4 v/ S8 B
  23.         
    0 ^  B! W0 R* r" H: h
  24.         //寄存器配置:USART使能、字长、停止位、波特率、发送使能) q$ ]+ J  x: P
  25.         RCC_APB2ENR(14)=1;                                //USART1时钟使能& f7 X. Q5 l8 ]& x9 \
  26. //        RCC_APB2ENR(2)=1;                                //GPIOA时钟使能(软件仿真不开启无影响)
    / I: g6 W6 R7 J) I3 s, \: _% V
  27. //        GPIOA->CRH |= (3<<4);                        //软件仿真选择通用推挽输出也有效果(但不建议)
    2 X5 X' I( [1 S" X0 W: q7 W
  28.         GPIOA->CRH |= (11<<4);                        //PA9复用功能推挽输出(最大速度50MHz)【注意:此时实际是复用功能开漏输出模式】,PA10默认浮空输入模式; c: r: P+ S" P: i" V
  29.         GPIOA->CRH &= ~(1<<6);                        //PA9复用功能推挽输出(最大速度50MHz), Y3 @% ^( k; `4 h
  30.         " \; O* L: [& ]1 g8 N! k/ B
  31.         USART1->CR1 |= (1<<13);                        //USART使能. r2 P8 @* Z6 x. T
  32.         USART1->CR1 &= ~(1<<12);                //1个起始位、8个数据位5 y' K, e8 k6 Q1 U' k1 @
  33.         USART1->CR1 &= ~(1<<10);                //禁止校验* J, @# J6 l& s' J6 p
  34.         USART1->CR2 &= ~(7<<11);                //1个停止位、禁止CK引脚(即异步)
    2 n; [  ?, Z* j) ~3 ~# y; Z' F  }
  35.         //波特率算法  q0 U! l" ~" }4 `
  36.         USARTDIV = (72000000)/(16.0*BAUD);                                //注:整数除法会截掉右边的小数部分4 y4 v* c7 o" Y
  37.         DIV_Mantissa = USARTDIV;                                                //取整4 z0 V! _  M# V/ e3 \- [+ L* y
  38.         DIV_Fraction = (USARTDIV-DIV_Mantissa)*16+0.5;        //小数部分四舍五入并取整
    & }1 s: _) k& B# U. V# X% u
  39.         USART1->BRR = (DIV_Mantissa<<4)+DIV_Fraction;        //也即:USART1->BRR = 0x1D4C;                & ?7 E" `  B. ^# M: S
  40. 7 z2 k* V( X3 q7 |, a9 d
  41.         data = '@';7 P& ?7 V7 y7 `" i9 T
  42.         USART1->CR1 |= (1<<3);                                                        //发送使能  j) `! }. l. I$ g+ E$ s0 \; _( I
  43.         while((USART1->SR & 0x40) != 0x40);                                //置位TE将使得USART在第一个数据帧前发送一空闲帧
    " Q; u' I& b& d
  44.         for( ; num < 64 ; num++)                                                //发送64个数据        40H~7FH(ASCII码表)+ J% _/ W, `7 c
  45.         {
    1 P+ j# g: V- T% W
  46.                 USART1->DR  = data;
    , l' n4 ~4 ]: @+ T; Y' ]
  47.                 while((USART1->SR & 0x40) != 0x40);( u! B7 }* `: Q! X6 K0 d& ^( R
  48.                 data++;
    % U: e' {1 H; u
  49.         }//跳出for循环时data为0x80; ^# D& g. @8 ?: Q2 S  ?
  50.         
    # O. j* A3 `" X% D
  51.         return 0;# o, I4 ]7 T2 a: |3 U9 H
  52. }
    8 P% T8 D: T3 |  T  M* ^" R  K
复制代码
   经过小白测试,如果不加将导致第二个数据“41H”无法发送。/ A# r0 w! m* B* m: C( C" Y$ a8 X
如下图所示:
+ B5 |: ^2 ^! H) p0 v
3.png 5 Q# G2 x" n5 k; V: \5 e" o

0 g+ @; s# m( j- O6 Z2 H! T6 m. Q/ R) m8 b6 y7 a' q
; d0 [0 H4 R4 k" ^" ?7 E$ a
【问题二:使用printf函数】
; E- z# B0 t, I3 l' M2 p    用fputc重定向stdio库的printf函数后:文件流→串口USART1。使用printf函数将数据输出,如果没有提前进行代码配置(关于如何配置各论坛上有类似贴),或者将下图的“USE MicroLIB”勾选:
( q4 O* D. X8 {! V2 ` 1.PNG

8 b! a: q0 w8 J% T0 i将导致:在Keil上进行软件仿真时,点击全速运行至少要点击三次(或者将光标定位在主函数里的某条语句,点击“Run to Cursor Line”也至少要点击三次);若是将程序烧进硬件跑,程序短时间未见能工作(未测试时间过久些是否会工作),串口助手收不到输出的数据。
# k4 L' @5 ?6 w7 Q
" r6 X2 z. B3 @+ D! A* C
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3 i( Y% z8 J& I/ ]

* U! o- G" j' Q# M1 n# ]  I    问题很简单,但困扰了小白好几天,写下来希望其他初学者遇到相同问题时有所参考。. e" J* b! \- B% v" M" Y
    32初学之路,还请各位大神大大多多指教。
& |. T3 Y! l: X6 }  u, }

' L. N  X' G  ^% S9 A------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
收藏 3 评论7 发布时间:2017-2-14 16:34

举报

7个回答
zoomdy 回答时间:2017-2-14 16:54:41
100块买块开发板,谁知道模拟器有什么幺蛾子在里头。
吐息间丶时光中 回答时间:2017-2-14 21:27:52
这个只是软件仿真,不涉及硬件哈。
吐息间丶时光中 回答时间:2017-2-15 18:54:25
今天尝试用固件库函数编程,最终结果仍证明:在MDK-ARM5.17上,必须要在使能TE位后,加上如下语句
' Y8 g4 A4 L7 ~# I
  1. while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));
    , N! [$ G$ ^& l  G
  2. 等价于寄存器方式编程中的:4 E, R% m- F( m, M
  3. while((USART1->SR & 0x40) != 0x40);
复制代码

/ [6 }6 v: C2 S7 s7 u  R
% I0 d7 I& G! H4 o! q+ `$ X8 r2 D7 @后面的发送才正常。
队长shiwo 回答时间:2017-2-16 08:48:26
谢谢分享 学习
吐息间丶时光中 回答时间:2017-2-17 11:44:22
队长shiwo 发表于 2017-2-16 08:48
0 {2 _1 [4 s( F谢谢分享 学习
4 A& H, E) u: F! z4 c6 ~8 M
初学过程,还请多赐教
j923187522 回答时间:2019-1-21 08:33:19
现在应该很厉害了吧 最近在弄lora通信 有没有弄过?想找人交流一下 其实就是串口通信
j923187522 回答时间:2019-1-21 08:38:52
对了 你这种软件仿真是怎么仿真USART的?我仿真不了的?

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版