本帖最后由 ss1969 于 2017-1-12 17:25 编辑 环境: HAL库, F1系列1.40版 STM32F103VET6 使用双线的ST-Link BUG: 使用PB345作为SPI端口,连接一颗W25Q16 CubeMX生成代码,如果使用SPI1,则会造成Init SPI后,STlink无法下载代码(Keil 5里面报告找不到Target),此时SPI1是正常工作的可操作Flash。 如果使用SPI3则一切正常。后来跟踪发现,只要调用了_HAL_AFIO_REMAP_SPI1_ENABLE就会出问题。 以下是简化的main.c,启动5秒内,正常下载;5秒后,Stlink无法连上。 有同样环境的朋友希望可以试一试。 |
对照数据手册引脚图 就知道了 PB3/PB4是编程复用口 特别是PB4 在SWD 和 JTAG编程模式下 都是要占用的 然而你使能映射的PB3和PB4 我想应该是关掉的JTAG和SWD仿真口导致的
以下来自 原子论坛帖内容:
设置为SW模式时,PB3管脚在跟踪时为TRACESWO信号,cpu软件复位也不会清除,需断电才能再次使用。所以需要关闭跟踪。
否则在进入调试后,PB3管脚不受ODR控制。
关于寄存器:
3个控制位用来配置SWJ-DP 接口的引脚,这3个位在系统复位时复位。
● AFIO_MAPR(STM32F10xxx微控制器中的地址是0x40010004)
─ 读:APB,无等待状态
─ 写:APB,如果AHB-APB桥的写缓冲器满了,则一个等待状态
位26:24=SWJ_CFG[2:0]
由软件置位和复位
这3位用来设置分配给SWJ调试接口的专用引脚数目,目的是在使用不同的调试接口时能释放
尽可能多的引脚用作普通I/O 口。
复位后的初始值是000( 所有引脚都设置为JTAG-DP接口专用引脚),同时只能置位3个位中的
一个(禁止同时设置一个以上的位)。
调试MCU配置寄存器DBGMCU_CR :
此寄存器允许在调试状态下下配置MCU。包括:
● 支持低功耗模式
● 支持定时器和看门狗的计数器
● 支持bxCAN通信
● 分配跟踪引脚
DBGMCU_CR寄存器被映射到外部PPB 总线,基地址为0xE0042000 。
寄存器由PORESET 异步复位( 不被系统复位所复位) 。当内核处于复位状态下时,调试器可写该
寄存器。
如果调试器不支持这些特性,用户软件仍可写这些寄存器。
DBGMCU_CR
地址:0xE0042004
只支持32位访问
POR复位:0x0000 0000(不被系统复位所复位)
使用SW并且PB3可控的配置代码,注意时能AFIO。
RCC->APB2ENR |= 1 | (1<<3); /*AFIO/ GPIOB*/
DBGMCU->CR = DBGMCU->CR & ~((uint32_t)1<<5);
AFIO->MAPR |= (AFIO->MAPR & ~((uint32_t)0x7 << 24)) | (2 << 24); //SW模式
评分
查看全部评分
应该是SWD接口还能使用,还能继续仿真。。。PA13、PA14未使用就可以
评分
查看全部评分
看网上说 SWD模式 PB3默认是调试跟踪 需要关闭调试跟踪 才行 不然 PB3也是无法用的 不管怎么说 他这现象始终是与仿真口冲突造成的 并不是什么杂症 稍微百度下就知道了
评分
查看全部评分
无所上代码 就是编程口占用的问题
小猪老师厉害,学习了。。
问题在于~~ 我用SPI3的时候,也是占用了PB3、4、5的,这个时候SPI3工作正常(能读写w25q)
而且,同时,Serial Wire模式下载正常(使用ST Link)
所以 并 不 是 占用编程口的问题。
补充一下Serial wire模式应该是不使用PB4的。
出现这个问题之后,我用Jlink + 飞线的方式,可以下载,此时也不需要接PB4(nTRST),只需要多接上TDI,TDO和nSRST即可!
我已经直接上了呀。
就在main里面加一句就能出bug了
但我不确定如果不上W25Q16,会不会也会出现这个问题。