打印
[研电赛技术支持]

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题

[复制链接]
4056|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wiba|  楼主 | 2023-10-17 16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在实际开发中,经常会遇到引脚资源受限需要将一些具有特定功能的引脚配置为普通引脚或其他引脚功能使用的情况。

博主之前遇到过类似的情况,都正常解决了。但偶尔也会出现在配置引脚时少了一些配置,结果导致代码运行时偶尔出现问题,最终排查出了是引脚配置问题,因此特地记录下来,供有需求的同学参考。

以GD32F307为例,在使用外置sram芯片时,使用了PB3、PB4作为SPI通讯的SCK和MISO引脚。
在代码编写和调试时,忽视了PB3和PB4的默认功能是JTDO和NJTRST功能,直接将PB3、PB4当做普通SPI引脚使用,由于我调试时一致使用JLINK连接芯片进行在线调试,在这个时候sram芯片的驱动一直正常,读写数据也正常,也导致我再一开始没有发现这个问题。

后来交给测试人员测试功能时,反馈有时候出现数据丢失的情况。博主排查后发现是sram读写数据失败导致,用示波器排查波形发现在在读写sram时,SCK没有时钟信号发出。博主很奇怪,为何之前调试时没有出现过这种情况?于是乎,连接上JILNK在线调试,用示波器一看,果然,此时sram读写数据都是SCK线上是有正常时钟发出的。。。

在这种情况下,排查了数据手册(datasheet)上SPI相关的引脚,结果发现了问题的根本所在:PB3引脚默认功能为JTDO,PB4引脚默认功能是NJTRST,他们是JTAG调试方式时用的,博主使用的是SWD的方式,且这两个引脚要配置为SPI功能需要做重定向处理,即将关闭这两个引脚JTAG相关功能,这样配置之后,测试发现一切正常了。


#define GPIO_SWJ_NONJTRST_REMAP          ((uint32_t)0x00300000U | (PCF0_SWJ_CFG(1) >> 16))                /*!< full SWJ(JTAG-DP + SW-DP),but without NJTRST */
#define GPIO_SWJ_SWDPENABLE_REMAP        ((uint32_t)0x00300000U | (PCF0_SWJ_CFG(2) >> 16))                /*!< JTAG-DP disabled and SW-DP enabled */
#define GPIO_SWJ_DISABLE_REMAP           ((uint32_t)0x00300000U | (PCF0_SWJ_CFG(4) >> 16))                /*!< JTAG-DP disabled and SW-DP disabled */
#define GPIO_SPI2_REMAP                  ((uint32_t)0x00200000U | (AFIO_PCF0_SPI2_REMAP >> 16))           /*!< SPI2 remapping*/



代码如下:

/**
* @brief    sram spi配置
* @param    None
* @retval   None
*/
void sram_spi_init(void)
{
    spi_parameter_struct spi_init_struct;

    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_GPIOE);
    rcu_periph_clock_enable(RCU_SPI2);

    /* SPI2_SCK: PB3
     * SPI2_MISO:PB4
     * SPI2_MOSI:PB5
     * SPI2_CS:  PE1
     * HOLD:     PE0
     */
    gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);/*PB3、PB4默认为JTAG引脚,使用SPI需失能JTAG功能,否则会导致SPI引脚功能异常,如:不DEBUG时SCK不产生时钟*/

    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_5);//MISO引脚可配置为推挽输出、浮空输入、上拉输入皆可
    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4);

    gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);//此处硬件改线占用了板子DI引脚,后续硬件版本会有改动
    gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);/*HOLD引脚设置为1禁用该功能*/

    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;//重要!重要!重要!该SRAM芯片需要配置为时钟空闲时为低电平,在第一个跳变沿采样
    spi_init_struct.nss                  = SPI_NSS_SOFT;//默认为软件NSS
    spi_init_struct.prescale             = SPI_PSC_8;//注意SPI芯片支持的最高速率
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI2, &spi_init_struct);

    SPI_SRAM_CS_HIGH();//初始拉高CS
    SPI_SRAM_HOLD_HIGH();//HOLD默认为高,禁用该功能,否则可能导致读写失败

    spi_enable(SPI2);
}



因此,在使用到引脚PA13、PA15、PB3、PB4等比较特殊的引脚时,一定仔细查看下手册上的定义再进行配置。
————————————————
版权声明:本文为CSDN博主「stand_young」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44612435/article/details/133700581

使用特权

评论回复
沙发
tpgf| | 2023-11-1 09:48 | 只看该作者
配置为普通引脚使用之后还能作为下载引脚使用吗

使用特权

评论回复
板凳
nawu| | 2023-11-1 12:00 | 只看该作者
如何判定相关下载引脚是否可以当成普通的引脚使用呢

使用特权

评论回复
地板
aoyi| | 2023-11-1 12:32 | 只看该作者
如何自如的在同一个引脚的不同功能之间进行切换呢

使用特权

评论回复
5
zljiu| | 2023-11-1 12:55 | 只看该作者
我们是不是不能把普通的引脚定义为下载引脚呢

使用特权

评论回复
6
tfqi| | 2023-11-1 13:33 | 只看该作者
修改为普通引脚之后还能下载程序吗

使用特权

评论回复
7
gwsan| | 2023-11-1 23:00 | 只看该作者
这种处理能适用于全系列的单片机吗

使用特权

评论回复
8
maqianqu| | 2023-11-5 14:47 | 只看该作者
可以设置这些引脚的输出电平为你想要的电平

使用特权

评论回复
9
lzbf| | 2023-11-5 15:23 | 只看该作者
需要注意关闭相关功能、重新映射引脚功能、检查引脚配置

使用特权

评论回复
10
mikewalpole| | 2023-11-5 15:52 | 只看该作者
在配置过程中,注意选择正确的方向控制寄存器

使用特权

评论回复
11
benjaminka| | 2023-11-5 16:27 | 只看该作者
GD32的PB3、PB4默认是使用复用功能的,具体来说,PB3默认功能为JTDO,PB4默认功能是NJTRST,他们是JTAG调试方式时用的。

使用特权

评论回复
12
mickit| | 2023-11-5 17:13 | 只看该作者
在配置引脚为普通引脚时,需要注意关闭引脚的相关功能,如JTDO、NJTRST等,否则可能会导致系统不稳定。

使用特权

评论回复
13
mmbs| | 2023-11-5 17:43 | 只看该作者
要初始化相关的GPIO端口              

使用特权

评论回复
14
bartonalfred| | 2023-11-5 18:15 | 只看该作者
建议查阅相关数据手册,了解其默认功能和使用方法

使用特权

评论回复
15
yorkbarney| | 2023-11-5 20:50 | 只看该作者
在将引脚配置为普通引脚后,需要进行引脚连接的可靠性检查,以确保引脚能够可靠地连接到其他电路或设备。

使用特权

评论回复
16
10299823| | 2023-11-5 21:33 | 只看该作者
需要将这些引脚配置为普通引脚,可能需要进行重定向处理。

使用特权

评论回复
17
plsbackup| | 2023-11-5 21:57 | 只看该作者
保引脚的电源和接地稳定,避免因为电源波动或接地问题导致的系统错误。

使用特权

评论回复
18
uytyu| | 2023-11-6 15:37 | 只看该作者
需要设置这些引脚的输出模式为“推挽输出”或者“开漏输出”

使用特权

评论回复
19
juliestephen| | 2023-11-6 20:00 | 只看该作者
根据实际应用需求,配置引脚的电平转换功能。在配置过程中,注意使用合适的寄存器(如GPIOxLVL)和电平转换控制寄存器(如GPIOxCTL)。

使用特权

评论回复
20
usysm| | 2023-11-6 22:24 | 只看该作者
必须关闭硬件复用,可以使用GPIO_InitTypeDef结构体中的GPIO_Mode寄存器进行设置。

使用特权

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

本版积分规则

77

主题

3312

帖子

3

粉丝