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

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

[复制链接]
七哥 发布时间:2019-3-2 02:26
本帖最后由 toofree 于 2019-3-2 02:35 编辑
  r8 m- D  _8 w' F! \+ I) v  q$ L* ~/ a' g% A5 Q, T' L
【STM8-SO8-DISCO】——8、测试 UART1_Printf
2 h8 _! n2 V& D% Y
  本贴测试STM8S001J3M3的串口打印。* ^* c: M1 X8 b
  本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。0 N# ]+ O7 Q1 h% O& s( F1 [4 l. _( P
21.jpg
: i* p1 ^$ D0 B6 C- h) h  s# e9 v% w
  复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。9 [, M4 F, X- m7 |
22.jpg . n) m% k# l( O9 ?, ]6 {
. s( G' X( M- A- p, P+ O  o, H
  复制上电复位后延时5S的汇编程序0 \% g/ ^" m' X
31.jpg
; i9 K: `4 K4 t. {5 g; D5 X6 J& L
' D0 r% o+ |  f5 W  在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。
# q0 S5 H! N5 l6 b6 v/ k  接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。
2 L5 B: [/ f9 S* x; w  完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。
: ]1 A. ^6 Z* }. ^: y/ h$ I  初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。: z+ Y' v  x! f5 X, E
32.jpg
* e% v) l/ j2 `1 t+ ^6 B/ b4 C+ X2 p! l5 |" }4 v! q
  对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层
7 H( b: ]2 v1 i' C4 X6 o7 ? 33.jpg
& L. R. x7 q% v- D
3 q; @( B+ v, t4 E; u  l  用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用
6 F' v" k  A: _! s7 T 01.jpg
8 k0 j: u" W6 W, e" ]0 ^$ I$ @: ]& H8 M4 f/ A
  经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。( B) ~, L5 r6 Q, |- Q. c: K; X6 Z- g7 n
02.jpg 2 z  h+ d, X( r- g. L2 a

# D; w1 R6 e4 G# |( b9 \  数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。
: n9 e8 @/ V" ]; F" H. ]/ H3 p 11.jpg " j8 ?: c- @. h/ h% }& U$ i

7 U& [5 N) m, J$ M8 d5 R
  带方括号的为重映射复用功能管脚。
: J) s! o& S! O5 G! D$ O) L9 ?4 M 12.jpg ( F2 T4 T7 J) M

4 l. \3 S# o! [% ^7 {' g
  不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。& U0 {* W. P2 u! g
13.jpg ) T2 M9 n$ S+ W! L) D% }/ d7 \; K

, N# }" D8 d5 f5 i. l
  AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。' q$ \; K* N2 r0 t2 f: L' Y) X; G
14.jpg
9 z# m/ i8 m, a. T  总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。
0 {2 ^  h; ~7 F5 R3 L  ?- s1 y; _2 L+ u9 L4 @
  综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。
8 }' y/ B; i+ P' c 41.jpg $ m( ~8 l, h0 l8 n; a
4 y  U; r; ?2 X8 A' b1 Z
  实验连线如下图。6 b5 j5 G" Z' k. ]: Y6 o
42.jpg ) J, Z2 d& I- ^5 w7 D! u
2 y9 W2 [$ ?/ ~2 e8 j: w6 \: O
  编译,下载程序,并全速运行。5 X5 I) e4 x/ j, [) ^
  实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。
- W( K9 J7 ?" ^. i8 H 42.jpg
5 I/ s6 w2 Q/ d0 `4 a, D/ H
2 `$ M8 G6 J2 r# r  本贴测试工程附上:4 K1 M, r& a: U0 }
   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 编辑 8 P! ~( c1 h0 N( s% \. M! z; H/ ?

; X9 |. e6 ?. S/ q) K
. f% r! N9 w& B& t% }( Y直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。6 x: I* W- O% o1 h$ G
61.jpg
- X3 p4 T0 ~- p* l& B: n( `2 N3 [4 S$ ~! U+ C' `/ m9 m$ x1 X5 W
在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。
0 {9 x9 `; z9 w+ T/ n 62.jpg 8 z$ \8 @( Q, g% z" d0 Q6 d

2 R7 Z+ H# W. N4 U. Y4 T, O: k修改成“samll”级别,编译生成的目标程序就会小很多。
3 q2 v6 _% t( c7 a' K, |  f 63.jpg " s0 R; p1 r3 Q2 T3 _% _0 N

, P6 B8 \/ M6 Y! s. o' }在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。
, @$ H  f" k" F1 z6 ^1 i* v! _ 64.jpg
/ l8 \1 b& g2 N, Q+ G4 l  c1 b& k4 w3 _# I: W% ^

9 Z7 {; |  e: X/ f3 q% ?% I  X( v7 S. ^4 o! m. c
, f& O" _( o4 E! u& P
七哥 最优答案 回答时间:2019-3-10 14:21:14
本帖最后由 toofree 于 2019-3-10 14:22 编辑
2 B* r. I- ^7 A8 R
) w, ^6 Y& u, h$ x& F7 K补充一下:
2 y: ^% L1 \$ e( M" J' G程序中应该添加一条 #include <stdio.h># {) W% q' g9 J
否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
jeffhe1 回答时间:2019-3-4 08:57:22
真是好詳細
七哥 回答时间:2019-3-4 09:17:11
jeffhe1 发表于 2019-3-4 08:57
3 S8 ^: k9 |" X* D  \) S真是好詳細

- }+ e7 j  y: V# c* o多谢捧场
legenderw 回答时间:2019-3-10 12:29:01
不错,stm8下比较省心
xiaoys 回答时间:2019-3-10 16:00:39
楼主有没有试一试stm8l001j3的UART1呀?, @6 r" a* S# r8 v, V* P1 K
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了0 B2 q- J% \+ m' O$ b9 P1 r
期待ing~~
, C' s1 r% o, F6 b! x% b
长春的风 回答时间:2019-3-10 16:43:40
大牛啊!
七哥 回答时间:2019-3-11 00:42:59
winddancer7 发表于 2019-3-10 16:00
  Q$ m! D0 Q+ V楼主有没有试一试stm8l001j3的UART1呀?
( I/ P9 Y- i* |6 [) k我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方 ...

9 T+ D, G% ^, n- [" }0 u让你说得,我都不敢试了
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:39  j0 W, L& d7 M) m- w0 a
楼主有STM8S001的eeprom的例程吗
" ^% ~/ n4 |1 v6 B, P
你找找看呗,念在你第一次在社区发贴,破例回复一次你这样的问题。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版