使用库函数把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功能流程如下:
- 向系统控制寄存器SYSCTRL2依次写入0x5A5A、0xA5A5,使能寄存器改写;
- 向系统控制寄存器SYSCTRL1.SWD_USE_IO写‘1’;
(此时SWD两个端口PA13(SWDIO)与PA14(SWDCLK)的GPIO功能生效) - 参考本系列MCU用户手册端口控制器章节中的操作模式,配置该两个端口的GPIO功能。**