
到处找ST官方的邮箱找不到,反馈bug都不知道到哪里反馈,好纠结。 先说明一下我是用的最新的版本的stm32cubeMX ![]() 最近在用stm32F103VET6做一个项目,其中用到UART3,而且需要端口重映射。结果发现按实际需要配置好stm32CubeMX之后生成的工程无法使用SWD下载和仿真,需要手动复位才能重新烧写程序。 反复试了很多遍,排除硬件问题。而且在stm32CubeMX里面的DEBUG端口也配置成SWD模式了。 只要打开UART3重映射就无法下载和仿真,在stm32CubeMX里关闭UART3重新编译工程后,又可以下载和仿真。 为了确定是否是UART3重映射配置与其他外设的设置冲突了,我重新建立新的工程。 除了外部时钟和SWD以及UART3以外其他一切都不配置,结果发现问题依旧。 所以可以断定是UART3的配置代码出问题了,进一步推测应该是配置重映射代码有问题。 于是找到了UART3重映射指令 __HAL_AFIO_REMAP_USART3_ENABLE();将其屏蔽。 UART3其他配置代码保留原样,编译后下载仿真都正常,说明推测是正确的。 于是打开stm32F1的参考手册查看AFIO的寄存器说明,其中MAPR同时管了好多映射,包括SWD和UART3,所以冲突很可能就是这里。 ![]() ![]() ![]() 注意,这个寄存器关于SWD的配置的这3位是只写模式的,读出来的数没用。 不管你配置成什么模式,读出来的数都是0x04,也就是全部仿真模式都关闭。 也不知道是不是st的程序猿没注意这个问题,直接将MAPR的数据读出来只修改了UART3的映射位就写回去了。 hal库的宏套来套去的我没时间去细追究,自己写了一行寄存器操作代码,替代了自动生成的代码。 注意一定要屏蔽掉原先的哪行代码,否则即便添加了我这行代码也没用。 AFIO->MAPR = (AFIO->MAPR&0xF8FFFFCF)|0x02000030; ![]() 经测试端口已经映射到PD8和PD9了,而且收发正常。可以进行SWD下载与仿真。 到底stm32CubeMX怎么弄成这样我就不去刨了,希望ST的攻城狮们早日看到并修复这个BUG。 补充一句:stm32CubeMX虽然方便但是不能完全相信它啊,寄存器操作虽然枯燥乏味,但是关键时刻很好用的。 |
直通FAE:mcu.china@st.com
样片购买:400 800 8051
搜索了一下群号,都ST社区群3了呀。
看来我加得比较早,在群1
我昨天用CAN也是这个问题。
STM32F103ZET6 + IAR8.11 + CubeF1 V1.6。
在重新映射CAN到PB8,PB9时,调试器无法控制CPU了。
后来一步步排查,跟到了楼主说的那行代码。
结合手册发现,在修改AFIO->MAPR的值时,不能采用读出来再写进去的方式,而是应该写个确定的值。
下面这两句会引起JTAG和SW关闭:
AFIO->MAPR &= ~AFIO_MAPR_CAN_REMAP;
AFIO->MAPR |= AFIO_MAPR_CAN_REMAP_REMAP2;
下面这一句就仿真正常:
AFIO->MAPR = 0x02004000;
2018.01.21 15:49更新:
换了一个工程,__HAL_AFIO_REMAP_CAN1_2()又没问题了,但是CAN不能正常使用。
这么复杂的问题就交给ST解决吧。
2018.01.21 18:24更新:
又又换了一个工程,__HAL_AFIO_REMAP_CAN1_2()又又没问题了,然后CAN就能正常使用了。
目前CubeMX已经更新到4.24.0了,看下还有这样的问题吗?
下载地址:
https://www.stmcu.org.cn/document/detail/index/id-214984