/
...
/
/
STM32F103:什么时候需要复用 IO(AFIO)?
Search
Try Notion
STM32F103:什么时候需要复用 IO(AFIO)?
文章来源:
刚接触 STM32F103,在尝试编写 “按键中断” 和“PWM 呼吸灯”程序的时候,发现例程都用到了管脚复用 AFIO:
//打开管脚复用AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
Copy
C
写到 “232USART 串口通信” 程序时,当我非常自信的写下上面这句代码后,发现例程里面却没有这句话,很让人摸不着头脑…… 查了很多资料,加上自己的理解,发现 AFIO 的使用还是有点内容值得总结一下的。
AFIO 介绍:
MCU 有对外管脚,包括 CPU 的管脚和内置外设(PWM,TIM,ADC……)的管脚; 他们都需要对外接口 IO,但是管脚总数是有限的,有的管脚既作为普通 IO,也作为外设 IO,有时候甚至好几个内置外设共用一个 IO,这就是管脚复用现象。比如随便一个管脚的原理图上: PA2/USART2_TX/ADC123_IN2/TIM5_CH3/TIM2_CH3 表明这个管脚除了作为普通 PA2 之外,还作为复用 IO,有 USART2,ADC,TIM5,TIM2 等……总结: 1. 普通管脚就是 GPIO,复用管脚(非普通管脚)就是 AFIO; 2. 只要用到内置外设的管脚,都需要打开复用 IO(AFIO),比如对外输出 PWM 波形,使用 AD 转换等。
画了个简图:
例程分析:
标题 “什么时候需要 AFIO” 看来已经解决了,但仍让我困惑的是,同样是用到 AFIO,为什么有的例程不需要(比如 USART 例程)打开 AFIO, 而有的例程(比如 PWM 呼吸灯和按键中断例程)却需要这句话打开 AFIO:
//打开管脚复用AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
Copy
Plain Text
我总结的规律是:
假如是用到挂载在 APB2 下的内置外设,比如下图中的 ADC1/2,TIM1,SPI1,USART1,也算是管脚复用,但不需要打开 AFIO 语句,而是直接打开相应内置外设就好了;
假如是挂载在 APB1 下的内置外设,比如下图中,也用到了 AFIO,也不用打开 AFIO 语句,而是直接打开相应内置外设就行了;
说来说去,什么时候用到打开 AFIO 呢?
首先要有管脚复用功能 AFIO;其次被复用的管脚一定是挂载在 APB2 上的,因为 AFIO 就是在 APB2 上;最后就是内置外设一定是上述 APB2 表中没有的,因为 APB2 有的话,直接打开就好了,也用不到打开 AFIO;
根据以上条件,打开 AFIO 的只有一种情况,那就是:
💡
挂载在 APB1 下的内置外设,经过重映射功能,把管脚映射到 APB2 上!
其实,一旦使用重映射功能,只能映射到 APB2 上,因为 APB2 表中第二个框子里面包括了 GPIOA~E,几乎所有的管脚了。
复用时,是否打开 AFIO & 管脚设置?
1.TIM3 输出 PWM,使用了重映射,所以有打开 AFIO 这句话;
被映射管脚设置为复用推挽输出:
GPIOC_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
Copy
Plain Text
2.USART1 串口传输,由于 USART1 挂载在 APB2 下,使用了 AFIO,但是没有打开 AFIO 这句话,而是直接打开 USART1;
被打开的 USART 管脚设置为复用推挽输出: (推挽输出是为了点亮 LED)
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
Copy
Plain Text
按键中断,是一种输入模式,关于 IO 中断,数据手册上有:
关于按键中断:
首先确认 IO 口接收外部中断是管脚复用;其次输入模式没有复用输入,只有普通输入,所以要按照手册配置成浮空等;最后,因为按键中断并不是 APB2 表中带有的复用,没法直接打开,所以要声明打开 AFIO 复用!
重映射内置外设步骤:
使能映射到的 I/O 端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);使能被新映射的外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);使能 AFIO 功能的时钟 (勿忘!) RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);打开重映射 GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
参考内容:
最初我看到这句话我是想当然的不相信的:
仔细理清 AFIO 和重映射的关系之后,发现确实时钟这样的,而且这里还说明了外部中断的管脚复用。
上面的重映射步骤,也是参考这个文章,感谢作者对新手的帮助!什么时候需要用到 RCC_APB2Periph_AFIO–复用 IO 时钟的使用—gtkknd
像这个说的也很好,新手确实很容易忘记打开 AFIO 以及相应的管脚,但是什么情况下打开没有说明清楚。其实就是在重映射的时候需要打开 AFIO。
后来又发现了一位自称菜鸟的大神,在他的这篇文章(学习 STM32(2)-IO-AFIO(复用功能 IO 和调试配置) )中关于这个问题讲的很清楚:
结语:
有时候发现,别人讲的有点乱自己怎么也看不明白,等自己理解透了才发现别人讲的这么有条理、这么准确! 本文由简悦 SimpRead 转码