项目场景:
在使用华大MCU_HC32F460进行开发时,由于资源分配问题,原本用来调试的PA13、PA14、PA15引脚被复用成了USART的通信引脚。在按照配置USART通信引脚的流程对PA13、PA14引脚进行配置后无法正常通信。
问题描述:
单独对PA13、PA14进行GPIO配置,并简单编写一段程序使其一段时间内循环翻转电平点亮LED灯。观察得知,LED未出现预期的闪烁状态,且用逻辑分析检测未看到任何电平翻转现象。
@Override
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Enable;
/* LED0 Port/Pin initialization */
PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);
/* LED1 Port/Pin initialization */
PORT_Init(LED1_PORT, LED1_PIN, &stcPortInit);
/* LED2 Port/Pin initialization */
PORT_Init(LED2_PORT, LED2_PIN, &stcPortInit);
/* LED3 Port/Pin initialization */
PORT_Init(LED3_PORT, LED3_PIN, &stcPortInit);
while(1)
{
LED0_TOGGLE();
Ddl_Delay1ms(DLY_MS);
LED1_TOGGLE();
Ddl_Delay1ms(DLY_MS);
LED2_TOGGLE();
Ddl_Delay1ms(DLY_MS);
LED3_TOGGLE();
Ddl_Delay1ms(DLY_MS);
/* de-init if necessary */
//PORT_DeInit();
};
原因分析:
PA13、PA14作为调试引脚在底层默认中可能存在更高的优先级,即使我们按照GPIO配置流程将PA13、PA14复用配置为其它功能,但在底层设置中PA13、PA14脚作为SWD调试引脚的优先级更高导致我们对其的配置无效。解决方案:
在浏览了HC相关的库函数之后,发现了能够屏蔽SWD调试的相关函数,在配置PA13、PA14之前关闭其调试使能即可进行后续操作。
@ddl
/**
*******************************************************************************
** \brief Special control register Setting
**
** \param [in] u8DebugPort Debug port setting register, This parameter
** can be any composed value of @ref en_debug_port_t
**
** \param [in] enFunc The new state of the debug ports.
** \arg Enable Enable.
** \arg Disable Disable.
**
** \retval Ok Debug port set successful
**
******************************************************************************/
en_result_t PORT_DebugPortSetting(uint8_t u8DebugPort, en_functional_state_t enFunc)
{
/* parameter check */
DDL_ASSERT(IS_VALID_DEBUGPIN(u8DebugPort));
DDL_ASSERT(IS_FUNCTIONAL_STATE(enFunc));
PORT_Unlock();
if (Enable == enFunc)
{
M4_PORT->PSPCR |= (uint16_t)(u8DebugPort & 0x1Ful);
}
else
{
M4_PORT->PSPCR &= (uint16_t)(~(u8DebugPort & 0x1Ful));
}
PORT_Lock();
return Ok;
}
(注意:如果屏蔽SWD,那么Jlink将无法下载程序,需要使用华大的ISP工具+短接Boot模式烧写)
在配置前添加如下代码,即可解决:
PORT_DebugPortSetting(TCK_SWCLK,Disable);
PORT_DebugPortSetting(TMS_SWDIO,Disable);
或者屏蔽全部调试引脚使能
PORT_DebugPortSetting(ALL_DBG_PIN,Disable);