stm32F103 使用cubeMx配置timer3 pwm输出后无法调试分析

STM32 DK45 0评论

    有客户提出来这个问题,按照我正常的反应,一般都是客户的代码的问题。cubeMx配置能出现这个问题?我们另一个fae确认过之后我觉得有必要深究一下。看个究竟……我自己按照可以重现的配置在stm32F103c8t6这个芯片上试了一下也没有。但是当在stm32F103ze上面测试之后这个现象就出现了。cubemx配置很简单,就做下图配置:

 

时钟选择外部晶振72mhz

下面就是timer3的具体配置:

然后生成代码编译烧录进去单片机。然后再次点烧录,已经烧录不进去了(前提是也没有接reset复位脚,接了的话stlink会强制给单片机复位时能烧录进去的)。

然后就只能从代码分析了。调试以后发现运行在如下图所示这个地方swd自动就断开了:

找到这个代码定义的地方,如下代码:

#define __HAL_AFIO_REMAP_TIM3_PARTIAL() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_TIM3_REMAP, AFIO_MAPR_TIM3_REMAP_PARTIALREMAP)

从上面可以看到是修改到了AFIO-MAPR寄存器。打开手册,查找这个寄存器定义的地方:

看到了吧。控制swd调试功能的使能和失能正好也在这个寄存器。那就不奇怪了。修改MAPR寄存器的时候应该是修改到了这26:24这三个位。再次找到

MODIFY_REG()

这个函数宏定义的地方:

这个MODIFY_REG是先读取寄存器,然后修改,最后再写进去。整个操作是经历这三个步骤。

再看下三个位我圈起来的地方是只写,读出来的值是没有定义的。所以这就造成先读再写值可能就变了,是不确定的。这样就可能正好失能了swd功能而出现我们所观察到的配置timer3的复用功能却导致swd功能用不了。

这么看来也是cubeMx的一个bug,希望st尽快给修复一下。

喜欢 (8)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址