电子说
近日有客户反映,他在在使用STM32F103C8T6的时候遇到如下问题:
I2C1使用PB6和PB7口,定时器TIM3使用PB0PB1PB4PB5做4路PWM。但在使用的过程中,如果只初始化定时器就没有任何问题,但是一旦初始化I2C1,那么定时器的通道2(PB5)就不能产生PWM波,而是保持高电平。
客户查阅手册得知PB5的默认复用功能是I2C1的SMBA引脚,但是它的I2C1是初始化为I2C模式的,并不是初始化为SMBAS模式,而且同样的方式在F0上测试是可用的。它本来用的是标准库开发的,然后尝试使用STM32CubeMx进行硬件配置,使用HAL库新建工程,还是存在同样的问题。
就上面的问题,查看了其有关I2C1和TIM3d的pwm初始化的部分代码,并未发现不对的地方。首先重点怀疑I2C1的配置是否有误,担心客户在配置I2C1时配置成了SMBAS模式。借助于库代码,进一步跟踪下去查看底层的寄存器配置,相关寄存器操作也没有发现问题。
这里TIM3的PWM输出的几个管脚有涉及到重映射【REMAP】,从数据手册的管脚分配上来看,如果不开启I2C1的SMBA模式,不应该存在冲突问题。
这边再次使用STM32CubeMx基于STM32F103C8进行同样配置,结果跟客户上面反馈的一样。不开启I2C1时,TIM3的所有管脚功能正常;开启I2C1后,TIM3的部分管脚PB5功能异常。感觉问题可能出在跟TIM3的remap这个地方。打开基于STM32F1系列的重要宝典---参考手册RM0008,查看核对有关TIM3的管脚复用REMAP功能介绍的地方。
现在客户执行的是TIM3的部分管脚重映射功能【partial remap】,从上面表格来看,目前的代码配置是没有问题的。毕竟目前如果不开启I2C1的话TIM3也没什么异常,所以过来查看这个地方,心里也没怎么期望从这里找出明显错误,倒是期待从附近能否找到些额外的提示或提醒。这不,表格的下方用了小一号文字明确提示:上述REMAP操作仅适用于64脚、100脚和144脚封装的芯片.现在客户用的芯片是STM32F103C8,管脚数为48,换言之,它是不支持TIM3的复用功能脚的REMAP操作的。到此,问题应该说找到原因了。
过不了几天,客户又发邮件过来继续就该问题咨询。他问,既然说48脚芯片STM32F1不支持TIM3的REMAP操作,那为什么做了REMAP操作后,如果不开启I2C1,TIM3的4个脚的PWM功能很正常;或者说即使同时开启了I2C1,PB4的功能还是正常REMAP过来了,只是PB5功能异常。希望我这边给出进一步解释。
站在用户的角度有人会发出类似疑问很正常。其实,既然手册明确规定48脚的STM32F1芯片不支持TIM3功能脚的REMAP,它自有其原因和道理。你违背手册之规定来操作,结果的正确性就不能得到保障。有时REMAP没问题,不代表任何时候进行REMAP没问题。就像讨论某个命题,局部、个别情形成立,并不能说它恒成立。打个形象的比方,A今年10岁,B今年20岁。即B比A大10岁,B今年的年龄是A的2倍。显然,两个结论站在今年都成立,到了明年,后面的2倍论就不成立了。
在ST MCU的应用过程中,还经常出现类似违背手册规定的操作以及由此导致的疑问。比方说,有人发现使用STM32芯片内部的flash时,似乎可以使用到手册规定以外的空间。用户这样使用,芯片的功能或特性是不能得到保障的,作为厂家只能保证芯片手册规定区域的品质。又比方,我们知道ST MCU绝大部分芯片都带有UID,可有些人发些即使手册明确没有UID的芯片,他们似乎发现这类芯片还是有UID甚至加以利用,询问这样是怎么回事或者说是否可靠。同样,对于类似情形作为厂家也只能保证手册规定的特性。超出手册规定以外的应用,只能用户自己负责。
好,继续回到上面的话题。
我们从芯片应用的参考手册上应该说找到了明确的规定或答案。我们还可以查看下基于该芯片有无更为详尽的勘误表。后来在官方网站找到了相应的勘误手册【注:勘误手册往往基于芯片型号,即一个系列可能有多个勘误手册】,我们在勘误手册里也看到关于上面问题的详细描述,可应视为对参考手册的进一步补充。
到此,问题原因基本明了。或许还会有人问,上面提到使用STM32CubeMx进行过工程配置,配置过程并未发现异常,或者说配置过程中没有遇到上面阻碍。既然参考手册规定不允许STM32F103C8芯片的TIM3 remap操作,在开启i2c1时,通过cubeMx配置TIM3的REMAP功能时应该出现非法提示才对啊?
我使用的CUBEMX的版本是4.22.0,在开启I2C1的同时,并按照TIM3的部分REMAP配置时不能说没有给出提醒,只能说提醒得不够明确。该提醒可能容易被人忽视,然后可以一路配置下去。
STM32CubeMx配置如下图,在I2C1那个地方有黄色警示,鼠标放过去的时候是有文字提示的【不一定每个人会留意到】:
可以说CubeMx还是有不够严谨或者说考虑不周的地方。如果在开启I2C1情况下,当用户试图配置PB5作为输出时直接红色警告拒绝TIM3的remap就好了。但这样,可能又会影响到另外一类用户人群,他们根本不在乎PB5怎样,只关注PB4能用作PWM输出就好。有点众口难调的味道,参考手册在明确不支持STM32F1系列48脚的TIM3的REMAP操作的同时,结合勘误手册做了应用补充,以尽可能满足不同的应用需求。
毕竟STM32CubeMX工程浩大,肯定还有需要完善的地方,尤其类似的细节问题。不过,我们相信会越来越完善。不管怎样,所以,任何时候我们不能完全将芯片手册丢在一边。比如,我们知道ST官方出了基于各个STM32系列的固件库,库里各类示例工程极大方便了大家的学习和研发。不难想象,这些固件库工程也都比较庞大,难免会有bug,一直都处于不断完善中。在使用它们的过程中如果碰到疑惑的地方,不妨查看下相关数据手册或开发参考手册,做进一步比对确认。如果觉得手册还描述得不够清晰明确的话,可以去找找相应芯片的勘误手册,看看里面有无相关问题的进一步补充描述。
全部0条评论
快来发表一下你的评论吧 !