HC32F170 SWD端口转为普通io口再复用为uart0

使用库函数把SWD下载端口PA13 PA14 分别复用为UART0_RXD UART0_TXD的方法
1、找到库函数
在sysctrl.c的文件中有下面这个函数,是用来设置特殊的复用

/**
*******************************************************************
 ** \brief 系统功能设定
 ** \param [in]  enFunc     系统功能枚举类型
 ** \param [in]  bFlag      1-开/0-关
 ** \retval      Ok         设定成功
 **             其他        设定失败
****************************************************************/
en_result_t Sysctrl_SetFunc(en_sysctrl_func_t enFunc, boolean_t bFlag)
{
    _SysctrlUnlock();
    SetBit((uint32_t)(&(M0P_SYSCTRL->SYSCTRL1)), enFunc, bFlag);

    return Ok;
}

2.找到 SysctrlSWDUseIOEn
在sysctrl.h中有一个枚举 SysctrlSWDUseIOEn ,这个就是我们要使用的,

/**
 *********************************************************************
 ** \brief 系统控制模块其他功能数据类型定义
 ********************************************************************/
typedef enum en_sysctrl_func
{
    SysctrlEXTHEn           = 1u,  ///< 使能外部高速时钟从输入引脚输入
    SysctrlEXTLEn           = 2u,  ///< 使能外部低速速时钟从输入引脚输入
    SysctrlXTLAlwaysOnEn    = 3u,  ///< 使能后XTL_EN只可置位
    SysctrlClkFuncRTCLpmEn  = 5u,  ///< 使能RTC低功耗模式
    SysctrlCMLockUpEn       = 6u,  ///< 使能后CPU执行无效指令会复位MCU
    SysctrlSWDUseIOEn       = 8u,  ///< SWD端口设为IO功能
}en_sysctrl_func_t;

3设置方法
在GPIO初始化之前添加这条语句

Sysctrl_SetFunc(SysctrlSWDUseIOEn, TRUE));

可以通过返回值来判断是否设置成功 例如:点亮一个led灯

if (Ok == Sysctrl_SetFunc(SysctrlSWDUseIOEn, TRUE)) //SWD复用为普通IO
{
	Gpio_ClrIO(STK_LED2_PORT, STK_LED2_PIN);
}

最后结尾:为什么要这样设置?分析这个库函数Sysctrl_SetFunc()的实现方法:官方文档应用笔记《SWD端口复用为GPIO功能Rev1.2》中有说明不在赘述。

3 SWD复用为GPIO功能
3.1 SWD端口复用为GPIO功能
SWCLK(PA14)与SWDIO(PA13)引脚可以复用为GPIO。
SWD复用GPIO功能流程如下:

  1. 向系统控制寄存器SYSCTRL2依次写入0x5A5A、0xA5A5,使能寄存器改写;
  2. 向系统控制寄存器SYSCTRL1.SWD_USE_IO写‘1’;
    (此时SWD两个端口PA13(SWDIO)与PA14(SWDCLK)的GPIO功能生效)
  3. 参考本系列MCU用户手册端口控制器章节中的操作模式,配置该两个端口的GPIO功能。**

你可能感兴趣的:(HC32F170,单片机)