打印
[APM32F1]

利用AFIO配置释放JTAG专用引脚,增加可用IO数

[复制链接]
102|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
joengchao|  楼主 | 2023-12-28 18:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
软件工程师调试新项目的板子遇到了一个奇怪的问题,一共10颗LED的产品,只有8颗可以闪动,而且每一块板子都能重现,明明使用了完全一致的外围设计和代码,怎么回事?出现问题的2颗LED是设计在PB3、PB4两个引脚外面的,按理说打开GPIOB的配置就可以了:
    /* Enable the GPIO_LED Clock */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);
实际却不行,在示波器上发现推挽输出切换完全没有效果。换到开发板上调试,竟然有相同的结果!难道这两个GPIO就不能当作推挽输出使用吗?
按照数据手册的说法,这两个GPIO是5V容忍的常规引脚,支持输入和输出。不过特别的是,他们实际的默认名称分别为JTDO和NJTRST,是和JTAG接口有关的,研发告诉我,烧录接口换到SWD之后,还是失效的,不过真的是这样吗?


查阅用户手册就能发现,MCU在常规启动模式下,复位期间和刚复位后,复用功能未开启,I/O 端口将会被配置为浮空输入模式,此情况下输入模式禁用上拉/下拉电阻。复位后JTAG 引脚被置于输入上拉或下拉模式,具体配置如下: PA15:JTDI 置于上拉模式;PA14:JTCK 置于下拉模式; PA13:JTMS 置于上拉模式;PB4:JNTRST 置于上拉模式。要想释放JTAG接口,除了配置Keil(IDE)不再在仿真环节调用JTAG引脚之外,其实还要通过软件配置引脚功能的重映射,因为PB3、PB4的默认功能并不包括其GPIO功能,必须通过AFIO的指定寄存器去修改。

于是我找到了对应的库函数封装,是在AFIO下的引脚重映射函数,APM32F103系列比较特殊,它的复用功能并不复杂,全部可以由独立的寄存器控制。
GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE);

GPIO_Config_T  configStruct;
    /* Enable the GPIO_LED Clock */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);
    /* Configure the GPIO_LED pin */
configStruct.pin = GPIO_PIN_4 | GPIO_PIN_3;
configStruct.mode = GPIO_MODE_OUT_PP;
configStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOB, &configStruct);
研发把代码改好了,但是一去运行,坏了,没有效果!我翻遍了和烧录、GPIO相关的章节都没有找到答案,不过AFIO(复用功能输入输出)的手册是这样写的:
“对寄存器AFIO_EVCTRL AFIO_REMAP1/2和 AFIO_EINTSELx进行读写操作前,应当首先打开 AFIO的时钟。 APB2外设时钟 使能寄存器RCM_APB2CLKEN 。必须以字 32位 的方式操作这些外设寄存器。”
而我调用的库函数刚好就使用了其中的一个寄存器,所以加上开启AFIO时钟的语句之后就可以生效了~
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO);
GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE);
这次调试涉及的寄存器是SWJCFG,它的描述如下:
SWJCFG-配置串行线JTAG
配置SWJ和跟踪复用功能的 I/O是 作为调试 I/O还是 普通 I/O,适用于 GPIO不够用的情况 ,这些位只可由软件写,读这些位,将返回未定义的数值 。
SWJ 串行线 JTAG 支持 JTAG或 SWD访问 Cortex的调试端口,系统复位后的默认状态是启用 SWJ但没有跟踪功能;
000:完全 SWJ JTAG-DP+SW-DP
001:完全 SWJ JTAG-DP+SW-DP 但没有 NJTRST
010:关闭 JTAG-DP,启用 SW-DP
100:关闭 JTAG-DP,关闭 SW-DP
其它:无作用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

13

帖子

0

粉丝