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

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

[复制链接]
七哥 发布时间:2019-3-2 02:26
本帖最后由 toofree 于 2019-3-2 02:35 编辑
/ a  f% q2 p& w  S  o2 i
: p( N* A# |) J+ U
【STM8-SO8-DISCO】——8、测试 UART1_Printf

& L) Q! j  b2 [  本贴测试STM8S001J3M3的串口打印。9 N2 G4 F, ~+ Y) d( @+ p
  本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。* N( J6 ~9 o8 n  P% S- q
21.jpg
2 f, Z8 b3 p, ?! x4 N3 Y: Y) T2 q: e
2 L! [' E# z) r/ \* p  复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。9 q& r% M2 M$ a3 j
22.jpg
9 d. c. {* P/ C, o  O; s; B% m' ]6 V$ R5 X$ z  J
  复制上电复位后延时5S的汇编程序6 A" w3 P! n; K6 ^0 o& m8 a' ]
31.jpg
8 D5 e/ {4 A; A+ o
$ E7 U$ Z/ E4 W/ w! K3 G  在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。
1 N, a# `) U( p  y( j9 o  接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。
9 E2 W& T" E& D2 m5 u+ I9 j  完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。
. Z$ D$ u9 O5 ~  初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。+ J9 `+ ^' I, s; H
32.jpg 5 ?+ X# `0 \2 k5 i" w

8 Q4 n; i+ R2 B4 s, ?& B+ F
  对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层7 S" E. w  I( L8 R$ X
33.jpg
3 q. A, t. I+ U3 u/ a0 H; N
: m$ O& z3 N% C  N( h  用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用; o- a( U: O- p; Z' N& J! L
01.jpg - m+ `( f, |' f2 d7 j8 D" `

/ O8 |) \! \# C
  经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。" S, I0 w/ {6 ^, q6 X
02.jpg ( S" J! G7 T( F: ?
, A' i% C0 A4 }: x
  数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。
9 y: Y* [# t/ f! Y; ] 11.jpg ' z0 ^3 R3 |- A1 o+ t

  Y+ u/ M2 |3 r: ]* h. `9 ?! R( g
  带方括号的为重映射复用功能管脚。
+ {" l. ^) k( M/ Y2 M 12.jpg
5 S0 m- U4 J& r- v4 o6 P/ X8 s9 v: d5 ]1 K0 x" j2 H& D
  不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。
: c' ~1 H' q8 I 13.jpg 9 y5 b0 j9 K, J& M# |6 Q) w

' K9 M* w+ e, F; @. i& Y1 J  l1 r
  AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。
# d" {" M+ L6 {2 J8 r8 F 14.jpg
- D8 D, S* C6 ?8 P: n% S# Z  总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。
( K5 r3 R: E( g$ q* Q8 I2 e  S2 ?' H9 b5 @, X3 m  g: A( Y7 C, B
  综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。
7 k, ~+ @7 e7 X/ u 41.jpg
( x3 n; V) t- ^5 C2 V5 y; Z3 b# ?* x9 A
  实验连线如下图。
5 e7 Q, @* |- q, l! x2 P3 Q6 { 42.jpg / b7 t+ I: N& X: h

0 ]! ^) u2 \$ M1 J( v7 l$ M  编译,下载程序,并全速运行。6 R; X* d; `; k. r% L/ F/ z
  实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。3 x+ K5 U8 u' g$ X, i9 r$ J' M8 r9 i
42.jpg / P. z6 G  P" [4 D- S$ \
  t0 \1 V% F' r9 |6 o
  本贴测试工程附上:' N( C% s9 m, n$ T9 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 编辑
( ^/ i' O0 b' D5 w9 O
+ }; A: @% K8 A
8 M7 C2 M9 t1 R直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。
' i! L% I1 c& N# T- C" y' W2 s 61.jpg 2 u# s9 E; y: @; @

6 ^5 h% o$ d4 v  {7 p在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。
6 W" s) N0 D5 j: e 62.jpg
3 |4 E$ P+ Q& K6 Q5 i4 u  R
: I2 T1 s1 }7 S修改成“samll”级别,编译生成的目标程序就会小很多。
/ _( O) m+ u5 l  }/ I 63.jpg : ^1 ?8 ~/ Z  ^" E" V+ b( V5 _
2 u1 F7 F" D3 e2 R
在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。  k$ N: \% [0 O$ X( Z
64.jpg 5 S. S/ A6 C  |& c, P

6 [7 N5 u, Z6 S& ]# F; S- O% ]* e2 M# v* J/ u( z! x2 [
( W; \9 F8 n' }; y

( I2 Q) n2 h2 h$ g
七哥 最优答案 回答时间:2019-3-10 14:21:14
本帖最后由 toofree 于 2019-3-10 14:22 编辑
" n- u& z  s' f6 V7 s
7 ~% P3 t. |$ `! W补充一下:7 B5 Y( F- |! q% X1 Z! b
程序中应该添加一条 #include <stdio.h>( j& W9 ~- q; B) y% F7 e
否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
jeffhe1 回答时间:2019-3-4 08:57:22
真是好詳細
七哥 回答时间:2019-3-4 09:17:11
jeffhe1 发表于 2019-3-4 08:57( r- z5 R% t4 L, ~7 e1 N
真是好詳細

$ n+ h% z( n8 D) M: n  r8 D6 F5 M# G多谢捧场
legenderw 回答时间:2019-3-10 12:29:01
不错,stm8下比较省心
xiaoys 回答时间:2019-3-10 16:00:39
楼主有没有试一试stm8l001j3的UART1呀?
% T& g6 W  X9 b8 e' ~/ K0 ^我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了5 {$ ?8 L5 d& k$ x- w- h
期待ing~~; ~2 X8 I' ^, k; S% y0 w; s
长春的风 回答时间:2019-3-10 16:43:40
大牛啊!
七哥 回答时间:2019-3-11 00:42:59
winddancer7 发表于 2019-3-10 16:004 z7 O3 ?9 A( d$ {) ^7 d# x
楼主有没有试一试stm8l001j3的UART1呀?6 t% ~, N4 b- u1 Q/ v; ~8 y
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方 ...
" W  ^6 m0 f: a! ^+ C# i. Y1 J$ v/ v
让你说得,我都不敢试了
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
& s2 H6 w, f5 d8 o' W- K楼主有STM8S001的eeprom的例程吗

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