本帖最后由 王小琪 于 2023-1-9 18:10 编辑
一、STM32使用JLINK下载程序两种方式的区别
STM32使用JLINK下载程序有两种方式,一种是JTAG一种是SWJ。区别是JTAG需要20个插头,SWJ只需要4个插头。所以出于种种原因,节约IO口啦,便于布局走线啦,减小PCB的尺寸啦等等原因,一般选择SWJ下载方式。
SWJ下载需要四个引脚,分别是VCC、GND、PA13/SWDIO、PA14/SWCLK。即只需要单片机的两个IO即可。我们可以看到PA13和PA14默认功能即为SWDIO和SWCLK,所以不需要进行任何配置,即可进行程序下载。相反,如果想要将其当做普通IO,才需要进行一系列配置。
常规的SWJ下载口硬件连接如下,四个引脚分别为VCC,SWDIO接上拉电阻、SWCLK接下拉电阻、GND。所以当PA13,P14当下载口的时候,用万用表测量PA13为3.3V,PA14为0V。
二、如何将PA13/PA14当做普通IO使用
使能GPIOA,AFIO复用时钟
禁用SWD下载
配置GPIO GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能PA端口AFIO时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable , ENABLE);//禁用SWD下载
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_13|GPIO_Pin_14);
int main(void)
{
LED_Init();
while(1)
{
LED0=0;
GPIO_SetBits(GPIOA,GPIO_Pin_13);
GPIO_SetBits(GPIOA,GPIO_Pin_14);
}
}
主函数里面是PA13和PA14输出高电平,万用表测量确实都为高电平,说明程序下载成功,且PA13 PA14成功配置为IO输出。
三、PA13和PA14当做普通IO后,无法下载程序怎么办
弊端也随之而来,当你修改程序,重新下载的时候,哦吼,程序下载失败
点开魔术棒发现读不到下载器
本来boot0是连接到GND的,这个时候就需要将boot0连到VCC,然后断电重启,你会发现可以读到下载器了。记得将程序中禁用下载器屏蔽掉,然后重新下载程序。
四、总结
PA13、PA14一般用来当做下载口,但是如果想要将其当做IO口来用,也是可以的,但是不建议将这两个口来做IO口,毕竟程序下载不进去是更大的麻烦,如果MCU有其他的IO,尽可能选择其他的IO,如果IO都用完了,那你还是选其他IO更多的MCU吧,总之不建议将这两个口当IO来使用。
同时如果发现程序下载不进去的情况,也可以通过上面的将boot0由低接高来试试。
|
@畅想天子 :复位键拉低这种方式我没试过,我都是用的改boot脚
复位键拉低,可以吗?