stm32f103替换_能力复用
文章来源:
刚接触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复用!
重映射内置外设步骤:
- 使能映射到的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和调试配置) )中关于这个问题讲的很清楚:
结语:
有时候发现,别人讲的有点乱自己怎么也看不明白,等自己理解透了才发现别人讲的这么有条理、这么准确!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183595.html原文链接:https://javaforall.cn
相关文章
- 提高对抗性迁移能力,通过基于神经元归属的攻击方法(CVPR 2022)
- circRNA蛋白编码能力预测
- 平均交付准确率99%以上!又一大厂进军自动驾驶AI数据服务,教AI学会人类标注能力
- 腾讯安全与锐捷网络战略合作,威胁情报能力“被集成”
- 监督和管理能力不强员工
- PAG 4.2 版本正式发布:新增 3D 图层与视频替换能力,大幅优化 UI 播放性能
- 掌握Oracle统计数据的强大能力(oracle统计个数)
- Redis:应用提升数据处理能力(redis应用)
- 马斯克:特斯拉的目标不是服务盈利,将尝试推出续航能力更佳的可替换电池
- Oracle软件培训一个提升你能力的好机会(oracle软件培训)
- 这家公司想让普通医院,也有机器学习能力
- SQL Server多替换技巧:提高数据处理能力(sqlserver多替换)
- MySQL处理超大数据量的能力分析(mysql支持多大数据量)
- SQL Server 2008:提升数据库管理能力的助力(sqlserver2008)
- 纵享单机处理能力Redis单节点集群技术(单节点集群redis)
- 拓展开发能力,使用Redis实现发布订阅(使用redis发布订阅)
- Redis面试题测试程序员的能力(redis面试题有什么用)
- Oracle与Excel联合提升数据分析挖掘能力(oracle与excel)
- Oracle中间产品丰富多元化提升数据管理能力(oracle中间产品)
- 这种能自我修复的材料,或将让机器人拥有自愈能力