STM32F1的JTAG、SWJ引脚,为 PA13/PA14/PA15/PB3/PB4。
单片机复位后,默认功能为 JTAG、SWJ。
而实际使用中,一般只使用 SWCLK、SWDIO这两个引脚做 Debug。其余的引脚可以空出来,重新定义为普通的 IO 来使用。
PA13/PA14/PA15/PB3/PB4 想要定义为 普通IO,需要进行一些额外的重定义配置。
1. 手册对JTAG、SWJ管脚的定义
2. 引脚重映射分为以下几种情况
#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */
#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */
#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */
(1)全功能 SWJ,JTAG没有JTRST。(PB4 可重映射为其他功能)
(2)禁用JTAG,启用SWJ。(PB3/PB4/PA15 可重映射为其他功能)
(3)完全禁用 SWJ和 JTAG。(PB3/PB4/PA13/PA14/PA15 均可重映射为其他功能)
SWJ、JTAG这些特殊引脚,只能使用以上3种重映射方法,不可对单独引脚重映射。
3. 配置代码
以最常用的配置方法为例:启用 SWJ,禁用 JTAG。(PB3/PB4/PA15 可重映射为其他功能)
GPIO_InitTypeDef GPIO_InitStructure;
/* 禁用 JTAG,PB3、PB4重定义为普通IO */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//使能PORTB口时钟、复用引脚PB3、PB4引脚
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭JTAG功能(PB3/4),只使用SWD(PA13/14)调试
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化
GPIO_ResetBits(GPIOB,GPIO_Pin_4); //PB.4 输出低
GPIO_ResetBits(GPIOB,GPIO_Pin_3); //PB.3 输出低
/* PA15重定义为普通IO */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能PORTA口时钟、复用引脚PA15引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化
GPIO_ResetBits(GPIOA,GPIO_Pin_15); //PA.15 输出低
注意事项:
(1)只能从 GPIO_Remap_SWJ_NoJTRST、GPIO_Remap_SWJ_JTAGDisable、GPIO_Remap_SWJ_Disable 这三种重定义方法中,挑选一种进行使用,不可对单独引脚进行重定义。
(2)重定义这些引脚时,也要同时使能 RCC_APB2Periph_AFIO 复用时钟。