发新帖我要提问
12
返回列表
打印

RCC_APB2Periph_AFIO什么时候要开启?

[复制链接]
楼主: Itachi80
手机看帖
扫描二维码
随时随地手机跟帖
21
ETjason| | 2016-3-7 20:23 | 只看该作者 回帖奖励 |倒序浏览
复用功能和中断

使用特权

评论回复
22
天灵灵地灵灵| | 2016-3-7 20:36 | 只看该作者
最近在学习STM32的外部中断时,例程上有这样一句代码RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   这句代码的功能是使能复用功能时钟,刚开始不知道为什么有时候需要启动RCC_APB2Periph_AFIO时钟,有时候又不需要,之后在网上查找资料和看手册,终于搞清楚了。

使用特权

评论回复
23
天灵灵地灵灵| | 2016-3-7 20:36 | 只看该作者
STM32 AFIO复用功能寄存器(参考)
AFIO_EVCR:复用事件控制寄存器
AFIO_MAPR:复用功能重映射和调试I/O配置寄存器,配置某些引脚第三功能。
AFIO_EXTICR1:外部中断配置寄存器1,配置外部中断EXTI0,1,2,3给Px0,Px1,Px2,Px3引脚。(x=A,B,C,D,E…)
AFIO_EXTICR2:外部中断配置寄存器2,配置外部中断EXTI4,5,6,7给Px4,Px5,Px6,Px7引脚。(x=A,B,C,D,E…)
AFIO_EXTICR3:外部中断配置寄存器3,配置外部中断EXTI8,9,10,11给Px8,Px9,Px10,Px11引脚。(x=A, B,C,D,E…)
AFIO_EXTICR4:外部中断配置寄存器4,配置外部中断EXTI12,13,14,15给Px12,Px13,Px14,Px15引脚。(x=A,B,C,D,E…)

    因为在配置外部中断时,要对 AFIO_EXTICRX进行读写操作,所以要打开RCC_APB2Periph_AFIO时钟。
    RCC_APB2Periph_AFIO是重映射功能的时钟,只要你没有将特定的外设指定的IO Remap(重映射)到其它端口(也是指定的),就不需要打开AFIO时钟。 比如说,在使用TIM1时,因为使用的默认的PA、PB相应端口,并没有进行Remap,因此不需要读写AFIO寄存器,所以不需要启动RCC_APB2Periph_AFIO时钟。
    同时我也学到了关于重映射方面的一些知识。
   STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。
    比如USART2外设的TX,RX分别对应PA2,PA3,如果PA2,PA3引脚接了其他设备,但是为了还要用USART2,我们就可以把USART2设备的TX,RX映射到PD5,PD6,应该注意的是USART2的TX,RX是不可以映射到任意管脚的,它只能映射到固定的管脚

使用特权

评论回复
24
天灵灵地灵灵| | 2016-3-7 20:41 | 只看该作者
其他外设的重映射可以参考STM32100X手册
库函数的调用
(1)使能被重新映射到的I/O端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
(2)使能被重新映射的外设时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
(3)使能AFIO功能的时钟(勿忘!)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
(4)进行重映射GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);  

使用特权

评论回复
25
天灵灵地灵灵| | 2016-3-7 21:04 | 只看该作者
什么时候需要用到RCC_APB2Periph_AFIO-复用IO钟表的使用
 需要用到外设的重映射功能时才需要使能AFIO的时钟
外部中断(EXTI)中与AFIO有关的寄存器是AFIO-EXTICR1、2、3,它们是用来选择EXTIx外部中断的输入脚之用。
  举例:重映射USART2
USART2的TX/RX在PA.2/3 PA.2已经被Timer2的channel3使用需要把USART2的TX/RX重映射到PD.5/6库函数的调用
  (1)使能被重新映射到的I/O端口时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  (2)使能被重新映射的外设时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  (3)使能AFIO功能的时钟(勿忘!)
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  (4)进行重映射
  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);

使用特权

评论回复
26
qingyu_lv| | 2018-2-24 10:08 | 只看该作者
都后 我也明白了 谢谢

使用特权

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

本版积分规则