stm32的复用与映射

Posted GXTon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32的复用与映射相关的知识,希望对你有一定的参考价值。

摘自:https://blog.csdn.net/lincheng15/article/details/51789093

 

 

 

摘自:http://www.51hei.com/bbs/dpj-36242-1.html

 

 

 

其他外设的重映射可以参考STM32100X手册。
为了节省IO资源单片机会在一个IO上复用很多功能,一般的单片机用到 一个功能后就能再用两外复用的功能了,这就体现出了STM32 GPIO的强大功能了,我们用重映射的方法把其中一个外设映射到其他IO脚上,这样就可以充分利用片内资源!

 

也许你以为IO和AFIO是很简单的,事实上有几个误区可能很多人都没注意过,当你只用现成的开发板来学习的时候,别人已经帮你做好了资源分配,所有的外设功能学习都是照着别人给你的例程去做的,这才没让你觉得奇怪。
先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办?

 

 

 2、从上面的图你可以看到,原来USART1是可以放在PB6和PB7上面的,只不过几乎所有的原理图封装中都不会在PB6和PB7的复用功能上标出它可以当USART1用,毕竟这种重映射的情况太多,几乎所有外设都可以重映射,每个都标出来会非常混乱。
STM32中,USART2的CTS、RTS、TX、RX和TIM2的CH1~CH4都在PA0~PA3上面,具体要如何选择这两个功能呢?
如果要使用USART2,就开始USART2的外设时钟,如果要使用TIM2,就开启TIM2的外设时钟,如果你同时开启,我也不知道会怎么样,你可以自己试试,我觉得应该是两个都不能用。如果你一定要在PA0~PA3上使用这两个功能,只能是时分复用。
正确的同时使用USART2和TIM2,应该是使用上面提到的AFIO_Remap寄存器,将其中的一个重映射到其他IO上去,当然这样其他IO的本身的复用功能你就不能开启了。

 

 

一、保留USART2在PA口上,将TIM2完全重映射(Full Remap)到其他IO上,或者,如果你不用RTS和CTS的硬件流控制,PA0(CTS)和PA1(RTS)上对应的CH1和CH2是可以不用重映射的,只需要将Bit9:8改成10,也就是将CH3和CH4部分重映射到PB10和PB11上去,而CH1和CH2继续保留在PA0和PA1上。但这种情况下,PB10和PB11上的I2C2和USART3就不能用了。
二、保留TIM2在PA口,将USART2重映射到PD口上,很明显,当TIM2完全不重映射时,USART2必须的信号线只有Clock不受影响,这种情况下也没有部分映射可言了,必须将USART2完全重映射到PD3~PD7上,同样的,这种情况下FSMC就不能用了。

 

  STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的.读到这里相信大家都应该了解了端口重映射的一些概念了.原理上的东西不细说了,大家可以看手册或者网上查,这方面的资料还是很多的.下面说说我的调试经历.
        上面说过,我用的CPU是STM32F103VCT6 ,说到这儿跟大家提一个小插曲.当时在老板让我换方案也就是CPU时,只说用VC的CPU,让我把要买的CPU告诉负责买器件的人,由于我是第一次做,所以傻乎乎的写了张纸给了对方.内容是"STM32F103VC  10PCS"对方看了一眼就给我退了回来并加一句"型号不对,没写全".我没明白,便也不好继续问白痴问题,所以跑网上查,原来光这个CPU就不止一种.我们选用的是T6也就是LQFP封装的 工作环境为-40C -- 80C.所以说大家以后小心点儿 ..言规正传.不知道是什么原因 PCB制图时把串口接到USART1上了,当时也没在意,等我把USART测试程序写好烧进去硬件仿真时,串口给的是乱码,我当时就觉得奇怪.把程序检查了好几遍就是查不出问题来,以为是硬件有问题,但突然想到了STM有复用功能,心想会不会是这里有鬼?于是找来datasheet 一看 ,真相大白

 

 重映射步骤为:
1.打开重映射时钟和USART重映射后的I/O口引脚时钟,
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
2.I/O口重映射开启.
                    GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.
                              GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
                              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                              GPIO_Init(GPIOB, &GPIO_InitStructure);

                               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
                               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                               GPIO_Init(GPIOB, &GPIO_InitStructure);
      只需要这三步,串口就可以正常使用了,简单吧?  但是我纠结了大半个小时才搞定的,好多事情都是说起来容易做起来难的,希望我以后多多进步.不要眼高手低,嗯 我正朝这个方向前进.

 

 

以上是关于stm32的复用与映射的主要内容,如果未能解决你的问题,请参考以下文章

STM32管教复用与重映射关系

STM32端口复用和重映射

STM32 端口复用重映射

STM32端口复用和重映射

嵌入式02 STM32 实验01 端口复用和重映射

STM32端口复用和重映射