打印

GD32GPIO的复用

[复制链接]
3281|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32基本上每个引脚都有8种配置模式:
1)浮空输入
2)带弱上拉输入
3)带弱下拉输入
4)模拟输入
5)推挽输出
6)开漏输出
7)复用推挽输出
8)复用开漏输出
沙发
niuyaliang|  楼主 | 2015-1-25 12:57 | 只看该作者
通常有5种方式使用某个引脚功能,它们的配置方式如下:
1)作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2)作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4)作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。

使用特权

评论回复
板凳
niuyaliang|  楼主 | 2015-1-25 13:09 | 只看该作者
先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办?

使用特权

评论回复
地板
niuyaliang|  楼主 | 2015-1-25 13:10 | 只看该作者
1、不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,参考下图

使用特权

评论回复
5
niuyaliang|  楼主 | 2015-1-25 13:10 | 只看该作者
只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来没说过使用IO的复用功能就一定要开启AFIO时钟,这是个误区。

使用特权

评论回复
6
niuyaliang|  楼主 | 2015-1-25 13:11 | 只看该作者
例如下面的,最常用的USART1,如果你的板子上,默认用的就是PA9和PA10这两个IO作为USART1的TX和TX,那么也就是没有重映射,No Remap,这种情况下根本不需要开启AFIO时钟,只要开启USART1的外设时钟就行了。这个实验很简单,自己试试就知道了。

使用特权

评论回复
7
niuyaliang|  楼主 | 2015-1-25 13:12 | 只看该作者
2、从上面的图你可以看到,原来USART1是可以放在PB6和PB7上面的,只不过几乎所有的原理图封装中都不会在PB6和PB7的复用功能上标出它可以当USART1用,毕竟这种重映射的情况太多,几乎所有外设都可以重映射,每个都标出来会非常混乱。

使用特权

评论回复
8
niuyaliang|  楼主 | 2015-1-25 13:12 | 只看该作者
STM32中,USART2的CTS、RTS、TX、RX和TIM2的CH1~CH4都在PA0~PA3上面,具体要如何选择这两个功能呢?
如果要使用USART2,就开始USART2的外设时钟,如果要使用TIM2,就开启TIM2的外设时钟,如果你同时开启,我也不知道会怎么样,你可以自己试试,我觉得应该是两个都不能用。如果你一定要在PA0~PA3上使用这两个功能,只能是时分复用。
正确的同时使用USART2和TIM2,应该是使用上面提到的AFIO_Remap寄存器,将其中的一个重映射到其他IO上去,当然这样其他IO的本身的复用功能你就不能开启了。

使用特权

评论回复
9
niuyaliang|  楼主 | 2015-1-25 13:13 | 只看该作者
回到前面的问题,如果你不做Remap,你根本不可能同时在PA0~PA3上同时使用这两个外设,现在你的方案有两种:
一、保留USART2在PA口上,将TIM2完全重映射(Full Remap)到其他IO上,或者,如果你不用RTS和CTS的硬件流控制,PA0(CTS)和PA1(RTS)上对应的CH1和CH2是可以不用重映射的,只需要将Bit9:8改成10,也就是将CH3和CH4部分重映射到PB10和PB11上去,而CH1和CH2继续保留在PA0和PA1上。但这种情况下,PB10和PB11上的I2C2和USART3就不能用了。

使用特权

评论回复
10
niuyaliang|  楼主 | 2015-1-25 13:13 | 只看该作者
二、保留TIM2在PA口,将USART2重映射到PD口上,很明显,当TIM2完全不重映射时,USART2必须的信号线只有Clock不受影响,这种情况下也没有部分映射可言了,必须将USART2完全重映射到PD3~PD7上,同样的,这种情况下FSMC就不能用了。

使用特权

评论回复
11
niuyaliang|  楼主 | 2015-1-25 13:13 | 只看该作者
1.打开重映射时钟和USART重映射后的I/O口引脚时钟,
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
2.I/O口重映射开启.
                    GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.
                              GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
                              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                              GPIO_Init(GPIOB, &GPIO_InitStructure);

                               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
                               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                               GPIO_Init(GPIOB, &GPIO_InitStructure);

使用特权

评论回复
12
vigous1| | 2015-1-29 17:31 | 只看该作者
解释的很清楚

使用特权

评论回复
13
powerful1| | 2015-1-29 21:03 | 只看该作者
STM32每个引脚都有8种配置模式

使用特权

评论回复
14
vivilzb1985| | 2015-2-10 21:30 | 只看该作者
跟stm32是pin2pin的,,这IO管脚复用的也是一样的吧。。

使用特权

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

本版积分规则

212

主题

2427

帖子

7

粉丝