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),傳入你需要進行配置的功能參數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM