在STM32H7上使用PB3、PB4、PB5和PA15作为SPI3引脚时,禁用JTAG后SPI3无法工作的主要原因及解决方案如下:
0x04 是针对F1/F4系列的旧偏移量。在STM32H7中,SYSCFG_PMC寄存器的正确偏移量是 0x08。 // 错误:SYSCFG_BASE + 0x04
// 正确:SYSCFG_BASE + 0x08
#define SYSCFG_PMC_REG (*(__IO uint32_t *)(SYSCFG_BASE + 0x08))SWJ_CFG位位于SYSCFG_PMC寄存器的位[26:24],而您的代码移位了23位(0x7 << 23),导致配置值未能正确设置。 // 错误:移位23位 (0x7 << 23)
// 正确:移位24位 (0x7 << 24)
SYSCFG_PMC_REG = (SYSCFG_PMC_REG & ~(0x7 << 24)) | (0x2 << 24); #include "stm32h7xx.h"
void DisableJTAG_EnableSWD(void) {
__HAL_RCC_SYSCFG_CLK_ENABLE();
SYSCFG->PMC &= ~SYSCFG_PMC_SWJ_CFG_Msk; // 清除原有配置
SYSCFG->PMC |= SYSCFG_PMC_SWJ_CFG_1; // 设置0x2: 仅SWD模式 (JTAG禁用)
}main()函数最开头调用禁用函数: int main(void) {
DisableJTAG_EnableSWD(); // 必须优先执行
HAL_Init();
SystemClock_Config();
MX_SPI3_Init(); // 初始化SPI3
// ...其他代码
}验证点:
检查生成的GPIO初始化代码:
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; // H7中SPI3的复用号
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// PA15同理
GPIO_InitStruct.Pin = GPIO_PIN_15;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); __HAL_RCC_SPI3_CLK_ENABLE();Debug选项卡中,确认选择的是Serial Wire(SWDIO+SWCLK占用PA13/PA14,不影响PB3/PB4/PA15)。void DisableJTAG_EnableSWD(void) {
__HAL_RCC_SYSCFG_CLK_ENABLE();
// 正确操作SYSCFG->PMC寄存器
SYSCFG->PMC &= ~SYSCFG_PMC_SWJ_CFG_Msk; // 清除位[26:24]
SYSCFG->PMC |= SYSCFG_PMC_SWJ_CFG_1; // 设置010:仅SWD模式
}
int main(void) {
DisableJTAG_EnableSWD(); // 必须在所有外设初始化前调用
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI3_Init();
while (1) { /* ... */ }
}SYSCFG->PMC的值应为0x02000000(位[26:24]=010)。GPIOx_AFR寄存器确认PB3/PB4/PB5/PA15复用为SPI3(AF6)。通过以上修正,PB3/PB4/PB5/PA15的JTAG功能被正确禁用,SPI3应能正常使用。如有进一步问题,请验证寄存器实际值或提供SPI初始化代码细节。
举报
更多回帖