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

【STM8-SO8-DISCO】——8、测试 UART1_Printf

[复制链接]
七哥 发布时间:2019-3-2 02:26
本帖最后由 toofree 于 2019-3-2 02:35 编辑
' O1 o; @5 B. I6 @) l& D4 L% }# T8 h# p5 W6 g! r  @
【STM8-SO8-DISCO】——8、测试 UART1_Printf

  M) K0 y: J& V2 y2 h  本贴测试STM8S001J3M3的串口打印。
8 N! D# h" [! @! m" ^
  本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。# U1 |( r( c/ x! }3 p) o
21.jpg ; p- l0 B% v2 U- \/ V
7 J$ e" f4 Z  Q" M1 J& ^. j
  复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。
) }) o8 N; n% ^. j, D% V 22.jpg
" ~% b7 J7 ?7 q$ M" v6 X2 b+ W! Z  k/ \9 P7 B" y: v
  复制上电复位后延时5S的汇编程序1 I3 v' I/ A$ b$ I4 N
31.jpg
$ V0 T- a8 Y. z# _7 E4 f, x6 K  c, s6 M! v9 B1 x  K$ n
  在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。, u. k: D$ I% Y5 Q  V/ ^
  接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。4 a5 ?: e6 c( G( Q' b, Y; z* m
  完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。
  }4 ~6 L8 j5 N" ^0 U4 l  初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。6 f3 {( @2 u' F
32.jpg
3 Z2 j) P# ?3 X. g1 t# P3 P: {- L7 `1 {# Q3 j
  对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层
. H- A9 l3 O$ v 33.jpg   p; e/ u4 s! w* F& K
* ]: H4 ]4 k8 [2 K
  用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用; m/ \. G6 V$ G% z6 Y0 z9 }( V
01.jpg
% w3 m" a; C1 `: T2 [/ C- Y8 c8 Y' y" Y
  经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。
! F( S7 D; u% f: q/ L0 i3 Q 02.jpg
4 V" E5 R- D& D+ G  }) b) Q2 `% x0 q$ W) p5 y- r, y4 Q; z/ Y& H" s
  数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。1 ~! Y% T- B& H% A
11.jpg
* s6 G& A2 v+ k, o  [; f4 C; E' S: H# W8 l4 P7 C  w
  带方括号的为重映射复用功能管脚。& L5 v0 Y; ?+ h: i
12.jpg * o+ M9 m( y  l1 }, a8 _7 F
$ F' u! l- z+ M( X2 B) T; s, `
  不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。# X( w! B+ A! e; `
13.jpg
0 g* v4 |: [! a2 ]* K" l6 F
6 @/ k3 B1 D* e" ^" _. v% S- K
  AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。: b8 e5 Z% f' r! a- B
14.jpg 3 [* o4 z0 Y% r6 R7 y# o! Q! A$ n
  总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。/ R9 g" }) z2 a& i/ p$ f

* W2 ]( F6 y, I" |# _# k
  综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。" [9 [0 h! C- K; S- Y+ R" S6 t
41.jpg
* ~+ l$ Y, p) L5 F. J$ h- ]8 q( G' `
( C( n& |8 w- h; B% V! `  实验连线如下图。0 X! S$ w  V. x  e; P+ U4 K9 `/ ~
42.jpg
& M- G8 b1 F8 D6 c  i2 W2 @% R& C+ b# e& y# w- h, d- Y
  编译,下载程序,并全速运行。
- s. q; h( {  W/ n& E  实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。2 {" g8 J5 o! N8 G" I
42.jpg $ B4 f8 B2 B9 d, J7 d9 w
/ y! w5 U; i0 E* P7 d
  本贴测试工程附上:+ b4 G  \& H% ~% L, @5 i  M
   STM8S_StdPeriph_UART1_Printf.rar (260.1 KB, 下载次数: 26)
收藏 评论11 发布时间:2019-3-2 02:26

举报

11个回答
七哥 最优答案 回答时间:2019-3-2 03:23:26
本帖最后由 toofree 于 2019-3-2 15:11 编辑
) g& o5 j  _3 D% C; s/ ?. y
% W2 u7 T# f/ _3 p+ {9 ~' a9 L) n$ R9 ?' Y
直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。5 s! c1 ^5 v7 l( x& m
61.jpg ) H& j0 T3 W1 {5 p1 `1 b

: Q$ A8 d1 T! c) ?  V4 q+ \在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。
0 M3 K1 v: R" }# u  j% ^5 D9 T 62.jpg
, U" H, w. v8 I$ [! o+ S3 O* l7 _, b5 _1 T; C" M
修改成“samll”级别,编译生成的目标程序就会小很多。
7 ^! i  S3 z$ N, |+ i 63.jpg
/ Y% J8 B# W# X$ L$ N
! ]- S  t; s% j; h0 i/ C1 h在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。
% o6 B" |8 Q# p) Y! O. j$ B6 C 64.jpg 6 N; S, z7 ^3 k) Q
# H% D# r6 D, K. Y
2 X/ R+ \1 }1 {) y9 J, z

& f# b- t! A& I. K9 ^- \
: M8 v+ K2 n/ k: {( `
七哥 最优答案 回答时间:2019-3-10 14:21:14
本帖最后由 toofree 于 2019-3-10 14:22 编辑 3 D6 C% e7 c- j' b- L
- c1 c' @- p  K) J9 e
补充一下:% Y" l$ a* _% n- b
程序中应该添加一条 #include <stdio.h>
2 ~4 L* p0 s  `( a# u  f5 s否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
jeffhe1 回答时间:2019-3-4 08:57:22
真是好詳細
七哥 回答时间:2019-3-4 09:17:11
jeffhe1 发表于 2019-3-4 08:57
$ s& F5 L2 w, E3 r% {真是好詳細

: W, K, P$ e# N0 ]多谢捧场
legenderw 回答时间:2019-3-10 12:29:01
不错,stm8下比较省心
xiaoys 回答时间:2019-3-10 16:00:39
楼主有没有试一试stm8l001j3的UART1呀?) t* b# _/ A' ~4 z2 p7 X
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了
, X* }% S1 ?2 s' ^! Q期待ing~~" V& u2 \* a6 U5 F
长春的风 回答时间:2019-3-10 16:43:40
大牛啊!
七哥 回答时间:2019-3-11 00:42:59
winddancer7 发表于 2019-3-10 16:000 D9 i/ v  W" P5 b
楼主有没有试一试stm8l001j3的UART1呀?/ u4 e3 ~- ]6 z+ N# v2 }
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方 ...

: E" k! [) n6 X1 n1 M让你说得,我都不敢试了
hanzo852 回答时间:2019-6-5 06:30:10
我的stm8L001也是,enable串口时钟就卡着不动,tim4也工作不正常。只有led能点亮。
qytcs 回答时间:2019-6-10 10:39:40
楼主有STM8S001的eeprom的例程吗
七哥 回答时间:2019-6-10 10:44:28
qytcs 发表于 2019-6-10 10:391 J" r0 t. Y' [% O: y! X
楼主有STM8S001的eeprom的例程吗
2 \( |2 U" x, Q  y( n6 h* j1 {/ J
你找找看呗,念在你第一次在社区发贴,破例回复一次你这样的问题。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版