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

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

[复制链接]
七哥 发布时间:2019-3-2 02:26
本帖最后由 toofree 于 2019-3-2 02:35 编辑
! G  y" h9 f! r5 u  x
; o5 F! t0 _# F2 ^/ {* G1 a
【STM8-SO8-DISCO】——8、测试 UART1_Printf

3 ^6 Z9 r( m& ?, d7 Z' f6 \  本贴测试STM8S001J3M3的串口打印。
# r& g6 D  s5 I+ b% G( a
  本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。' ]9 f  |# J% o4 C% A6 {
21.jpg 3 I/ F4 S" R/ M/ i" X& z7 j3 f2 v
" P2 P3 [' C/ M* X
  复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。6 U* r& c" d1 _
22.jpg
$ S$ N4 y/ T" U1 x0 }9 o+ w9 R& w/ S5 M4 V. m
  复制上电复位后延时5S的汇编程序' R% L" r4 y& B* P  N
31.jpg 8 L- Y" A. W2 G/ J) v7 b
& D' Y: H5 n, A1 z2 d
  在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。
3 K- M3 V5 F4 f" [) ~  接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。* V0 t, X0 Q, o' s8 p) v
  完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。
( o/ c+ J' c8 H# k* i9 h/ G  初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。# w/ f+ H/ s" P* ]
32.jpg
) d. T5 k: W- m& i4 g( v$ l, H0 I7 V, s( c. j8 d' o% y! h
  对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层9 ~# X  J1 s0 ^( O+ R* J
33.jpg
9 {" C/ o+ F" X2 a4 \; }1 J( \. p/ L, m
  用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用
7 B7 o0 Y; h; l7 D+ e8 s/ \: } 01.jpg
. F% ]" s% ?& d( W
+ D9 A3 c; e$ i2 {9 s
  经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。5 }3 U3 D! ^2 W
02.jpg
3 a  y1 I8 M& M+ h& ?- P. ^9 Q3 r( @! S" q) U" Q' b
  数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。  x6 F; G; N4 p
11.jpg
& S9 l9 o" m, A0 R) \8 G  E7 d7 I6 X% @
  带方括号的为重映射复用功能管脚。; L7 k4 C" I- A, Z5 k! D) _
12.jpg
0 Y/ m( k$ Q; M8 o# f( T( I3 L4 m
( M0 g) t! J+ u* w- m* r6 B2 \
  不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。/ u, U0 o7 n# U
13.jpg ' l2 N! s8 U+ S; E2 ]# V2 }

/ L6 }0 r7 \$ _' d" j
  AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。2 g" |' ^$ w& y8 u( g0 L
14.jpg
2 ?& i* Y  P% q  总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。
; u+ a2 b1 [% x; p& d5 ]/ X* Y0 q
  综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。
; X4 [& A" L) T* _$ l- {" h8 L- z 41.jpg ( B% \1 _  S% v, G5 u* R

5 g" n: u( r! E3 W, B  实验连线如下图。
3 F5 T! C) Y( v 42.jpg
5 Q4 U7 r# ?* C% L3 A# z; i6 Y9 M' r, w% O2 M- a
  编译,下载程序,并全速运行。
+ x3 i9 g3 X5 }- k2 P6 g# F  实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。
9 Z9 j5 P; G( {, ~; y8 S 42.jpg : Y+ V( O* C- P
: U! G9 P* q# }# |
  本贴测试工程附上:  |, z2 n) k) @  Z# O
   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 编辑 # v- K) Q' k$ K# }5 f+ ~

) t$ |% Y+ x- a2 n4 j$ w/ i& _, v6 U' B+ Z8 N
直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。  S1 B8 n5 b; T4 z: B
61.jpg # M( D; P# m5 ^* A; t

  b* c2 P9 v2 y' M在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。
3 Z, T6 F( \# k/ c8 h: l  T0 \ 62.jpg 2 N" f" k5 |7 Q3 |2 ?( l

* w' W6 r9 \: X7 G0 v修改成“samll”级别,编译生成的目标程序就会小很多。
8 Z" a! H7 ~% S* S, g 63.jpg ' f0 `' j0 l5 Z1 l) n0 @) M2 z
* t5 H( T( |! X. @
在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。6 F/ `3 @% y) E: g' R5 W- s
64.jpg
: ?7 a9 R7 u$ n: }2 @% A( v. k
3 u) j) {1 j+ @$ R3 [+ E  v# W  J' U& a4 X9 X

  T% R9 o% N8 n3 c4 [! q: u

0 G, C9 S% {5 ~& Q% y* H6 @
七哥 最优答案 回答时间:2019-3-10 14:21:14
本帖最后由 toofree 于 2019-3-10 14:22 编辑 3 ]" u% B/ r: ^! W( n0 T( R
8 p* W; x3 S: o- y& c  A
补充一下:
7 V2 Y) W7 K+ N  m. m程序中应该添加一条 #include <stdio.h>, m: W- k/ }; M3 c3 w
否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
jeffhe1 回答时间:2019-3-4 08:57:22
真是好詳細
七哥 回答时间:2019-3-4 09:17:11
jeffhe1 发表于 2019-3-4 08:57; r6 o; S! v7 ^1 M+ H* T- g7 ]- P0 ^" r
真是好詳細

/ v! V! e. ~/ d% p+ q7 q多谢捧场
legenderw 回答时间:2019-3-10 12:29:01
不错,stm8下比较省心
xiaoys 回答时间:2019-3-10 16:00:39
楼主有没有试一试stm8l001j3的UART1呀?5 q  k- P/ Q  \4 p6 h0 V
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了$ u2 R$ X0 d5 ~# k* I- D
期待ing~~
, ?' ~* t$ R# G. z* l% z5 r2 s
长春的风 回答时间:2019-3-10 16:43:40
大牛啊!
七哥 回答时间:2019-3-11 00:42:59
winddancer7 发表于 2019-3-10 16:00
; Y7 ?- x6 @5 R7 P楼主有没有试一试stm8l001j3的UART1呀?: R/ \' S6 y9 u
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方 ...
* D1 }: {, b* A  z6 _! _
让你说得,我都不敢试了
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
0 K3 ]; ]2 c5 J) f: a& U楼主有STM8S001的eeprom的例程吗

. i3 ^1 j/ R( }6 l0 X( F你找找看呗,念在你第一次在社区发贴,破例回复一次你这样的问题。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版