关闭

STM32的AFIO时钟什么时候需要开启

标签: stm32AFIO时钟复用功能外部中断
3548人阅读 评论(0) 收藏 举报
分类:

  相比于普通单片机,STM32 拥有复杂的时钟系统,相应的控制器称为 RCC(Reset Clock Controller,复位与时钟控制器)。每个外设都配备了外设时钟的开关,当我们不使用某个外设时,可以把这个外设时钟关闭,从而降低 STM32 的整体功耗。因此,在我们使用外设前,必须要开启相应外设的时钟。可以使用的库函数有:

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

  显然,在开启外设时钟前,先要知道该外设挂载在哪个总线上。以 GPIOC 的 pin4 引脚为例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  STM32 中的大部分 GPIO 都有复用功能,所以对于有复用功能的 I/O 引脚,还要开启其复用功能时钟。如 GPIO 的 pin4 可以用作 ADC1 的输入引脚,当我们把它作为 ADC1 使用时,需要开启 ADC1 的时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  另外, STM32 的所有 GPIO 都引入到 EXTI 外部中断线上,使得所有的 GPIO 都能作为外部中断的输入源。所以如果把 GPIO 用作 EXTI 外部中断时,还需要开启 AFIO 时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  那么,问题来了!
  AFIO 是什么?AFIO 时钟什么时候需要开启?
  
  我们从《STM32中文参考手册_V10》中找到:对寄存器 AFIO_EVCR、AFIO_MAPR 和 AFIO_EXTICRX 进行读写操作前,应当首先打开 AFIO 的时钟(设置 APB2 外设时钟使能寄存器 RCC_APB2ENR)。
  也就是说:当你需要配置 AFIO 这些寄存器的时候,就需要把 RCC_APB2ENR 寄存器的 AFIO 位置‘1’打开 AFIO 时钟。
  
  跟 AFIO 相关的寄存器有:
  1、 事件控制寄存器(AFIO_EVCR)
  2、 复用重映射和调试I/O 配置寄存器(AFIO_MAPR)
  3、 外部中断配置寄存器1(AFIO_EXTICR1)
  4、 外部中断配置寄存器2(AFIO_EXTICR2)
  5、 外部中断配置寄存器3(AFIO_EXTICR3)
  6、 外部中断配置寄存器4(AFIO_EXTICR4)

  看看这些寄存器的定义,我们就明白,这些寄存器是用于“事件控制”、“重映射”、“调试IO配置”、“外部中断”的。例如 AFIO_EXTICRX 用于选择 EXTIx 外部中断的输入源。
  总结:当我们需要配置这些 AFIO 寄存器的时候,就需要打开 RCC_APB2ENR 寄存器的 AFIO 时钟,而不是用到引脚复用功能的时候打开。

7
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:292034次
    • 积分:5019
    • 等级:
    • 排名:第5851名
    • 原创:175篇
    • 转载:49篇
    • 译文:6篇
    • 评论:217条
    Contact me
      交流技术与心得
      如有需要欢迎加我个人QQ号,一起交流关于技术与生活所思所想。
    Donation
      微信支付
      如果您觉得我的文章对您有帮助,并想帮助我更快更好地产出更多优质文章,促进技术分享,推动社会进步。可以扫描下面的二维码进行打赏,谢谢!
    博客专栏
    最新评论