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

STM8S的printf问题和解决办法

[复制链接]
watershade 发布时间:2018-11-24 18:56
最近在研发一个小产品,因为成本压力,所以开始入坑STM8.对于一个STM32用惯的人,忽然用STM8,资源有点捉襟见肘,总是担心资源不够用。这是外话,暂且不表。今天就来讲个小问题。大家都知道STM8通常是使用STVD或者IAR开发的,而我使用的就是IAR。然后使用vs code来代理IAR的工程,这样用起来顺手许多。而开发STM8有人用汇编,有人用C。我使用的是C。属于大多数,毕竟汇编几天时间可不能十分熟悉。使用C有人用库,有人不用库。我是后者,使用的是官网下载的库。
' C! }7 R( j4 t3 c  I- z' o这个库还算比较简单,唯一的问题是,很多外设的初始化要写一长串。非常繁琐。官网的库里面有examples。其中的一个关于UART的example就是printf。9 W8 g7 y( K9 j& l& Z
手边使用的是STM8105K4,这款单片机其实资源不少。上printf没有问题。IAR关于这一点的支持也很好。
8 X+ b; M% i* _/ l其实printf的支持十分简单,官方的工程中就是:1、配置HSI 2、UART DeInit外设复位 3、UART初始化。 这一步甚至都没有配置GPIO。但是建议还是配置一下。4、定义putchar的原型,并实现它。, R' {% a- t" z, V
工程外还需要设置IAR的配置。如下两图:
* v- ]& x" @, h" \, [4 m
" K7 k4 l0 k1 L/ ? Capture1.JPG 图1
& C$ S; j) W4 Y. q Capture2.JPG 图29 z/ O/ w) Y1 K1 Q

" V8 W% w) _$ D7 M1 m图1通常新建工程和默认是Normal,有人建议使用ptintf的时候修改。但是个人觉得不用修改。使用normal的时候不支持multibyte.(multibyte暂时不知道是什么意思,不知道是不是指字符串类的多字节,反正暂时使用它来发送uint16_t都没问题。关于multibyte回头查手册看一下,或者坛友们在帖子里面回应)) s) Q5 x6 U$ I$ R$ b: P6 S7 l
而图2将printf和scanf分开设置,还分为FULL,LARGE,SMALL,TINY。而且每一种还有是否支持multibyte。图三还可以设置数学符号,比如支不支持三角函数和指数运算等。这些对于资源有限的外设很有用。这里就不再赘述。8 y* A- _' W8 Q+ n

4 Z( U! {3 |# O# k& `: V- r) {; x那言归正传,讲一下我调试遇到的问题。起初我按照官网的example做完之后。要打印一句话:
7 {; Y) \$ H. ^2 o+ j
  1. printf("A2 is %d \n\r", (int16_t)A2_Value);
复制代码
这段话很简单。A2_Value采集的是ADC channel2的数据。但是奇怪的事情发生了,ADC的数据都是正数,而且因为是10bits,所以不会超过1023的。
+ Z6 x( [2 V4 `5 I4 e但是我却收到了一段难以理解的数字:) [* T( o+ I8 Y! ]
Capture3.JPG
8 F6 i6 M6 S/ W& q" B8 O6 h7 Y-21580,而且有个警告我之前也忽略了,提示printf隐性声明。
  f  [" Z  H0 ]. P( y& N% Q起初我忽略了这条警告。尝试了各种修改都不成功。但是我忽然注意官方工程还有一个小细节,这里叫做第5步骤吧:包含基本输入输出命令。2 i- j1 ?, i% B2 H* B2 R
  1. #include "stdio.h"
复制代码
就是这一句加上之后警告也没有了,数据也正确了。Happy Ending2 |7 c( X; Z* D3 {
Capture4.JPG
3 D/ ]: C  p/ L" W% V4 F; p& T) B# h  v' N
魔鬼存在细节中,我的两个小时就这样被魔鬼吃掉了
5 }. b% x. A1 ]$ m* C4 b$ C7 X
收藏 评论3 发布时间:2018-11-24 18:56

举报

3个回答
watershade 回答时间:2018-11-24 19:36:08
本帖最后由 watershade 于 2018-11-24 19:42 编辑 # K) e! g( Z' s/ v% T) G* P- d

* L# Z3 i1 N2 f+ L6 o续上:关于multibytes这个多字节支持选项。起初我怀疑是中文,但是实际上并不是。我还是图1和图2的配置。直接添加中文没有问题。奇怪了。查看IAR的help,中见提到了wprintf。说明应该是指多字节标识的符号。但是和上面的实验不一致。
! R9 Z# a4 x* A2 ]+ \ Capture5.JPG
! X- K4 n& I% z0 ]( `8 z5 R这个太奇怪了。请大家有空做个实验。
$ p' Q, W9 |' e( m  l2 \附件中是官方文档,其中第102做了说明。按照理解应该是中文和其它非英语的多字节符号。但是却奇怪与实验不符合。
6 \% v* f& ~1 m3 x/ ~  f EWSTM8_DevelopmentGuide.pdf (4.18 MB, 下载次数: 53)

评分

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

查看全部评分

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