STM32里,AFIO是不是重映射时钟有多重,只要重映射就必须开启,正常复用不用开?

STM32的复用时钟的开启和重映射功能
IO口的复用
最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);
当初是参考开发的例子写的,一直对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂,通过这几天在网上查找资料和看手册,终于高清楚了,不敢独享,希望能对跟我一样的新手有所帮助吧o(∩_∩)o...
STM32上有很多I/O口,也有很多的内置外设,像I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多内置外设的I/O复用引脚可以通过重映射功能,从不同的I/O管脚引出,即使用了复用功能的引脚是可通过程序改变的。
知道了这些我们就不难理解上面代码的意思了,程序中用到的USART2外设的TX,RX分别对应PA2,PA3,但是我的学习板上的PA2,PA3引脚接了其他设备,但是为了还要用USART2,
“RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO”就打开了GPIOD重映射功能,把USART2设备的TX,RX映射到PD5,PD6上,我们在这两个引脚上接上MAX232串口芯片就可以使用USART2串口通信了。
那各位看官该问:“USART2是不是可以映射到任意管脚呢?”
答案是否定的,它只能映射到固定的管脚,下图是USART2重映射表
其他外设的重映射可以参考STM32100X手册。
为了节省IO资源单片机会在一个IO上复用很多功能,一般来说,单片机IO口用到了一个功能后就能再用另外的复用功能(对应的外设)了,这就体现出了STM32
GPIO的强大了,我们用重映射的方法把其中一个外设映射到其他IO脚上,这样就可以充分利用片内资源!
也许你以为IO和AFIO是很简单的,事实上有几个误区可能很多人都没注意过,当你只用现成的开发板来学习的时候,别人已经帮你做好了资源分配,所有的外设功能学习都是照着别人给你的例程去做的,这才没让你觉得奇怪。
先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办?
1、不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,参考下图
只有使用了AFIO的事件控制寄存器(AFIO_EVCR)、AFIO的重映射功能(AFIO_MAPR)以及外部中断(AFIO_EXTICRx)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来没说过使用IO的复用功能就一定要开启AFIO时钟,这是个误区。
例如下面的,最常用的USART1,如果你的板子上,默认用的就是PA9和PA10这两个IO作为USART1的TX和RX,那么也就是没有重映射(No
Remap)这种情况下根本不需要开启AFIO时钟,只要开启USART1的外设时钟就行了。这个实验很简单,自己试试就知道了。
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的本身的复用功能你就不能开启了。
回到前面的问题,如果你不做重映射(Remap),你根本不可能同时在PA0~PA3上同时使用这两个外设,现在你的方案有两种:
一、保留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就不能用了(被USART2占用)。
STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的.
读到这里相信大家都应该了解了端口重映射的一些概念了.原理上的东西不细说了,大家可以看手册或者网上查,这方面的资料还是很多的.下面说说我的调试经历.
&&&&&&& 上面说过,我用的IC是STM32F103VCT6 ,说到这儿跟大家提一个小插曲.当时在老板让我换方案也就是换IC时,只说用VC的CPU,让我把要买的CPU告诉负责买器件的人,由于我是第一次做,所以傻乎乎的写了张纸给了对方.内容是&STM32F103VC&
10PCS&对方看了一眼就给我退了回来并加一句&型号不对,没写全&.我没明白,便也不好继续问白痴问题,所以跑网上查,原来光这个IC就不止一种.我们选用的是T6也就是LQFP封装的
工作环境为-40C -- 80C.所以说大家以后小心点儿..
言规正传.不知道是什么原因PCB制图时把串口接到USART1上了,当时也没在意,等我把USART测试程序写好烧进去硬件仿真时,串口给的是乱码,我当时就觉得奇怪.把程序检查了好几遍就是查不出问题来,以为是硬件有问题,但突然想到了STM有复用功能,心想会不会是这里有鬼?于是找来datasheet一看
,真相大白:
三个红框交汇处.STM32F103VCT6
这个CPU的USART1接的是PB6/PB7,&但是上电初始化后默认功能并非是USART1.所以想要用串口功能.必须用端口重映射…..
&&& 大家知道,STM32的单片机每个功能模块有自己的时钟系统,所以要想要调用STM32单片机的功能模块时
必须先配置对应时钟,然后才能去操作相应的功能模块.端口重映射也一样.如图示:
重映射步骤为:
1.打开重映射时钟和USART重映射后的I/O口引脚时钟,&
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
&&&//使能对应IO口的时钟,因为是复用功能所以还要使能AFIO时钟
2.I/O口重映射开启.
&&&&&&&&&&&&&&&&&&&&GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3.配制重映射后的引脚:&这里只需配置重映射后的I/O(PB6,PB7),原来的不需要去配置(PA9,PA10).
&&&&&&&&&&&&&&&&&&&&&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);
&&&&&&只需要这三步,串口就可以正常使用了,简单吧?&但是我纠结了大半个小时才搞定的,好多事情都是说起来容易做起来难的,希望我以后多多进步.不要眼高手低,嗯
我正朝这个方向前进
1. AFIO的功能
&&&&为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上。
&&&&简言之,AFIO实现了复用功能的重新映射。
2.&在什么情况下,需要开启AFIO时钟?
&&&下图,&参考手册中写道:对寄存器AFIO_EVCR,
AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的时钟。
&在数据手册的引脚定义中(pin definitions),复用功能&Alternate functions&栏下分为两栏:默认&Default&和重映射&Remap&。其中,在默认栏中的功能只需要开启相应外设功能的时钟,无需开启AFIO时钟(注意:一个引脚在一个时间段内只能使用一个外设功能)。而在重映射栏中的功能,则需要开启相应外设功能的时钟,并且开启AFIO时钟。
&&&&简言之,若GPIO口使用了重映射栏中的外设功能,则需要开启AFIO时钟;只使用默认复用功能时,只开启相应外设时钟无需开启AFIO时钟。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?STM32 关于GPIO的问题集锦
原文地址:
STM32 关于GPIO的问题集锦
1、关于GPIO
问:STM32的IO口初始化为输入浮空,那管脚是高电平还是低电平呢?
答:既不是高电平也不是低电平,悬空的意思是没有使用的状态。
2、有关stm32f103 端口复用的问题?
问:在学习GPIO时,遇到到端口复用问题一直不能明白,我举个例子: PB6 PB7默认情况下是做普通IO使用的,当我想用I2C1是,我开启RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 当我要使用I2C1的重定义时,我要打开, RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 这样理解对不对?
有的人说当用的芯片自带的外设时都要打开 AFIO 时钟,但我用到usart1时没有打开AFIO 时钟,照样能用usart,这是为什么? 总之问这个问题的根本原因是AFIO的时钟要在什么情况下打开?
答:1、串口必须要打开AFIO时钟,不然不能工作。可能你的初始化函数、RCC配置中有开启的地方。 2、AFIO在你需要使用某一模块时,比如你想使用GPIOC,这个时候要打开GPIOC模块的时钟。 3、关闭I2C而不是关闭I2C模块的总线,如果你想使用普通模式,就要把I2C模块关闭以后,重新配置GPIOB模块,就可以正常使用了。
3、AFIO重映射的操作步骤是什么?
答:使能被重新映射到的I/O端口时钟使能被重新映射的外设时钟使能AFIO功能的时钟 (勿忘!) 进行重映射 & & 4、配置IO口的频率问题 & 问:配置IO口的频率时,为什么只给一个IO口配置? 答:GPIO_InitStructure.GPIO_Speed 这个结构体的成员始终为GPIO_Speed_50MHz 配置其他io口时也默认用50MHz 。 & & & 5、请问怎样开始STM32W108CBU64芯片的PB5引脚外设输入中断? & 问:有没有这么一个例程,有开启外设中断和中断函数的?& 最佳答案:看了下datasheet,PB5复用的功能为PB5, ADC0, TIM2CLK, TIM1MSK,相关的中断应该有,就看你配置为什么外设了。 & 6、STM32F101 Tamper Pin 使用问题 & 问:请教各位大虾:STM32F101 BKP当中的Tamper Pin该如何初始化!? 答:当TPAL=0时:如果在启动侵入检测TAMPER引脚前(通过设置TPE位)该引脚已经为高电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现上升沿)。 ● 当TPAL=1时:如果在启动侵入检测引脚TAMPER前(通过设置TPE位)该引脚已经为低电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现下降沿)。 设置BKP_CSR寄存器的TPIE位为’1’,当检测到侵入事件时就会产生一个中断。 详见:BKP_CSR & 7、有关stm32f103 端口复用的问题? 问: 在学习GPIO时,遇到到端口复用问题一直不能明白,我举个例子:& PB6 PB7默认情况下是做普通IO使用的,当我想用I2C1是,我开启RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);& RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);& 当我要使用I2C1的重定义时,我要打开,& RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);& RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);& RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);& 这样理解对不对?& 有的人说当用的芯片自带的外设时都要打开 AFIO 时钟,但我用到usart1时没有打开AFIO 时钟,照样能用usart,这是为什么?& 总之问这个问题的根本原因是AFIO的时钟要在什么情况下打开?& 答: 1、串口必须要打开AFIO时钟,不然不能工作。可能你的初始化函数、RCC配置中有开启的地方。 2、AFIO在你需要使用某一模块时,比如你想使用GPIOC,这个时候要打开GPIOC模块的时钟。 3、关闭I2C而不是关闭I2C模块的总线,如果你想使用普通模式,就要把I2C模块关闭以后,重新配置GPIOB模块,就可以正常使用了。 7、STM32里面,设置GPIO_Mode_IPU 有什么用 问:中断的配置里面有:GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8); & & & & & & & & & & & & & &GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9); GPIO口设置里面有: GPIO_InitStructure.GPIO_Pin & = GPIO_Pin_8 | GPIO_Pin_9; & & & & & & & & & & & &GPIO_InitStructure.GPIO_Mode &= GPIO_Mode_IPU; & & & & & & & & & & & &GPIO_Init(GPIOB, &GPIO_InitStructure);& 我想问的是,这两组设置必须同时存在吗? 答:GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8); &
& & & GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9); STM32中这两句话的意思是PB口的8、9管脚作为外部中断的触发信号,所以Pin_8和Pin_9就要设置成输入的模式,而GPIO_InitStructure.GPIO_Mode &= GPIO_Mode_IPU;中IPU是指IO口的工作模式是带上拉输入,这个和具体的电路有关,总之如果选择某个IO口作为外部中断的触发信号,就必须配置这个IO口为输入模式,不然无法触发中断 & 8、stm32中GPIO口的最大输出速度如何理解? 问:stm32中GPIO口的最大输出速度如何理解? 答:1、是这样的,2M、10M和50M是指GPIO口的采样频率。不知这样理解对不对,我就是这样做的。 & & & & &2、我通过PB6采集80KBPS/S的方波,通过中断计采集,完全胜任。
9、STM32 GPIO 弱上拉能做输入输出吗 问:STM32 GPIO 弱上拉能做输入输出吗? 答:32只有上拉输入,用在外部连接的是下路输出的,这样才能正确读取。输出的话一般用推挽和开漏,推挽用于一般的驱动,开漏一般加上拉电阻像三极管集电极那样驱动较大电流。
10、STM32语句:GPIO-&ODR^=0X02 是怎么执行的?实现什么功能? 问:是GPIO端口的数据存在ODR寄存器,该数据与0x02异或再存在ODR中吗? 答:ODR是stm32的IO端口输出数据寄存器,该寄存器31-16位始终读为0,15-0位输出数据。GPIO-&ODR^=0X02 是输出数据与0x02异或,即输出数据的第二位如果与1相同,该位置0,反之出1,因此实现取反,输出数据保存在ODR,每执行一次输出数据的第二位取反一次。 10、GPIO配置速度 问:stm32中的GPIO如果设置成了输入模式,还需要配置GPIO_Speed么? 答:输入模式可以不用配置速度,但是输出模式必须确定最大输出频率。
11、stm32 GPIO输入电平检测 问:GPIO两个引脚,模式都初始化为输入弱上拉,给其中一个引脚接4.7V的电压,IDR对应的值为1;给另一个引脚接5.13V的电压,IDR对应的值却为0; 答:检查一下是否使能了相应GPIO的时钟,是否有这样一句RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);有它就使能了,否则读出的值不可预测。 12、关于STM32中GPIO寄存器IDR和ODR数据 问:STM32中GPIO寄存器IDR和ODR数据是不是同步的?为什么我用GPIO_SetBits函数设置管脚的时候,IDR和ODR同时改变,怎么使得只改变ODR的数据,而不改变IDR的数据?谢谢! 答:IDR寄存器的数据时实时反映IO口的状态,当然设置ODR,IO的状态也跟着改变,除非强制人为地设置。比如,ODR设置为1,而强制将对应的IO口接地,这时IDR就和ODR不一致;或者将ODR设置0,而强制降对应IO口接VCC,这时也不一致。
13、用STM32,有六个GPIO口(不在同一组)要相同信号输出,请问怎么设置? 问:例如GPIOE的pin10重映射到TIM1,设置好TIM1的PWM信号输出;其他的IO口如GPIOA的pin5、GPIOA的pin6、GPIOB的pin5、GPIOB的pin6、GPIOC的pin5也要输出与GPIOE的pin10相同的信号,请问大侠怎么设置? 答:用定时器中断吧,把PWM的脉宽配置成定时中断,把GPIO引脚都配置好,相应时钟都使能,然后到定时器中断函数中做相同的处理。
14、关于GPIO_WriteBit与GPIO_SetBits 问:GPIO_WriteBit与GPIO_SetBits有什么区别 答:可以用man命令查看区别 man ioctl : NAME & & & &ioctl - control device man write : NAME & & & &write - write to a file descriptor
15、关于GPIO_InitTypeDef GPIO_InitStructure 问:这句话什么意思? 答:声明一个结构体,名字是GPIO_InitStructure,结构体原型由GPIO_InitTypeDef 确定,stm32里面初始化GPIO用的吧。。设置完了GPIO_InitStructure里面的内容后在GPIO_Init (GPIO_TypeDef 。 *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)里面调用,比如初始化pa口,就是GPIO_Init (GPIOA, &GPIO_InitStructure),括号里后面那个就是你问题里面声明的那个结构体。
16、关于 STM32的IO口能不能像51的IO口那样直接控制Px口输出 问:大家好,STM32的IO口能不能像51的IO口那样直接控制Px口输出?比如我要用51控制器段数码管,只要给Px口送十六进制数值就可以了?请问STM32可以吗? 答:可以的,举2个例子:GPIO0-&BRR = 0x55;GPIO1-&BSRR = 0x55;这其中的GPIOx表示IO号的号码,BRR/BSRR表示相就IO口的控制寄存器,就按这个格式操作就行了。
&17、关于stm32芯片IO端口配置 问:stm32芯片 IO端口配置为浮空输入时,能不能读取端口上的电平状态。 答:STM32的输入状态寄存器GPIOx_IDR和输出状态寄存器和GPIOx_ODR的读取是不受端口配置影响的。& & 18、stm32 JTAG和普通IO复用问题 & 问:stm32 JTAG和普通IO复用,当软件设置为普通IO时,还能用JTAG下载软件吗。 答:能。因为在下载的时候,通过RESET时序进入了下载模式了。但是注意硬件的接法不要强制拉高拉低,也不要让其芯片的输出脚接过来。这样就会影响到jtag了。 &
本文转载自 熊二飞月 , 原文链接: , 转载请保留本声明!
每一个你不满意的现在,都有一个你没有努力的曾经。
Copyright (C) &&
&&Powered by&复用和重映射时什么时候要开启AFIO时钟,什么时候要关闭AFIO时钟 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
Hot [直播]
复用和重映射时什么时候要开启AFIO时钟,什么时候要关闭AFIO时钟
12:00:09  
1复用和重映射时什么时候要开启AFIO时钟,什么时候要关闭AFIO时钟?
2用EXTI时要开AFIO时钟吗?
11:23:28  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的时钟。关闭应该是不用的时候吧
(22.27 KB, 下载次数: 0)
11:23 上传
10个问题&&&&&&&&3755个浏览
20个问题&&&&&&&&20592个浏览
32个问题&&&&&&&&7329个浏览
通过本期深入浅出的直播,你将会得到:
如何正确认知常见单片机的发展,分类与选型?
典型方案实例:常用单片机的应用与开发
玩单片机到身价千万老总,光环背后是怎样的生活和经历?
如何培养“老总”需要培养的那些能力?
如何养成成为“老总”需要养成的成功习惯?
即日起至6月15日,参与英蓓特NXP产品知识小测验,即有机会赢取最新系列开发板。特别奖SBC-EC9100开发板1套,幸运奖FRDM系列最新开发板(型号随机,共10套)。快来参加吧! >> 立即参加
Powered byAFIO重映射的操作步骤是什么?-STM32-意法半导体STM32/STM8技术社区
所属分类:
浏览数:1556
提问时间:
问:AFIO重映射的操作步骤是什么?
答:使能被重新映射到的I/O端口时钟
使能被重新映射的外设时钟
使能AFIO功能的时钟 (勿忘!)
进行重映射
回答时间:请后回答。
本书对28个实例进行了详细的讲解,还包括MDK的使用,以及技巧等。实例代码全部为操作寄存器的方式实现。
本书旨在通过mbed介绍嵌入式系统设计的所有主要议题,便于读者快速掌握嵌入式系统的设计方法。
本书围绕“库”的分析和使用展开,对于如何综合运用固件库开发项目给出了具体的范例,让读者循序渐进、系统地掌握。
Tel: 3-8064
备案号: 苏ICP备号-2}

我要回帖

更多关于 时钟分针和时针重合 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信