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

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

[复制链接]
七哥 发布时间:2019-3-2 02:26
本帖最后由 toofree 于 2019-3-2 02:35 编辑
' C# X; e4 ?! U# n8 q3 r2 j, `' v* H" G1 w  }! l  d7 ^& O# G8 H% Q
【STM8-SO8-DISCO】——8、测试 UART1_Printf
: o) c- T( i% x/ v
  本贴测试STM8S001J3M3的串口打印。
: |5 a5 b* c+ W7 b) d
  本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。
- i1 B" G! Z* g0 I 21.jpg
& I' k' H0 j; `* a% F6 ?
% X6 U& N% F: q) A: o+ O  复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。1 ]- j' F. T9 B8 h
22.jpg ( e# C+ h& k: R) ^+ f2 N

# l' k5 c7 O+ X' E4 R  复制上电复位后延时5S的汇编程序% d! F# n( J2 b
31.jpg - f7 G6 E+ D$ d* Q4 S

& O* S" O3 r8 B7 ^  在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。2 f9 P; C5 N6 M5 H
  接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。0 S+ @8 O3 A1 A" q
  完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。
; Y2 q+ P+ M3 c0 e+ l  初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。8 x7 w, Q% B7 ?) J' c
32.jpg
4 V5 {( a8 u1 W& E9 _0 r; V* v8 X' i
  对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层
; F3 u7 h9 r+ }7 I7 A8 y 33.jpg
% `/ V: ]8 K2 ~  ^" N- D  }
3 y' `/ B7 ~+ l& Z- P  用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用: g6 Y" W* O: w2 o2 _( C
01.jpg , U! m& x8 u4 G! y4 q, h4 _* [

8 A4 j& J* u+ \1 ^6 {6 e# t' c. n
  经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。
. y: v. u: r" E! P" R 02.jpg
5 A0 K' U% p8 S! c  q. H; v! F+ X+ G- P; `) Q
  数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。
# c  z$ n, q3 F  f 11.jpg
1 r% c3 q2 O3 a# u( k$ T5 k% W( e$ g7 Q% w* Z. |9 w
  带方括号的为重映射复用功能管脚。8 v) t8 K0 S# d  A
12.jpg
8 p  h! ~1 J, t3 X
' K& ]  P- \" L" O
  不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。' I( Y: V$ k. f6 d! _
13.jpg . D6 l/ u* p2 B
2 M8 M+ Y9 e* R; A
  AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。
2 K  c# ~" h+ | 14.jpg 2 {7 `2 ^: v" ^" U, l
  总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。
. w/ x' X: L5 {# V3 p. F, S
: e) w/ n& R( h7 T+ q# m
  综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。% i' T* d& l' H2 I
41.jpg + E. F2 o9 _" c1 C6 X! |
2 J  g1 b: m2 c
  实验连线如下图。
+ a  x) j9 H: s$ e" d1 I% ~  { 42.jpg
% t2 x$ R! D" E/ z& q$ g, m' U) @! w* `. o) M* k3 ?: [8 E/ X
  编译,下载程序,并全速运行。
1 M( M* |8 @+ Z1 J& ~" l  实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。- ]( p) f$ y0 E' X, z6 _( [. T
42.jpg + Q& [; {& U3 h& W: b4 `
( U7 f6 M' o$ K4 r* u2 q2 B: m* X
  本贴测试工程附上:
# p- ^3 K% Y& _& D2 d   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 编辑
, C' x2 Y" H3 F9 p0 q) @
2 c' J8 x, |0 a/ y
& F; _6 ]1 K" p# k直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。
) Q1 v0 v+ Y: c. l. j6 b7 V 61.jpg $ R, B: X3 _' F' W+ y
9 ?/ [% V" C& C& Y$ ]
在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。  ?9 `$ V, F+ _0 u% q! z
62.jpg 5 e9 a6 g$ m0 }9 U+ V/ \5 D  F/ i" i) ?

' A$ d8 I8 N5 }0 Z$ j  U7 Q修改成“samll”级别,编译生成的目标程序就会小很多。$ a& f6 D* M8 t9 X
63.jpg
& W% `& s; z& H! @- c' c# N5 K- x* x; g6 ~6 W$ a! l6 [
在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。
" y* s. `) z( V5 j1 ]8 N/ D 64.jpg
; U4 P# K- m8 k% l  u) m4 ~
; X' n- _/ S8 k* V, [7 u( F
  [5 F1 u& @- o: I0 p! W
$ \  P* G  L2 M

0 u2 F3 m2 G( Z/ O2 B% E
七哥 最优答案 回答时间:2019-3-10 14:21:14
本帖最后由 toofree 于 2019-3-10 14:22 编辑 9 V! V* X; I2 s/ F$ V2 v
- o" h- s, ~* u4 x0 n7 f* P
补充一下:3 B2 F3 n! p7 I
程序中应该添加一条 #include <stdio.h>
: C. {. h+ S5 B  n+ `否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
jeffhe1 回答时间:2019-3-4 08:57:22
真是好詳細
七哥 回答时间:2019-3-4 09:17:11
jeffhe1 发表于 2019-3-4 08:57; O3 a5 m$ ]! }  d4 J0 u2 K3 H
真是好詳細

0 n1 h0 ?8 I; J+ c8 h+ m多谢捧场
legenderw 回答时间:2019-3-10 12:29:01
不错,stm8下比较省心
xiaoys 回答时间:2019-3-10 16:00:39
楼主有没有试一试stm8l001j3的UART1呀?, y: X, Q- E7 S+ h: E# k% d
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了
. W; R# {$ V0 u5 }期待ing~~
) C. I; A4 [# M. m! f. r
长春的风 回答时间:2019-3-10 16:43:40
大牛啊!
七哥 回答时间:2019-3-11 00:42:59
winddancer7 发表于 2019-3-10 16:00
) _+ u% o3 M% n* o- c% v& |, |楼主有没有试一试stm8l001j3的UART1呀?
* I  S, H0 Y, D+ P我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方 ...
% w6 l4 i$ j( Z: K: h% ^
让你说得,我都不敢试了
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
. F, ], p3 d4 I) e1 j楼主有STM8S001的eeprom的例程吗
. I8 }$ Q+ `3 `7 _; Z
你找找看呗,念在你第一次在社区发贴,破例回复一次你这样的问题。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版