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

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

[复制链接]
七哥 发布时间:2019-3-2 02:26
本帖最后由 toofree 于 2019-3-2 02:35 编辑
7 I3 y' k9 R2 n$ J8 B6 J3 V
! p4 Z+ n* y  W' O) c: l# ^; z
【STM8-SO8-DISCO】——8、测试 UART1_Printf

3 }) w( D! k) [+ u) j' b  本贴测试STM8S001J3M3的串口打印。% @) w* V! W0 p0 S+ a1 I
  本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。% n% j, ^, e& W* A5 C, q
21.jpg 9 s# X9 j0 v" t6 n# z' M

. v3 |- l! R8 O( y  j& D5 _5 n) o  复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。
3 l3 r: p- e" o( M3 k  N, ^ 22.jpg
: {) L; \9 J$ h4 g# Q* Q% h3 [6 A1 \: A. b3 d' O  D% B8 g
  复制上电复位后延时5S的汇编程序$ O2 Y6 g  I5 r6 N- L
31.jpg % e6 D+ e4 T  m* Y' |& O

2 I6 f& @8 C. {$ s  在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。
# j; |6 U; X2 }. S- E  接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。
& Q1 \) P" S: ~+ E8 s0 R) ^  完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。0 J: G" t3 D/ G/ A6 _
  初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。, F# ~5 ?/ P$ w+ t1 W) m
32.jpg 3 @7 C+ e0 v+ q9 T# o& g1 V. c4 c# u2 }

4 g4 [7 @$ Q. W/ t0 ^9 i5 U
  对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层
; w+ W; L! n' V, j+ ?* W 33.jpg
3 v* X1 m8 y% ~2 U& Q
2 x! S8 P% d; l  用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用
! j: ?5 x3 I% _1 W8 F$ N, l: a; ?+ f 01.jpg , E. z" g, W( r8 _$ u9 s
' g& ^, w; Y$ e
  经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。
0 b; U0 E( {5 [0 A 02.jpg " E$ W! j. H; ~- H

9 f% l3 G  A+ j, l7 F5 g; @  数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。/ s  }% f0 H+ k' e) h7 [
11.jpg
2 |& `8 s( P' K9 u, S! Y* {9 q  R; I3 B3 D" ^; Q, ?) u. w) S
  带方括号的为重映射复用功能管脚。) j" E( f4 b( S3 T$ C" |" ]. _* `
12.jpg
1 q, U7 {+ X$ d) B$ g3 |* p
  G, l' k* G8 }( k0 Y4 P8 J9 N
  不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。
0 Y0 G/ J( k% ]0 u% U 13.jpg ( \& ]+ Z. B/ f3 h& P

. i4 [2 N+ B1 Z* r
  AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。
% _8 u( n$ N0 j 14.jpg , l  r' `3 D/ M0 W
  总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。" K' ^% A, ~" O% @* J
; i% A; l# b8 u
  综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。
% f2 `  j  a4 K  u4 J 41.jpg
6 V9 A" U+ i1 E& \9 @' X5 C
% A/ \: C1 Q. A  实验连线如下图。
) _: d  S7 c7 w2 u 42.jpg
7 T7 i! E- ?2 J% F" L( |' B4 p
& ~/ w6 k* L6 P; ~4 F5 C  编译,下载程序,并全速运行。
2 l/ B" W7 l5 P  实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。
, U# y# a2 m! ^# d/ d$ [: R" I 42.jpg
( i3 d5 m- e1 `* Z
/ T, h$ q$ j! d; c, X  本贴测试工程附上:
; r9 d- U' m% o1 K$ q! `% 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" ]1 \# F9 O# c0 n+ r4 x: ^
/ N+ q- _( F  T: M1 U. N

4 [4 \1 E4 ~3 z" ~" y直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。8 P- {+ O9 V: @6 B' G$ f; K7 {
61.jpg
) ~2 ]1 x- O* J# g7 k* }0 @7 j: F) E( s" j3 _. [- q
在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。5 {1 n) Y/ R, ^
62.jpg * Z6 k# Z$ `; }8 R: o$ K

* l  y9 b4 e* R2 p4 u修改成“samll”级别,编译生成的目标程序就会小很多。
% e6 Z0 x% Z1 i1 N" C+ L. d$ F4 B 63.jpg
6 G  f% p9 [! B$ B/ @6 t5 \, j# f1 x/ a
在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。
; p1 C6 l2 i* f5 C2 _ 64.jpg
; r- p5 F  s8 W2 w3 x
. r0 [, v" }+ [8 ?, Y- U! X" ?7 U  z
, h9 T  u) N- a/ E4 z

) S( W! X! L) E
七哥 最优答案 回答时间:2019-3-10 14:21:14
本帖最后由 toofree 于 2019-3-10 14:22 编辑   F( k& ]1 l$ H! A4 s1 n( v

4 n- Q" r" F8 U) z3 g补充一下:
1 R7 t# k7 [! [8 K& d6 |# M# k程序中应该添加一条 #include <stdio.h>, k! L! P" o* f7 V
否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
jeffhe1 回答时间:2019-3-4 08:57:22
真是好詳細
七哥 回答时间:2019-3-4 09:17:11
jeffhe1 发表于 2019-3-4 08:57
8 O/ I) ]2 a. w; u; K: E/ X真是好詳細

8 Q, G& }5 |2 m& s7 D( b多谢捧场
legenderw 回答时间:2019-3-10 12:29:01
不错,stm8下比较省心
xiaoys 回答时间:2019-3-10 16:00:39
楼主有没有试一试stm8l001j3的UART1呀?# s) g- w" o+ Y5 H5 Y7 c
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了
- |" Z, n' [% q期待ing~~
% C, ~5 X8 o# N1 g+ z$ k
长春的风 回答时间:2019-3-10 16:43:40
大牛啊!
七哥 回答时间:2019-3-11 00:42:59
winddancer7 发表于 2019-3-10 16:00
) ]4 |9 T& X( X5 _/ p楼主有没有试一试stm8l001j3的UART1呀?
# L$ k2 y" x; |. x: \我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方 ...

+ M9 T+ W/ S7 v. G让你说得,我都不敢试了
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:396 b, J0 `: w* h2 k$ Y2 S
楼主有STM8S001的eeprom的例程吗
+ i+ D- @. _: c) n, U
你找找看呗,念在你第一次在社区发贴,破例回复一次你这样的问题。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版