很多客户对产品进行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模式的差异...
|