YTM32的Flash应用答疑-详解禁用调试端口功能

绝大多数MCU产品在开发完成即将进入量产环节前,为了防止存放在芯片内部flash的程序被意外地篡改,通常会通过禁用下载调试端口,例如Arm核心的处理器使用的JTAG/SWD端口,以此实现读保护的效果。但是,使用禁用调试下载端口的功能时,一定要在应用程序中留一把“钥匙”,在必要的时候,可以通过其它的手段,例如通过UART串口发送一条命令,能够再恢复调试下载端口。

这就好比,锁上门不让未授权的人进屋子,但如果外面的人敲敲门,屋里面的人认识敲门的人,再把门打开,外面的人就可以进屋了。

Principles

各家MCU厂商对禁用调试端口的功能类似,需要将上锁和解锁的配置存放在一块掉电不丢失的存储空间中,以确保每次启动芯片时能自动生效。

以国产云途半导体设计发售的YTM32B1MD14微控制器(Arm Cortex-M33内核)为例,禁用和恢复JTAG/SWD端口的配置位于CUS_NVR区域中,这是一块映射到flash存储器的区域。如图x所示。

图x CUS_NVR在存储空间中的位置

其中,禁用JTAG/SWD端口的相关寄存器(存放在flash中),如下:

#define EMF_CUS_NVR_BASE_ADDR            0x10000400

/* for MD. */
#define EFM_CUS_NVR_CUS_KEY_VALUE_ADDR   0x10000400
#define EFM_CUS_NVR_DISABLE_JTAG_ADDR    0x10000408
#define EFM_CUS_NVR_EFM_PROT0_ADDR       0x10000410
#define EFM_CUS_NVR_EFM_PROT1_ADDR       0x10000418

#define EFM_CUS_NVR_TAG_VALUE            0x5A5A5A5A

需要通过EFM模块(Embedded Flash Module)执行特定的操作flash的命令,才能实现执行写入配置码或擦除配置的操作。在附件中源码工程的EFM模块驱动中,有对应的 API 可用:

uint32_t EFM_EraseNVR(EFM_Type * base, uint32_t addr);
uint32_t EFM_ProgramNVR(EFM_Type * base, uint32_t addr, uint32_t * pdata);
uint32_t EFM_ReadNVR(EFM_Type * base, uint32_t addr, uint32_t * pdata);

Practice & Examples

编写用例,演示和验证禁用和恢复YTM32B1MD14微控制器JTAG/SWD端口的功能。样例工程中,使用UART串口同上位机通信,开发者可以通过串口调试终端(例如Tera Term)同微控制器交互,执行上锁和解锁的操作。然后通过JLink调试器尝试连接微控制器内核进行调试的方式,验证调试端口是否可用。

Demo #1  禁用JTAG/SWD端口

运行用例:

  • 复位程序后,当串口调试终端问询 enable the disable jtag feature in cus nvr ? [Y/N]. 时,输入Y,则执行上锁操作。
  • 可以继续运行,看到从CUS_NVR中读到的EFM_CUS_NVR_DISABLE_JTAG_ADDR地址位置的值已经被配置为TAG值。如图x所示。

图x 配置禁用调试端口尚未生效

此时,配置操作尚未生效,从图x中可以,看到,调试器还能识别到处理器内核。

  • 复位后生效。芯片中的ROM会在硬件复位过程中自动读CUS_NVR并配置电路。

图x 配置禁用调试端口生效

在图x中可以看到,在程序中执行复位命令复位芯片后,再在Keil的调试配置对话框中单击Scan按钮,扫描调试器连接的处理器内核,已经找不到之前已经连接在调试总线上的内核了。

此时,验证锁定调试端口成功。

其中关键代码在于向CUS_NVR写数:

    printf("enable the disable jtag feature in cus nvr ? [Y/N].rn");
    ch = getchar();
    if ('Y' == ch) /* setup the cus_nvr. */
    {
        printf("yes.rn");
        /* erase the cus_nvr. */
        EFM_EraseNVR(BOARD_EFM_PORT, EMF_CUS_NVR_BASE_ADDR);
        
        /* program with new values. */
        uint32_t nvr_data[2];
        nvr_data[0] = EFM_CUS_NVR_TAG_VALUE;
        nvr_data[1] = EFM_CUS_NVR_TAG_VALUE;
        EFM_ProgramNVR(BOARD_EFM_PORT, EFM_CUS_NVR_DISABLE_JTAG_ADDR, nvr_data);
        
        /* need to reset to take affect. */
    }

Demo #2 恢复JTAG/SWD端口

运行用例:

  • 复位程序后,当串口调试终端问询 release the disable jtag feature in cus nvr ? [Y/N]. 时,输入Y,则执行解锁操作。
  • 可以继续运行,看到从CUS_NVR中读到的EFM_CUS_NVR_DISABLE_JTAG_ADDR地址位置的值已经被还原成全0xFF,如图x所示。

图x 配置恢复调试端口生效

此时,不用复位,就能够立即生效。重新扫描一下处理器内核,可以识别。验证成功。

其中,关键代码在于擦除CUS_NVR的预先配置,恢复成全0xFF

    printf("release the disable jtag feature in cus nvr ? [Y/N].rn");
    ch = getchar();
    if ('Y' == ch) /* setup the cus_nvr. */
    {
        printf("yes.rn");
        /* erase the cus_nvr. */
        EFM_EraseNVR(BOARD_EFM_PORT, EMF_CUS_NVR_BASE_ADDR);
    }

Conclusion

本文说明和演示了YTM32微控制器中禁用和恢复JTAG/SWD调试端口功能,在实验中,通过Keil的调试器属性对话框中,扫描Arm处理器内核的方法,验证了禁用和恢复JTAG/SWD调试端口的操作实际生效。

原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/79118.html

(0)
速盾高防cdn's avatar速盾高防cdn
上一篇 2024年5月30日 下午5:48
下一篇 2024年5月30日 下午5:52

相关推荐

  • 加密域名https被墙

    要解决https 被阻止的加密域名问题,用户应该使用受信任的https 代理服务器、使用VPN 服务、更改其DNS 服务器、使用Tor 浏览器或者可以选择使用解锁工具。合适的方法取…

    行业资讯 2024年5月11日
    0
  • 如何选择适合的服务器高防御方案?

    在云服务器行业,服务器高防御方案是非常重要的一项服务。它不仅可以保护服务器免受各种网络攻击的侵扰,还可以提升网站的稳定性和安全性。但是面对众多的高防御方案,如何选择适合自身需求的方…

    行业资讯 2024年3月20日
    0
  • 域名被墙了,域名被墙跳转服务器

    近年来,“IP封杀、域名变更”问题在互联网行业频频发生。但你知道什么是IP封锁吗?如果您的IP被封了,该如何解决呢?今天我们就来一起讨论一下这个话题,帮助您了解您的IP被封的原因以…

    行业资讯 2024年5月14日
    0
  • 蜘蛛搜索引擎推荐,蜘蛛搜索引擎app

    你听说过蜘蛛搜索引擎吗?这个神秘的术语在SEO行业中引起了很多关注。那么什么是SEO?它和蜘蛛搜索引擎有什么关系呢,别着急,我们一起来探讨一下。在这篇文章中,我们将揭秘蜘蛛搜索引擎…

    行业资讯 2024年3月19日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注