[N32G43x] 关于GPIO复用功能重映射,一个外设映射到多个IO

[复制链接]
 楼主| Afanx 发表于 2023-3-14 10:32 | 显示全部楼层 |阅读模式
GPIO模块配置(二)【除N32G45x外其他系列】 https://bbs.21ic.com/icview-3276040-1-1.html

在测试GPIO复用功能时候发现一个有意思的现象,就是一个IO只能指定一个复用功能,这样可以避免一个IO同时做UART和SPI功能引脚。因为每个IO都有一个(GPIOx_AFL/GPIOx_AFH)寄存器知道复用功能。比如下面这个配置后PA9、PA10只能用作USART1功能。

  1. void UART_GPIO_Config(USART_Module* USARTx)
  2. {
  3.     GPIO_InitType GPIO_InitStructure;
  4.     if (USARTx == USART1) {
  5.         RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | RCC_APB2_PERIPH_GPIOA, ENABLE);
  6.         /* Tx--PA9  Rx--PA10 */
  7.         GPIO_InitStruct(&GPIO_InitStructure);
  8.         GPIO_InitStructure.Pin            = GPIO_PIN_9 | GPIO_PIN_10;
  9.         GPIO_InitStructure.GPIO_Mode      = GPIO_Mode_AF_PP;
  10.         GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
  11.         GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
  12.         GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
  13.     }
  14. }

但这时在想,如果其他IO也复用为USART1的引脚呢,比如PA4\PA5,PB6\PB7也同时配置为复用功能,并且都复用为USART1。
USART1_AF.jpg


  1. void UART_GPIO_Config(USART_Module* USARTx)
  2. {
  3.     GPIO_InitType GPIO_InitStructure;
  4.     if (USARTx == USART1) {
  5.         RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_GPIOB, ENABLE);

  6.         /* Tx--PA9  Rx--PA10 */
  7.         GPIO_InitStruct(&GPIO_InitStructure);
  8.         GPIO_InitStructure.Pin            = GPIO_PIN_9 | GPIO_PIN_10;
  9.         GPIO_InitStructure.GPIO_Mode      = GPIO_Mode_AF_PP;
  10.         GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
  11.         GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
  12.         GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

  13.         /* Tx--PA4  Rx--PA5 */
  14.         GPIO_InitStructure.Pin            = GPIO_PIN_4;
  15.         GPIO_InitStructure.GPIO_Alternate = GPIO_AF1_USART1;
  16.         GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
  17.         GPIO_InitStructure.Pin            = GPIO_PIN_5;
  18.         GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
  19.         GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

  20.         /* Tx--PB6  Rx--PB7 */
  21.         GPIO_InitStructure.Pin            = GPIO_PIN_6 | GPIO_PIN_7;
  22.         GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_USART1;
  23.         GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  24.     }
  25. }


这个时候有趣的现象出现了,PA9、PA4、PB6 三个复用输出功能,同时复用到了USART1--Tx。
而PA10、PA5、PB7三个复用输入功能,只有一个(PA10)复用到了USART1--Rx。

根据目前测试现象猜测,针对N32G43x系列(拥有独立GPIOx_AFL/GPIOx_AFH寄存器的系列),外设引脚重映射:
如果作为输出功能,一个外设输出可以映射到多个IO;
如果作为输入功能,一个外设只能映射到一个IO(避免输入信号冲突)。

(如果有错误,欢迎指出共同讨论~)




tpgf 发表于 2023-4-3 14:15 | 显示全部楼层
这种引脚复用,只能是考虑一下分时服用了
aoyi 发表于 2023-4-3 15:39 | 显示全部楼层
如果出现了三个引脚复用到了一个串口上 会报错吗
nawu 发表于 2023-4-3 15:54 | 显示全部楼层
请问楼主可以同时在三个引脚上检测到相同的数据吗
zljiu 发表于 2023-4-3 16:37 | 显示全部楼层
这个结论是楼主的推测  感觉也是不无道理 有官方的人员来给说法吗
gwsan 发表于 2023-4-3 16:59 | 显示全部楼层
不知道针对其他的系列会不会这种现象出现呢
tfqi 发表于 2023-4-3 17:17 | 显示全部楼层
gwsan 发表于 2023-4-3 16:59
不知道针对其他的系列会不会这种现象出现呢

如果楼主的猜测分析是正确的话 那么我觉得其他芯片也是这个情况
caigang13 发表于 2023-4-3 20:53 来自手机 | 显示全部楼层
同一个IO肯定只能复用成一个功能外设啊
 楼主| Afanx 发表于 2023-4-4 15:30 | 显示全部楼层
nawu 发表于 2023-4-3 15:54
请问楼主可以同时在三个引脚上检测到相同的数据吗

是的,用逻辑分析仪在三个串口发送引脚检测到相同的波形
51xlf 发表于 2023-4-8 22:13 | 显示全部楼层
复用功能的引出脚可以通过重映射,从不同的I/O管脚引出
qiufengsd 发表于 2023-4-8 22:27 | 显示全部楼层
如何实现gpio口模式的配置?
uytyu 发表于 2023-4-9 14:29 | 显示全部楼层
GPIO端口的复用功能怎么理解?
qiufengsd 发表于 2023-4-9 14:35 | 显示全部楼层
如何使用N32G45x的端口重映射
averyleigh 发表于 2023-4-9 15:40 | 显示全部楼层
这个复用功能还支持很多端口的吗              
bartonalfred 发表于 2023-4-9 16:21 | 显示全部楼层
SPI1重映射怎样配置               
sanfuzi 发表于 2023-4-9 16:24 | 显示全部楼层
重映射功能之后,原来的引脚还能继续进行复用功能么
albertaabbot 发表于 2023-4-9 16:29 | 显示全部楼层
当gpio端口,作为复用功能时,还能再使用它的初始功能吗
claretttt 发表于 2023-5-7 10:41 | 显示全部楼层
配置复用功能,gpio口不用配置了吗
gygp 发表于 2023-5-7 13:52 | 显示全部楼层
重映射就是可以把某些功能端口从缺省的端口分配到别的端口上,那样可以方便线路板布局
tifmill 发表于 2023-5-7 15:24 | 显示全部楼层
GPIO各模式如何用?               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

51

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部