N32G4系列——复用功能重映射(USART为例)

开发测试环境:SDK,N32G455x系列芯片

在国民MCU中G系列IO口有第二复用功能,这时需要用到重映射功能。

一、系列芯片手册定义

1.1、芯片IO口默认功能查看

如图,在该系列芯片的数据手册中对引脚的复用有如下定义,默认USART1,引脚为PA9和PA10分别作为TX,RX。

 

1.2、IO口复用功能查看

 

当我们因为需求想要更改其余IO口作为 USART1的输入输出时,我们可以查找手册,看是否还有其余IO口可以有USART1的功能,查看手册发现PB6和PB7的复用功能(第二功能)可以作为USART1使用。

 

 

 同时根据该系列芯片的用户手册的GPIO口章节的复用章节得到如进行IO口引脚功能复用功能修改,需要修改AFIO_RMP_CFG寄存器中关于USART1的重映像为进行功能选择

 

在AFIO_RMP_CFG寄存器中关于USART1的重映像定义如下

 

 

 由以上可知,我们在使用过程中使用某个功能时,想要更改默认的IO口,使用其它IO口输出使用该功能,在确定可以有其余(除默认)复用功能IO后,如果该功能在新的IO口为第二功能(复用功能),那么我们不但要修改IO口,还要去对复用功能寄存器去修改,启用其第二复用功能。

 

二、程序演示。

打开一个具有UART功能的例程,或者在没有UART功能的例程中配置一个UART功能。

1、如果你使用的例程没有串口功能,添加串口功能

随意打开一个SDK中的例程,由于该例程没有USART功能,说以直接进行添加(使用USART1,引脚定义为PA9和PA10,波特率115200),程序添加如下:

配置UART功能:

void USART_Config(void)
{
    GPIO_InitType GPIO_InitStructure;
    USART_InitType USART_InitStructure;
   
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1, ENABLE);

    GPIO_InitStructure.Pin        = GPIO_PIN_9;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.Pin       = GPIO_PIN_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.BaudRate            = 115200;
    USART_InitStructure.WordLength          = USART_WL_8B;
    USART_InitStructure.StopBits            = USART_STPB_1;
    USART_InitStructure.Parity              = USART_PE_NO;
    USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
    USART_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;
    USART_Init(USART1, &USART_InitStructure);

    USART_Enable(USART1, ENABLE);        
}

重定向,是的在开发中可以使用c库的printf和scanf函数,添加如下:

添加头文件:

#include <stdio.h>

加入重定向函数

int fputc(int ch, FILE* f)
{
    USART_SendData(USART1, (uint8_t)ch);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXDE) == RESET)
        ;
    return (ch);
}

int fgetc(FILE* f)
{
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXDNE) == RESET)
        ;
    return (int)USART_ReceiveData(USART1);
}

然后在main中引用USART_Config,并加入:

printf("USART1功能引脚复用测试");

编译下载,用TTL转串口模块连接硬件和PC端,或者直接使用官方DK版连接PC端,使用打开串口调试助手可以看到:

 

 

 这说明串口功能加入成功。

如果没有成功,可能是有些头文件没有引入,可打开有串口的例程,仿照加入头文件。

2、串口引脚映射——更改输出引脚

根据手册我们先要更改引脚定义,由原来的PA9和PA10改为PB6和PB7。

RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
//改为
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);

 GPIO_InitStructure.Pin        = GPIO_PIN_9;
//改为
GPIO_InitStructure.Pin        = GPIO_PIN_6; 

 GPIO_InitStructure.Pin        = GPIO_PIN_10;
//改为
GPIO_InitStructure.Pin        = GPIO_PIN_7; 

//两个初始化
 GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
//改为
 GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);

使能AFIO的时钟和寄存器修改,由于是对GPIO口进行更改,那么查看芯片的gpio.h定义文件,看是否有定义函数可以帮助我们进行便捷的修改,根据函数意思,可以看到void GPIO_ConfigPinRemap(uint32_t RmpPin, FunctionalState Cmd);符合我们的需求,在该函数定义处,可以看到我们可以选择哪些参数(列出部分)。

 

 

//加入
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);

//配置重映射寄存器,使能重映射功能
GPIO_ConfigPinRemap(GPIO_RMP_USART1,ENABLE);

 

 

 

然后利用CH340(TTL转USB)模块连接PB6和PB7到PC端,打开串口:可以看懂对比输出如下,更改成功,原本的PA9和PB10已经没有了输出,从 PB6和PB7输出

 

 三、这是以串口为例,其余功能也是同样的道理。去利用void GPIO_ConfigPinRemap(uint32_t RmpPin, FunctionalState Cmd),传入你需要进行配置的功能参数。

 

posted @ 2022-04-21 15:10  星辰_stars  阅读(2337)  评论(0编辑  收藏  举报