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),传入你需要进行配置的功能参数。
N32G4系列——复用功能重映射(USART为例)的更多相关文章
- 嵌入式02 STM32 实验01 端口复用和重映射
内设与外设: 端口复用和端口重映射都需要了解内设和外设,那么什么是内设?什么是外设? 内设:单片机内部集成的功能一般包括:串口模块.SPI模块(Serial Peripheral Interface ...
- STM32管教复用与重映射关系
摘自:http://blog.csdn.net/lincheng15/article/details/51789093 概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出 2.其他外设的输入 ...
- (十)stm32 GPIO口复用,重映射 RCC_APB2Periph_AFIO
什么时候需要用到RCC_APB2Periph_AFIO--复用IO时钟的使用 需要用到外设的重映射功能时才需要使能AFIO的时钟 外部中断(EXTI)中与AFIO有关的寄存器是AFIO-EXTICR1 ...
- 【OpenCV新手教程之十七】OpenCV重映射 & SURF特征点检測合辑
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨) ...
- 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...
- STM32F0系列MCU中断向量表的重映射
最近使用了一款Cortex-M0内核的芯片STM32F030CC,发现它中断向量表的重映射方法与STM32F10x系列的有所区别,在这里记录与分享一下. 由于需要通过IAP进行固件升级,所以芯片的FL ...
- 痞子衡嵌入式:利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT部分型号上新增的FlexSPI Remap功能. OTA升级设计几乎是每个量产客户都绕不开的话题,产品发布后免不了要做固件( ...
- STM32 UART 重映射
在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32 上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内 ...
- stm8 io口重映射
STM8S003F3端口可以设置重映射,如pin16的PC6管脚,默认复用功能是SPI_MOSI功能,可以重映射为TIM1_CH1,也就是timer1的1通道.映射方式并不像STM32那样有个AFR寄 ...
随机推荐
- Spring源码 17 IOC refresh方法12
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- centos/windows服务器,Mysql数据库表结构损坏-已解决
[问题原因]服务器突然断电 [故障报告]数据库表结构损坏 [解决思路]进入强制恢复模式,备份库表及数据重建 故障发现 周末公司断电,周一启动数据库就直接报错了 查看日志 上面标记的log,明确表示是非 ...
- 图解OSI七层模型
七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系.它是一个七层的.抽象的模型体 ...
- 对DDD使用的一些建议
群里经常看到类似于"看了DDD之后就不会写代码了"的情况,趁最近学车的间隙,写写我的看法. 关于这个事儿,我是觉得:当没有DDD的时候,如果你知道怎么做,那就那么做好了,不要考虑D ...
- CF453C Little Pony and Summer Sun Celebration(构造、贪心(?))
CF453C Little Pony and Summer Sun Celebration 题解 这道题要求输出任意解,并且路径长度不超过4n就行,所以给了我们乱搞构造的机会. 我这里给出一种构造思路 ...
- 硬核剖析Redis单线程为什么那么快?
(本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术,助力职业发展) Redis目前是使用率最高的内存库数据库,是企业应用开发的必备, ...
- 1000粉!使用Three.js实现一个创意纪念页面 🏆
声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 不知不觉,掘金关注者人数已经超过 1000 人,因此特地做了这个页面纪念一 ...
- 输入法词库解析(七)微软用户自定义短语.dat
详细代码:https://github.com/cxcn/dtool 前言 微软拼音和微软五笔通用的用户自定义短语 dat 格式. 解析 前 8 个字节标识文件格式 machxudp,微软五笔的 le ...
- 《Java基础——循环语句》
Java基础--循环语句 1. while语句: 规则: 1. 首先计算表达式的值. 2. 若表达式为真,则执行循环语法,直至表达式为假,循环结束. 格式: while(表达式) 语句 ...
- uniapp|微信小程序获取当前城市名称--逆地址解析
六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,只分享技术干货,项目实战经验 关注博主不迷路~ 问题 uniapp开发的小程序需要获取当前城市名称 解决步骤 看文档 当然是看uniapp文档,我 ...