0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的复用时钟的开启时间

汽车玩家 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2020-04-04 17:22 次阅读

STM32的AFIO时钟真的是在开启引脚复用功能的时候开启吗?其实并不是~

什么是复用?

我们知道,STM32有很多外设,这些外设的外部引脚都是与GPIO共用的。我们可以通过软件来配置引脚作为GPIO引脚还是作为外设引脚。当引脚配置为外设引脚时就叫做复用。如串口默认复用的引脚为:

STM32的复用时钟的开启时间

PA9、PA10引脚可配置为普通IO,也可配置为串口引脚(PA9为TX,PA10为RX)。

例子:串口1为例

关于外设的配置可查阅:《STM32参考手册》关于通用和复用功能I/O(GPIO和AFIO) 的章节,如串口引脚配置如下:

STM32的复用时钟的开启时间

我们可能经常看到一些代码(基于STM32F103ZET6)的串口配置如下:

STM32的复用时钟的开启时间

看到这里开启了AFIO时钟,让我疑惑了一下,为什么SPI相关的引脚也配置为复用但并没有开启APIO时钟也能正常工作。所以AFIO时钟应该什么时候开呢?

我们回顾一下,我们为什么要开启时钟呢?因为我们要对芯片内部的硬件进行控制(读写其寄存器),要控制哪一部分,就要开启那一部分的时钟。

本例中,使能GPIOA、USART1的时钟是因为我们要对GPIOA、USART1相关的寄存器进行操作。那么AFIO呢?其管理的寄存器有哪些呢?从参考手册关于通用和复用功能I/O(GPIO和AFIO)这一章节可以看到AFIO管理的寄存器如下:

STM32的复用时钟的开启时间

可以知道,本例对USART1进行配置,并没有涉及到AFIO相关的寄存器,所以并不需要打开AFIO时钟!

所以这里的第7行代码可以删掉。当然不删也可以正常工作,但是会白白增加能耗、写无用代码(白白浪费程序存储器空间)而已!

何时开启AFIO时钟?

按照上面分析的,当然是要操作AFIO相关的寄存器的时候才开启AFIO时钟。此处依旧以串口为例。我们看到AFIO管理的寄存器中有复用重映射和调试I/O配置寄存器(AFIO_MAPR) 这一寄存器,这个寄存器怎么用呢?

首先,我们要知道什么是重映射。

使用重映射功能可以把一些复用功能重新映射到其他引脚上,在某些时候可以方便板级硬件的布局设计。设置AFIO_MAPR寄存器实现引脚的重新映射。此时,复用功能不再映射到它们的原始分配上。 可以重映射到任意引脚吗?其实是有规定的,可查阅参考手册,如串口1的重映射:

STM32的复用时钟的开启时间

我们可以配置PB6、PB7作为串口1的TX、RX引脚,具体配置代码如下:

STM32的复用时钟的开启时间

这里得调用一个重映射配置函数GPIO_PinRemapConfig,可在这个函数在stm32f10x_gpio.c中,如下:

STM32的复用时钟的开启时间

其中第一个参数为要重映射的外设,可在stm32f10x_gpio.h中查看:

STM32的复用时钟的开启时间

其中重映射又分为部分重映射和完全重映射,区别就是要重映射全部的引脚还是部分引脚,这也是有规定的。比如定时器1:

STM32的复用时钟的开启时间

我们从GPIO_PinRemapConfig函数的实现中可以看到我们需要操控AFIO_MAPR寄存器,所以需要开启AFIO时钟。

综上,需要操控AFIO管理的寄存器才需开启AFIO时钟,否则不需要开启。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354704
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76160
  • GPIO
    +关注

    关注

    16

    文章

    1196

    浏览量

    51897
收藏 人收藏

    评论

    相关推荐

    求助,为什么STM32要设置时钟开关?

    STM32在使用时离不开时钟,在做绝大部分操作之前,除了要先进行相应的配置之外,关键还要开启时钟,否则就什么事都做不了。既然如此,为什么设计
    发表于 04-23 06:05

    stm32定时器在初始化参数之前是否必须开启对应时钟

    参数的时候,对应定时器时钟并没有开启,导致PWM不能正常输出,当在这些函数之前,开启对应时钟,就正常了。看是调试对比,TIM的寄存器没有差别,不知道为什么,所以问一下在初始化参数之前是
    发表于 04-18 06:42

    STM32F410端口复用SPI5,引脚电平很低的原因?

    STM32F410复用为硬件SPI5口,做DMA输入,不需要输出,如果用软件模拟的SPI口没有问题,电平是正常的3.3v,如果复用成硬件SPI5口,不论是时钟还是数据线上的电平都非常低
    发表于 04-12 07:29

    请问STM32f103使用PB14做外部中断为什么要开启复用时钟才能用?

    如题,我其他中断不开启用时钟也可以用,这是为啥?有大佬能解个惑吗?
    发表于 04-11 07:22

    如何减少STM32F103 ADC采集时间

    路ADC采集,采用时间为7.5周期,测试出来每通道采样时间居然为10ms,当采用时间为239.5周期时,采样时间高达134ms。换了另一块板也一样。
    发表于 04-10 08:20

    有关stm32f103端口复用的几个问题求解

    在学习GPIO时,遇到到端口复用问题一直不能明白,我举个例子: PB6 PB7默认情况下是做普通IO使用的,当我想用I2C1是,我开启RCC_APB1PeriphClockCmd
    发表于 04-07 07:32

    STM32L051同时开启RTC时间戳和秒唤醒后,使用GPIO引脚无法触发时间戳中断如何解决?

    STM32L051同时开启RTC时间戳和秒唤醒后,使用GPIO引脚无法触发时间戳中断。但使用一个3.3V的电源接到PC13能够触发RTC时间
    发表于 04-01 06:37

    使用STM32H743-ADC设置PLL2为时钟源为什么开启不了?

    ,发现能采集到数据: 然后下载到同样为STM32H743IIT6的另外一个开发版时却发现采集到的数据为0。这是为什么呀? 这个开发板也类似最小核心开发板了,可是我却开启不了PLL2作为它的ADC时钟
    发表于 03-12 08:30

    CDCV304 200 MHz通用时钟缓冲器数据表

    电子发烧友网站提供《CDCV304 200 MHz通用时钟缓冲器数据表.pdf》资料免费下载
    发表于 02-28 13:55 0次下载
    CDCV304 200 MHz通<b class='flag-5'>用时钟</b>缓冲器数据表

    什么是时分复用TDM?时分复用类型 时分复用优劣势

    什么是时分复用TDM?时分复用类型 时分复用优劣势  时分复用TDM是一种常见的多路复用技术,用于将多个低速信号合并成一个高速信号在传输线路
    的头像 发表于 01-16 16:03 2410次阅读

    STM32定时器时间计算方法

    STM32微控制器的定时器模块在嵌入式系统中非常常见,它被用于产生精确的时间延迟,或者用于实时时钟(RTC)等功能。为了充分利用STM32的定时器功能,理解其
    的头像 发表于 12-19 11:31 1.1w次阅读

    无人机电池使用时间变短的原因

    电池使用时间变短了,这是很多无人机使用者都会遇到的问题,可电池使用时间变短的具体原因都有哪些?
    的头像 发表于 12-08 16:28 1009次阅读

    用时间开关电路原理图讲解

    用时间开关: 该电路旨在满足经济高效且简单的定时器的标准。它的计时范围从不到一秒到几十小时,并利用基于晶闸管的电源接口来控制感性负载。
    的头像 发表于 12-04 18:24 1810次阅读
    通<b class='flag-5'>用时间</b>开关电路原理图讲解

    【RA系列】用时钟频率精度测量电路进行时间校验

    【RA系列】用时钟频率精度测量电路进行时间校验
    的头像 发表于 11-25 08:06 554次阅读
    【RA系列】<b class='flag-5'>用时钟</b>频率精度测量电路进行<b class='flag-5'>时间</b>校验

    利用STM32CubeMX解读时钟

    提供给芯片中的RTC(实时时钟)及IWDG(独立看门狗)使用。2,中速时钟MSIRC是“中速内部时钟”或“中速内部振荡器”,是STM32L系列独有的
    的头像 发表于 11-24 08:00 1117次阅读
    利用<b class='flag-5'>STM32</b>CubeMX解读<b class='flag-5'>时钟</b>树