stm32F103 使用cubeMx配置timer3 pwm输出后无法调试分析
有客户提出来这个问题,按照我正常的反应,一般都是客户的代码的问题。cubeMx配置能出现这个问题?我们另一个fae确认过之后我觉得有必要深究一下。看个究竟……我自己按照可以重现的配置在stm32F103c8t6这个芯片上试了一下也没有。但是当在stm32F103ze上面测试之后这个现象就出现了。cubemx配置很简单,就做下图配置:
时钟选择外部晶振72mhz
下面就是timer3的具体配置:
然后生成代码编译烧录进去单片机。然后再次点烧录,已经烧录不进去了(前提是也没有接reset复位脚,接了的话stlink会强制给单片机复位时能烧录进去的)。
然后就只能从代码分析了。调试以后发现运行在如下图所示这个地方swd自动就断开了:
找到这个代码定义的地方,如下代码:
1 |
#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这三个位。再次找到
1 |
MODIFY_REG() |
这个函数宏定义的地方:
这个MODIFY_REG是先读取寄存器,然后修改,最后再写进去。整个操作是经历这三个步骤。
再看下三个位我圈起来的地方是只写,读出来的值是没有定义的。所以这就造成先读再写值可能就变了,是不确定的。这样就可能正好失能了swd功能而出现我们所观察到的配置timer3的复用功能却导致swd功能用不了。
这么看来也是cubeMx的一个bug,希望st尽快给修复一下。