stm32f103替换_能力复用

stm32f103替换_能力复用文章来源:刚接触STM32F103,在尝试编写“按键中断”和“PWM呼吸灯”程序的时候,发现例程都用到了管脚复用AFIO://打开管脚复用AFIORCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);写到“232USART串口通信”程序时,当我非常自信的写下上面这句代码后,发现例程里面却没有这句话,很让人摸不着头脑……查了很多资料,加上

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

文章来源:

刚接触STM32F103,在尝试编写“按键中断”和“PWM呼吸灯”程序的时候,发现例程都用到了管脚复用AFIO:

//打开管脚复用AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

写到“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);

我总结的规律是:

1.假如是用到挂载在APB2下的内置外设,比如下图中的ADC1/2,TIM1,SPI1,USART1,也算是管脚复用,但不需要打开AFIO语句,而是直接打开相应内置外设就好了;

这里写图片描述

2.假如是挂载在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;//复用推挽输出

2.USART1串口传输,由于USART1挂载在APB2下,使用了AFIO,但是没有打开AFIO这句话,而是直接打开USART1;

被打开的USART管脚设置为复用推挽输出:
(推挽输出是为了点亮LED)

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出

3.按键中断,是一种输入模式,关于IO中断,数据手册上有:

这里写图片描述

关于按键中断:

首先确认IO口接收外部中断是管脚复用;

其次输入模式没有复用输入,只有普通输入,所以要按照手册配置成浮空等;

最后,因为按键中断并不是APB2表中带有的复用,没法直接打开,所以要声明打开AFIO复用!

重映射内置外设步骤:

  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);

参考内容:

最初我看到这句话我是想当然的不相信的:

这里写图片描述

仔细理清AFIO和重映射的关系之后,发现确实时钟这样的,而且这里还说明了外部中断的管脚复用。

上面的重映射步骤,也是参考这个文章,感谢作者对新手的帮助!
什么时候需要用到RCC_APB2Periph_AFIO–复用IO时钟的使用—gtkknd

像这个说的也很好,新手确实很容易忘记打开AFIO以及相应的管脚,但是什么情况下打开没有说明清楚。其实就是在重映射的时候需要打开AFIO。

这里写图片描述

后来又发现了一位自称菜鸟的大神,在他的这篇文章(学习STM32(2)-IO-AFIO(复用功能IO和调试配置) )中关于这个问题讲的很清楚:

这里写图片描述

结语:

有时候发现,别人讲的有点乱自己怎么也看不明白,等自己理解透了才发现别人讲的这么有条理、这么准确!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183595.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)

    使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)zhuan:https://segmentfault.com/a/1190000002697929本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称P2V。采用

    2022年7月1日
    27
  • Python电影评论数据分析系统_echarts数据可视化

    Python电影评论数据分析系统_echarts数据可视化书接上文,继上文实现了《复仇者联盟4:终局之战》电影的影评数据分析采集之后,本文主要对获取到的影评数据进行一些可视化展示,主要的可视化展示手段是词云。这里我把200条左右的纯评论数据抽取解析了出来,贴在下面,感兴趣的可以拿去:=========================================================================…

    2025年11月6日
    5
  • Quartus II 13.0sp1 (64-bit)使用教程「建议收藏」

    Quartus II 13.0sp1 (64-bit)使用教程「建议收藏」本人大三在学习计算机组成原理,要用到QuartusII13.0sp1(64-bit),但是下载安装完以后发现不会用,世界这么大,百度也没有任何收获,啊啊啊,昨天终于会用了,所以写了这个教程,希望对大家有用,详情见图片这里会弹出来一个框,然后(next)然后得到下面这个图这里也有一个(next)省略了,都是点一下哦然后(next)——》(finsh)module…

    2022年10月10日
    2
  • docker镜像文件导出_docker导入导出镜像

    docker镜像文件导出_docker导入导出镜像导语:需要迁移docker目录,以防万一备份一下镜像。方法1:dockerimages|awk'{print$1″:”$2}’#效果等同于dockerimages–format'{{.Repository}}:{{.Tag}}’逐个导出foriin`dockerimages–format'{{.Repository}}:{{.Tag}}’`;dodockersave$i>/mnt/images/`echo$i|sed’s/:/-

    2025年8月27日
    6
  • JQ-checkbox实现单选功能

    JQ-checkbox实现单选功能<divstyle=”line-height:1.5em;padding:5px0;font-size:14px;”><ulclass=”mui-table-view”><liclass=”mui-input-row”><inputtype=”checkbox”name=”quesA”id=”quesA”value=”…

    2022年5月30日
    36
  • go语言的type func()用法

    go语言的type func()用法在 go 语言中 type 可以定义任何自定义的类型比如熟悉的 typedogstruc typemyIntint 等等所以 func 也是可以作为类型自定义的 typemyFuncfu int int 意思是自定义了一个叫 myFunc 的函数类型 这个函数的签名必须符合输入为 int 输出为 int 已知 相同底层类型的变量之间是可以相互转换的 例如从一个取值范围小的 int16 转为取值范围大的 int32 所以 自定义的 myInt 和 int 之间也是可以转换的 typemyIn

    2025年6月8日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号