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

STM8S的printf问题和解决办法

[复制链接]
watershade 发布时间:2018-11-24 18:56
最近在研发一个小产品,因为成本压力,所以开始入坑STM8.对于一个STM32用惯的人,忽然用STM8,资源有点捉襟见肘,总是担心资源不够用。这是外话,暂且不表。今天就来讲个小问题。大家都知道STM8通常是使用STVD或者IAR开发的,而我使用的就是IAR。然后使用vs code来代理IAR的工程,这样用起来顺手许多。而开发STM8有人用汇编,有人用C。我使用的是C。属于大多数,毕竟汇编几天时间可不能十分熟悉。使用C有人用库,有人不用库。我是后者,使用的是官网下载的库。
; V* ?# G* ^) W' k9 L这个库还算比较简单,唯一的问题是,很多外设的初始化要写一长串。非常繁琐。官网的库里面有examples。其中的一个关于UART的example就是printf。
1 r, ?+ W7 X) |4 k6 d手边使用的是STM8105K4,这款单片机其实资源不少。上printf没有问题。IAR关于这一点的支持也很好。
( F9 N% F# r2 y" o9 H6 Z8 a) J7 M其实printf的支持十分简单,官方的工程中就是:1、配置HSI 2、UART DeInit外设复位 3、UART初始化。 这一步甚至都没有配置GPIO。但是建议还是配置一下。4、定义putchar的原型,并实现它。
- S' l+ N) a5 ]9 D. _8 ~工程外还需要设置IAR的配置。如下两图:
) M7 [8 A7 S% j" l: D' C
+ F6 W& ]/ ]  t7 @1 g. W Capture1.JPG 图1% {# L) r( V6 K
Capture2.JPG 图2
- i  u5 }3 B! P' l0 s6 O! {
. ^  r% X+ D1 |- n/ y0 G图1通常新建工程和默认是Normal,有人建议使用ptintf的时候修改。但是个人觉得不用修改。使用normal的时候不支持multibyte.(multibyte暂时不知道是什么意思,不知道是不是指字符串类的多字节,反正暂时使用它来发送uint16_t都没问题。关于multibyte回头查手册看一下,或者坛友们在帖子里面回应)7 e7 z5 O7 e( p/ I7 r, b" E' `
而图2将printf和scanf分开设置,还分为FULL,LARGE,SMALL,TINY。而且每一种还有是否支持multibyte。图三还可以设置数学符号,比如支不支持三角函数和指数运算等。这些对于资源有限的外设很有用。这里就不再赘述。
) r. T9 ]! g% Z6 q
3 X# O0 X4 F, D# L$ v" _4 T那言归正传,讲一下我调试遇到的问题。起初我按照官网的example做完之后。要打印一句话:) l' H% Y- i) w$ [6 G; q! w
  1. printf("A2 is %d \n\r", (int16_t)A2_Value);
复制代码
这段话很简单。A2_Value采集的是ADC channel2的数据。但是奇怪的事情发生了,ADC的数据都是正数,而且因为是10bits,所以不会超过1023的。& `* W# `" y4 t9 h
但是我却收到了一段难以理解的数字:
: Y1 m% G3 s( \5 I Capture3.JPG + Q; x$ M1 [" y5 Y0 `' u% M
-21580,而且有个警告我之前也忽略了,提示printf隐性声明。
' c% ~/ J- d1 n3 ~7 s  r9 \0 W8 a起初我忽略了这条警告。尝试了各种修改都不成功。但是我忽然注意官方工程还有一个小细节,这里叫做第5步骤吧:包含基本输入输出命令。
5 ?) T* s$ T2 O% D( m; e
  1. #include "stdio.h"
复制代码
就是这一句加上之后警告也没有了,数据也正确了。Happy Ending8 T, ]" I2 {% _3 E
Capture4.JPG
1 J) r/ H) z+ ]: a9 ~) W( @- `
0 N& B( e; B# ^2 D6 g6 M/ q魔鬼存在细节中,我的两个小时就这样被魔鬼吃掉了8 w6 H/ T5 r( V/ ]
收藏 评论3 发布时间:2018-11-24 18:56

举报

3个回答
watershade 回答时间:2018-11-24 19:36:08
本帖最后由 watershade 于 2018-11-24 19:42 编辑 ' V2 a6 J2 N$ d+ I
5 J7 W" G, a- k
续上:关于multibytes这个多字节支持选项。起初我怀疑是中文,但是实际上并不是。我还是图1和图2的配置。直接添加中文没有问题。奇怪了。查看IAR的help,中见提到了wprintf。说明应该是指多字节标识的符号。但是和上面的实验不一致。; e! d! x$ W/ G8 i" _, }
Capture5.JPG # h7 }2 x, i9 b; i: K
这个太奇怪了。请大家有空做个实验。
. j3 W/ P& C# M( K6 V9 `9 b$ V附件中是官方文档,其中第102做了说明。按照理解应该是中文和其它非英语的多字节符号。但是却奇怪与实验不符合。
: I0 X% Q* Y/ o: r' H1 A EWSTM8_DevelopmentGuide.pdf (4.18 MB, 下载次数: 53)

评分

参与人数 1ST金币 +20 收起 理由
STMCU + 20

查看全部评分

backup-72119 回答时间:2019-8-28 16:03:49
感谢分享经验,解决了困扰我一天的问题。( _! N+ l; h* Z: Z$ p
hdbgyl 回答时间:2019-9-30 10:26:51
感谢分享经验
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版