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

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

[复制链接]
七哥 发布时间:2019-3-2 02:26
本帖最后由 toofree 于 2019-3-2 02:35 编辑
! M$ y5 m& B& f- f9 H* ~2 \, y+ m. |* l  Q: @/ d5 T. c+ \
【STM8-SO8-DISCO】——8、测试 UART1_Printf

5 s! c& C/ s. _' x; L$ c  本贴测试STM8S001J3M3的串口打印。
5 W5 O# _# d# A5 B# O& E9 m7 O; B; t
  本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。8 Z2 `) }0 V# g/ l+ i
21.jpg ) b3 p: _5 k1 a; ^% M
) p( l5 N$ b1 L
  复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。3 w. }1 h) \% u
22.jpg 2 T( b  k. ^# N" [3 n
7 w0 c! }- c6 \7 @2 M
  复制上电复位后延时5S的汇编程序
4 v7 ]( f7 C7 r  y$ V4 T 31.jpg 7 q) a0 @% O' d9 `
3 ^( Z7 M6 j7 i9 |& L8 `
  在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。
8 p0 U) l1 @: h  接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。6 G  ?) k$ W1 n# T, P/ b
  完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。
0 K' S* \# A3 F1 w  @  初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。
+ K' n0 n: s1 I* j 32.jpg # W: C  \, o/ C# h

& {# `  u8 a% d4 E% I
  对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层。
, R2 f- t" _* P7 U+ E" t/ j 33.jpg
  Z- ~  c2 J1 Q% ^% S% ^/ X7 G4 c$ g! {: s! j
  用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用。
% s6 _3 q% o* {3 |( l 01.jpg ' x3 _9 f- z7 F+ }& i

# k" ~1 \) P& {8 n4 l8 T2 N
  经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。2 ]. W( G4 `+ d0 K
02.jpg
  D9 K, v0 T5 b+ v4 R& }/ v- G' N3 J* d7 q& e$ ~8 Y
  数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。
3 F) [' e$ F! G; A 11.jpg " z  |& A( c+ _- B
7 t/ F  |. U" d0 \& o/ _
  带方括号的为重映射复用功能管脚。' G' D0 q4 f  i. y
12.jpg
! N6 H: x4 @8 N1 X" x4 X. Q3 X) g, o" {& `! P5 v1 V  f5 M1 U
  不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。1 i4 b% l' v- u
13.jpg 6 @& O( M  h+ r! K7 `
3 j' w1 t& u3 o. @9 E+ X# d
  AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。
) n# P( ^. E7 L! f- ]6 j' S4 V 14.jpg . ~" o" @! j- v( e* _
  总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。
3 ^" y0 ~7 O' S  i" E0 M$ H; H7 [/ l5 f2 {* j
  综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。# A% a! V4 t7 `3 `) F. o  r
41.jpg " ?7 U' M* V2 q" W# B
7 [8 H1 `9 L8 g& z
  实验连线如下图。
! b' J1 v4 ?  \# o- W4 Q 42.jpg
, R1 A! p/ p# l! `% `
- y7 J" B; A9 x) V  编译,下载程序,并全速运行。
8 P! M. A/ l, c4 O! U8 s* B$ A4 G  实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。
# b4 D2 R+ @! x3 p' @. @& j: R8 W, s 42.jpg
5 r  U3 m+ k& T6 {: J$ W& ]% U5 q$ J! p7 m- W* Z6 v
  本贴测试工程附上:) A* _8 W  G* Y) Z" ?
   STM8S_StdPeriph_UART1_Printf.rar (260.1 KB, 下载次数: 28)
赞 收藏 评论11 发布时间:2019-3-2 02:26

举报

11个回答
七哥 最优答案 回答时间:2019-3-2 03:23:26
本帖最后由 toofree 于 2019-3-2 15:11 编辑 1 `( i0 ~* W8 p8 c% `

" {& u0 |; C4 K! T- x1 F/ T. z0 K7 X
直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。
. |4 m! D9 ?1 V 61.jpg . g# a6 u/ ]! p1 D+ W! q
/ M  `! t7 I! K. N  x" L0 L
在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。
, s6 l* l# Z7 m  v 62.jpg % |7 d0 d. q6 s! \8 M* C

! o* ]; e8 _7 N: q5 s  j' M修改成“samll”级别,编译生成的目标程序就会小很多。
$ [: A) P8 u2 ~3 T4 a 63.jpg
' K5 m5 W( M" f$ x& D( u: S$ @! c& R1 w* d/ \
在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。9 U' N" K' ^7 E3 Y
64.jpg
; E. g2 m  W3 C5 f8 X/ `2 b4 x& @6 _- k$ M) T+ O
$ E  b7 t1 z) J7 W) R5 o5 {
& c$ l. Q6 a  M) M# e

; t" P* m) a+ q
七哥 最优答案 回答时间:2019-3-10 14:21:14
本帖最后由 toofree 于 2019-3-10 14:22 编辑 * U$ }2 ?# K) Q' R6 w7 `& }% h9 x

4 Y3 d$ X6 p. F8 F6 O6 b& {补充一下:/ H+ z4 J6 @# w( k
程序中应该添加一条 #include <stdio.h>* t+ @4 U& L- o; |
否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
jeffhe1 回答时间:2019-3-4 08:57:22
真是好詳細
七哥 回答时间:2019-3-4 09:17:11
jeffhe1 发表于 2019-3-4 08:572 J) H' Y; t) W- c
真是好詳細

( ~. d& f: I0 n) |- w3 k多谢捧场
legenderw 回答时间:2019-3-10 12:29:01
不错,stm8下比较省心
xiaoys 回答时间:2019-3-10 16:00:39
楼主有没有试一试stm8l001j3的UART1呀?
0 _+ @: ]2 m6 W3 B; g, r我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了
3 W$ ^) q# I' B; s期待ing~~
; Y( |; i- m8 z0 a1 K0 ?' I
长春的风 回答时间:2019-3-10 16:43:40
大牛啊!
七哥 回答时间:2019-3-11 00:42:59
winddancer7 发表于 2019-3-10 16:00  M9 L: ?' u8 s% u, k5 j% L
楼主有没有试一试stm8l001j3的UART1呀?# k) M" ?+ [/ V8 a$ x( u
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方 ...

/ g4 i, b8 P, w# V" X让你说得,我都不敢试了
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% m. z. M8 x2 P0 B9 G/ k9 h
楼主有STM8S001的eeprom的例程吗

$ }: X5 {' D1 _- C' j: C2 i* I& S你找找看呗,念在你第一次在社区发贴,破例回复一次你这样的问题。

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版