STM32单片机的调试接口一般有JTAG和SW两种,JTAG接口因为需要的管脚较多,故此仅在一些学习用的开发板上能够见到,批量化生产的产品中极少用到。而SW接口仅需要两个管脚(PA13和PA14),是使用较为普遍的调试接口。做为调试专用管脚,一旦在程序中将其设置为了普通GPIO,若想再通过SW调试则必须通过ISP方式下载新的程序(没有进行GPIO设置的程序),给调试带来很多不便。下面讨论如何做到PA13和PA14如果即能保证正常调试功能又可当GPIO的方法。

(1)做为输入管脚

当使用调试接口做为输出时,不需要进行什么特殊设置,在任何时候直接使用读取语句读取即可,不会影响到SW调试功能。

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_13);//读取PA13(SW_DAT)电平

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_14);//读取PA14(SW_CLK)电平

(2)做为输出管脚

在程序开始时判断当前是否连接了SW调试器,若未连接时才去设置PA13和PA14为输出GPIO。

重点是如何判断是否连接了调试器,我对STM32的函数库并不是特别熟悉,经过简单不负责任的寻找后并没有发现有这方面的现成函数,所以就土法上马了。

我们知道,如果连接了调试器时,不管是CLK还是DAT管脚,都会有无数的方波(调试嘛,一定是有方波的,要不然怎么进行数据交互),既然任何时候都可以用读取指令获取管脚的电平状态,那么只要判断一下是不是有电平变化就可以了(方波),下面是个粗暴的判断函数。

unsigned char PA14IsDBG=0;

unsigned char CheckPA14IsDBG(void)

{

unsigned short i,j,s;

if (PA14IsDBG==1) return 1;// PA14IsDBG是全局变量

for (i=0;i<100;i++)

{

s=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14);

for (j=0;j<1000;j++)

{

if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14)!=s)

{

PA14IsDBG=1;

UART1_SendString("Is Debug\r\n");

return 1;

}

//__NOP();

}

}

return 0;

}

上面的函数是使用PA14(SW_CLK)管脚进行检测,若使用PA13(SW_DAT)也同样是可以的。

设置PA14(SW_CLK)为输出

void SetPA14IsOut(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

If (PA14IsDBG) return;

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//完全禁用调试接口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA||RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//一定要是开漏输出

//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void SetPA14IsDbg(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//使能SW调试接口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA||RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

//设置PA14输出高低电平

void PA14OutH(void)

{

if (PA14IsDBG) return;

GPIO_SetBits(GPIOA, GPIO_Pin_14);

}

void PA14OutL(void)

{

if (PA14IsDBG) return;

GPIO_ResetBits(GPIOA, GPIO_Pin_14);

}

void main(void)

{

CheckPA14IsDBG();

SetPA14IsOut();

while (1)

{

PA14OutH();

Delay_ms(500);

PA14OutL();

Delay_ms(500);

CheckPA14IsDBGLK();

if (PA14IsDBG)          SetPA14IsDbg();

}

}

需要注意的几点:

(1)上电后,必须迟早调用CheckPA14IsDBG();

(2)在整个程序中,仅可调用一次SetPA14IsOut();且必须在CheckPA14IsDBG();之后。

(3)PA13或者PA14做为输出时,只能配置为开漏输出,这一点非常重要(其实修改一下代码也可以强推挽,明白其中原理就没有问题)。

(4)在程序运行过程中,要经常调用CheckPA14IsDBG();来检测是否有调试信号出现,以便恢复为SW功能。

(5)若单片机曾经在非调试状态运行过,则再次调试时可能失败,多试几次就好了。

(6)以上代码使用了PA14,同样适用于PA13,将代码中的PA14改为PA13即可。

鱼和熊掌兼得---STM32调试接口SW动态复用为GPIO的方法相关推荐

  1. 鱼和熊掌兼得——解密阿里云PCDN如何实现高质量低价格

    在内容分发领域,之前CDN产品一直占据着主导地位,CDN的质量好,但价格偏高,正应了那句老话"一分价钱一分货".质量和价格似乎是矛盾体,鱼和熊掌不可兼得.随着云计算的高速发展,不断 ...

  2. python gui web_一篇让你大开眼界的Python教程:让Web和GUI鱼和熊掌兼得

    本期教程给大家更新绝对让你大吃一惊的效果-web嵌入GUI 随着Web技术的蓬勃发展,以网页形式在浏览器上显示图表已经逐渐成为一种主流的形式. 网页的实现是由HTML.CSS和Javascript三者 ...

  3. 生活,又怎能鱼和熊掌兼得?

    ❣️ 身在井隅,心向璀璨| 第139篇 如何成为一名有钱的程序员,一直是我在思索的问题. 老婆说,"要脚踏实地,不要总是在做梦." 事实上,我也的确是在"脚踏实地&quo ...

  4. 新华三 VDI java,鱼和熊掌兼得:新华三vGPU云桌面方案革新VDI性能体验

    在过去的很长时间里,虚拟桌面基础架构(VDI)在企业办公环境中长短互现,其优势体现在海量部署时的可管理性.安全性.成本及能效方面,但面对一些特殊的应用场景,例如3D渲染.CAD.视频编辑等,VDI往往 ...

  5. 云端容灾演练,如何鱼和熊掌兼得?

    在数字化进程不断加快的今天,一个优秀的组织或企业都有一套优秀的灾备系统,而一套优秀的灾备系统一定也有一个与之匹配的灾备演练机制. 两千多年前,有个国王因为拿灾备演练当成儿戏,最后不仅丢了性命,还把江山 ...

  6. 鱼和熊掌兼得!这些应用是如何使用 Material Design 的?

    在任何产品团队看来,应用构建的速度.美学还有可用性常常是不可兼得的.但是现在,凭借最新版本的 Material Design,团队可以在不牺牲质量的情况下 "兼得鱼和熊掌".自从我 ...

  7. 机房租赁,如何鱼和熊掌兼得?

    对于企业而言,选择一个合适的机房来托管服务器,是一件需要深思熟虑的事情.机房的重点参数和运营商的服务能力就如鱼和熊掌,企业在选择的时候自然希望兼得.那么,关注以下几点,会帮助您选择到一个更合适的机房. ...

  8. DevOps与合规性:鱼和熊掌兼得指南

    本文转自微信号EAWorld.扫描下方二维码,关注成功后,回复"普元方法+",将会获得热门课堂免费学习机会!本文转自微信号EAWorld. 编者按:很多行业身处强力监管领域,因而格 ...

  9. 鱼和熊掌兼得:同时使用 JPA 和 Mybatis

    前言 JPA 和 Mybatis 的争论由来已久,还记得在 2 年前我就在 spring4all 社区就两者孰优孰劣的话题发表了观点,我当时是力挺 JPA 的,这当然跟自己对 JPA 熟悉程度有关,但 ...

  10. OpenCL/DirectX与CUDA,鱼和熊掌可以兼得?

    OpenCL/DirectX 与 CUDA ,鱼和熊掌可以兼得? 什么是 OpenCL ? OpenCL ( Open Computing Language )是一个为异构平台( CPU . GPU ...

最新文章

  1. 启动项目时出现java.io.EOFException异常。
  2. hdu4915 判断括号匹配
  3. Codeforces Round #265 (Div. 1) C. Substitutes in Number dp
  4. kafka消息存储原理及查询机制
  5. ios 自动内存管理 ARC
  6. python可视化添加文本_python Matplotlib基础--如何添加文本和标注
  7. Spring Boot 扩展点应用之工厂加载机制
  8. 2018年,该转行AI工程师吗?
  9. VS2017编译UE4.19.2报错
  10. 【第七章】 springboot + retrofit
  11. 08-Scrum过程-办公环境 每日立会(Standup Meeting)
  12. 深入解析物联网操作系统(架构/功能/实例分析)
  13. 入行老师-郭靖(亦师亦友)同学
  14. 自由软件基金会官宣Zoë Kooyman担任新执行董事
  15. vue element ui_vue+element-ui实现表格里嵌套表格
  16. java调用百度api完成人脸识别
  17. NT、Novell、Unix服务器的互连
  18. JSON字符串中带有反斜杠
  19. 数字图像处理入门-邻域、连通性、通路和距离
  20. 记录——kubeadm集群node节点加入

热门文章

  1. 在AD中安装元件和封装库
  2. Linux下使用libevent库实现服务器端编程
  3. WPF基本布局(Grid、StackPanel)
  4. VVC/JEM代码学习17:xCheckRDCostMerge2Nx2NFRUC
  5. SQL Server数据库出现恢复挂起时的解决办法
  6. 2021安徽安全员B证考试多选练习题库
  7. 计算机 线性代数答案,2013-2014-1《线性代数》计算机B答案
  8. 使用OS X base System在线安装Mac OS到U盘及使用U盘恢复Mac OS
  9. Win32写一个极简定时关机软件的全部过程讲解
  10. iOS UIFont 字体名称大全,图解及使用方法