[APM32F0] APM32F003 SWDIO SWCLK作为GPIO口使用

[复制链接]
 楼主| tiangengqiu 发表于 2022-10-30 18:49 | 显示全部楼层 |阅读模式
很多客户对产品进行MCU单片机选型的时候通常会考虑在性能保障的前提下,优先选择性价比高的芯片,极海APM32F003系列单片机是一款32位 Arm® Cortex® M0+内核,供电电压 2.0~5.5V,最高32K flash 最高4K RAM的高性价比的单片机,最低功耗在3.4ua左右,广受市场喜欢,目前在接受客户开发的过程中有遇到需要将JTAG SWDIO SWCLK 对应的应脚 PD1 和 PD2作为GPIO口使用的场景,但是反馈无法正常变化高低电平。
使用APM32F003F6P6,开发板测试代码情况如下:
    GPIO_Config_T gpioConfig;
                gpioConfig.mode = GPIO_MODE_OUT_OD;
                gpioConfig.pin = GPIO_PIN_2;
                gpioConfig.speed = GPIO_SPEED_10MHz;
                GPIO_Config(GPIOD, &gpioConfig);
                GPIO_SetBit(GPIOD, GPIO_PIN_2);
    while(1)
    {
        Delay();
        GPIO_Toggle(GPIOD, GPIO_PIN_2);
   }
JTAG SWCLK 对应的PD2设置为开漏输出,使用示波器发现引脚没有电平变化。
难道JTAG配置成GPIO需要增加特殊代码?所以赶紧查看用户手册。
JTAG接口 JTAGwInterfacewDisable
0:使能 JTAG接口; PD1为 SWDIO PD2为 SWCLK
1:禁止 JTAG接口; PD1和 PD2为普通 IO
手册建议配置PD1 PD2作为普通IO需要设置寄存器 JTAGDIS 为 1
void GPIO_EnableSWD(void)
{*(uint8_t *)(GPIOD_BASE + 0x100) = 0x00;}
void GPIO_DisableSWD(void)
{  *(uint8_t *)(GPIOD_BASE + 0x100) = 0x01;}
添加GPIO_DisableSWD();使能JTAGDIS 为 1后仍然发现示波器无法变化电平。失能SWD后,断点确实进不去了,函数确实生效了,这时就有点奇怪了。
同时修改引脚为PD1惊奇发现,PD1能正常变化高低电平。去除GPIO_DisableSWD();重新编译后,PD1也正常能变化高低电平。
难道是PD2输出能力不足?
此时将PD2飞线到灯板发现,发光二极管居然能微微亮灭,想起代码是开漏输出的配置,再次修改为GPIO_MODE_OUT_PP,推挽输出模式,发现PD2正常变化高低电平。
记录此文,分享,提醒GPIO模式的差异...

软核硬核 发表于 2022-11-3 16:53 | 显示全部楼层
一般SWD不会作为正常IO口用吧,除非IO口真的就差这两个引脚,不过一般真不建议。
芯路例程 发表于 2022-11-3 16:54 | 显示全部楼层
把SWDIO SWCLK作为GPIO口使用,会不会影响下载程序?
 楼主| tiangengqiu 发表于 2022-11-8 17:44 | 显示全部楼层
芯路例程 发表于 2022-11-3 16:54
把SWDIO SWCLK作为GPIO口使用,会不会影响下载程序?

如果使能 禁止 JTAG接口 寄存器需要重新上电识别,一般Keil会比较难下载,Jflash先擦除程序后恢复正常
芯路例程 发表于 2022-12-4 11:50 | 显示全部楼层
tiangengqiu 发表于 2022-11-8 17:44
如果使能 禁止 JTAG接口 寄存器需要重新上电识别,一般Keil会比较难下载,Jflash先擦除程序后恢复正常 ...

那还是不要改成GPIO用比较好!
pentruman 发表于 2022-12-4 20:32 | 显示全部楼层
这个最好不要禁用的。              
updownq 发表于 2022-12-4 21:02 | 显示全部楼层
swd接口以后怎么下载程序?              
everyrobin 发表于 2022-12-4 21:32 | 显示全部楼层
为什么必须使用 SWDIO SWCLK?
woai32lala 发表于 2022-12-5 14:30 | 显示全部楼层
everyrobin 发表于 2022-12-4 21:32
为什么必须使用 SWDIO SWCLK?

把CPU资源压榨到极致,最好别用,仿真会出问题
qiufengsd 发表于 2022-12-5 21:56 | 显示全部楼层
怎么才能修改为 SWDIO SWCLK口呢?
febgxu 发表于 2022-12-5 23:08 | 显示全部楼层
感觉 SWDIO SWCLK必要禁用,否则后期无法下载程序。
jonas222 发表于 2022-12-6 14:27 | 显示全部楼层
这个就是复用的功能,需要修改掉的。
Undshing 发表于 2023-1-3 15:45 | 显示全部楼层
SWD一般不会作为正常IO口用
macpherson 发表于 2023-2-6 15:51 | 显示全部楼层
这个影响单片机的操作的吧。              
modesty3jonah 发表于 2023-2-6 16:00 | 显示全部楼层
然后怎么下载程序呢?              
maudlu 发表于 2023-2-7 21:14 | 显示全部楼层
设置为普通I/O口,单片机被锁定,不能再次下载程序。
beacherblack 发表于 2023-2-8 19:27 | 显示全部楼层
默认就是用于SWJ调试的吧               
juliestephen 发表于 2023-2-8 20:07 | 显示全部楼层
需加上拉1K-4.7K左右,不加的话如果你的JLINK内部没有上拉,在下载和调试时有可能会不稳定。反正我是吃过一次亏了。
MLRS 发表于 2023-2-9 08:58 | 显示全部楼层
运用挺灵活
wwppd 发表于 2023-3-5 11:16 | 显示全部楼层
SWDIO SWCLK也可以实现复用吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

12

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部