STM32
直播中

刘慧

8年用户 1865经验值
私信 关注
[问答]

stm32h7用pb3、pb4、pb5、pa15做spi3后,mx组态时debug选择serial wire,程序里加了禁用jtag,spi3口不能工作的原因?

如题
void DisableJTAG_EnableSWD(void){// 1. 启用SYSCFG时钟__HAL_RCC_SYSCFG_CLK_ENABLE();
如题,并且程序里加了禁用jtag函数:// 2. 使用寄存器偏移位置 (SYSCFG_PMC寄存器偏移0x04)
define SYSCFG_PMC_REG ((__IO uint32_t )(SYSCFG_BASE + 0x04))

// 3. 设置位[25:23]为0x2 (SWD启用,JTAG禁用)SYSCFG_PMC_REG = (SYSCFG_PMC_REG & ~(0x7 << 23)) | (0x2 << 23);
}

回帖(1)

王璐

2025-7-15 17:01:16

在STM32H7上使用PB3、PB4、PB5和PA15作为SPI3引脚时,禁用JTAG后SPI3无法工作的主要原因及解决方案如下:


1. JTAG禁用寄存器偏移错误



  • 问题:您使用的寄存器偏移量 0x04 是针对F1/F4系列的旧偏移量。在STM32H7中,SYSCFG_PMC寄存器的正确偏移量是 0x08

  • 修正
     // 错误:SYSCFG_BASE + 0x04
    // 正确:SYSCFG_BASE + 0x08
    #define SYSCFG_PMC_REG (*(__IO uint32_t *)(SYSCFG_BASE + 0x08))


2. SWJ_CFG位位置错误



  • 问题:STM32H7的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禁用)
    }


3. 调用时机问题



  • 问题:若JTAG禁用函数在SPI初始化之后调用,GPIO引脚仍被JTAG占用,导致SPI无法使用这些引脚。

  • 解决:在main()函数最开头调用禁用函数:
     int main(void) {
         DisableJTAG_EnableSWD();  // 必须优先执行
         HAL_Init();
         SystemClock_Config();
         MX_SPI3_Init();           // 初始化SPI3
         // ...其他代码
    }


4. GPIO复用配置问题




  • 验证点



    • 在CubeMX中确认PB3/PB4/PB5/PA15已配置为SPI3功能(SCK/MISO/MOSI/NSS)。


    • 检查生成的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);





5. SPI时钟未使能



  • 确保在SPI初始化中开启SPI3时钟:
     __HAL_RCC_SPI3_CLK_ENABLE();


6. 调试配置验证



  • 在CubeMX的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) { /* ... */ }
}

补充检查



  1. 逻辑分析仪/示波器:检查SPI引脚是否有信号输出,确认硬件连接正常。

  2. 寄存器状态:在调试中查看:

    • SYSCFG->PMC的值应为0x02000000(位[26:24]=010)。

    • GPIOx_AFR寄存器确认PB3/PB4/PB5/PA15复用为SPI3(AF6)。


  3. 编译后引脚映射:确保未在其他代码中覆盖引脚配置。


通过以上修正,PB3/PB4/PB5/PA15的JTAG功能被正确禁用,SPI3应能正常使用。如有进一步问题,请验证寄存器实际值或提供SPI初始化代码细节。

举报

更多回帖

×
20
完善资料,
赚取积分