stm32 adc引脚怎样把一个引脚重映射为adc

查看: 4258|回复: 5
stm32引脚复用问题:一个引脚怎么能有那么多的功能
正在研究STM32F103ZET的引脚复用问题,根据datasheet(附件CD_xCxDxE.pdf&&P31),PA0有很多default功能(如图):TIM2_CH1_ETR\USART2_CTS\WKUP\ADC123_IN0\TIM5_CH1\TIM8_ETR。根据reference manual,PA0可以被REMAP为TIM2_CH1_ETR或者USART2_CTS, 那么其他的功能 WKUP&&ADC123_IN0 TIM5_CH1 TIM8_ETR是怎么映射的?比如我想使用TIM5和TIM8的时候,这个引脚应该怎么处理呢?求高人指点
本帖子中包含更多资源
才可以下载或查看,没有帐号?
这些功能一般没法同时使用,只能选择某一种功能来使用。
qllaoda1 发表于
这些功能一般没法同时使用,只能选择某一种功能来使用。
你的意思就是在使用过程中,像TIM5和TIM8的关于引脚的功能,谁配置齐全了该引脚就用谁的功能,但是不能两个功能都配置?
你只能选择其中的一个功能用...
adce 发表于
你只能选择其中的一个功能用...
明白了,多谢!
oiloilpig 发表于
明白了,多谢!
楼主,我不明白啊。我打开了AFIO时钟,配置了adc和dma所有需要的东西,但是我从来没有考虑过和adc_in9共用一个IO口的TIM3_CH4。现在adc转换失败了,我想问问是否存在影响,需不需要将TIM3_CH4remap到别的IO口去?
阿莫电子论坛, 原"中国电子开发网"2401人阅读
stm32(38)
一.什么叫管脚复用
STM32F4有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
STM32F4系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之间不会发生冲突。每个IO引脚都有一个复用器,该复用器采用16路复用功能输入(AF0到AF15),可通过GPIOx_AFRL(针对引脚0-7)和GPIOx_AFRH(针对引脚8-15)寄存器对这些输入进行配置,每四位控制一路复用:
1)完成复位后,所有IO都会连接到系统的复用功能0(AF0)。
2)外设的复用功能映射到AF1到AF13。
3)Cortex-M4EVENTOUT映射到AF15。
&&&&&&如图:
上图是针对引脚0-7,对 于引脚8-15,控制寄存器为GPIOx_AFRH。从图中可以看出。当需要使用复用功能的时候,我们配置相应的寄存器GPIOx_AFRL或者GPIOx_AFRH,让对应引脚通过复用器连接到对应的复用功能外设。这里我们列出GPIOx_AFRL寄存器的描述,
GPIOx_AFRH的作用跟GPIOx_AFRL类似,只不过GPIOx_AFRH控制的是一组IO口的高八位,GPIOx_AFRL控制的是一组IO口的低八位
寄存器分别如下:
二.USART实例讲解
以usart2的TX,RX为例
USART2的TX,RX对应的PIN脚分别为:PD5,PD6
1) 首先,我们要使用IO复用功能外设,必须先打开对应的IO时钟和复用功能外设时钟。
/*使能GPIOD时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
USART2在APB1总线上
/*使能USART2时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
这里需要说明一下,官方库提供了五个打开GPIO和外设时钟的函数分别为:
void& RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph,FunctionalState NewState);
void& RCC_AHB2PeriphClockCmd(uint32_tRCC_AHB2Periph, FunctionalState NewState);
void& RCC_AHB3PeriphClockCmd(uint32_tRCC_AHB3Periph, FunctionalState NewState);
void&& RCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph, FunctionalState NewState);
void& RCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph, FunctionalState NewState);
这五个函数分别用来打开相应的总线下GPIO和外设时钟。比如我们的串口2是挂载在APB1总线之下,所以我们调用对应的APB1总线下外设时钟使能函数RCC_APB1PeriphClockCmd来使能串口2时钟。对于其他外设我们调用相应的函数即可。
2) 其次,我们在GIPOx_MODER寄存器中将所需IO(对于串口2是PD5,PD6)配置为复用功能(ADC和DAC设置为模拟通道)。
3)再次,我们还需要对IO口的其他参数,例如类型,上拉/下拉以及输出速度。
上面两步,在我们库函数中是通过GPIO_Init函数来实现的,参考代码如下:
/*GPIOD5与GPIOD6初始化*/
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//速度50MHz
GPIO_InitStructure.GPIO_OType= GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化PD5,PD6
&&&&&&4)最后,我们配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接到所需的AFx。这些步骤对于我们使用库函数来操作的话,是调用的
GPIO_PinAFConfig函数来实现的。具体操作代码如下:
/*PD5连接AF7,复用为USART2_TX */
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2);
/* PD6连接AF7,复用为USART2_RX*/
GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2);
对于函数GPIO_PinAFConfig函数,入口第一个第二个参数很好理解,可以确定是哪个IO,
对于第三个参数,实际上我们确定了这个IO到底是复用为哪种功能之后,这个参数也很好选择,因为可选的参数在stm32f4xx_gpio.h列出来非常详细,如下
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:295494次
积分:4930
积分:4930
排名:第6418名
原创:158篇
转载:115篇
评论:42条
文章:29篇
阅读:28406
文章:13篇
阅读:4854
阅读:1500
文章:39篇
阅读:116411
(4)(7)(7)(11)(1)(22)(30)(1)(2)(1)(2)(2)(8)(28)(39)(22)(6)(31)(16)(18)(15)2被浏览774分享邀请回答0添加评论分享收藏感谢收起写回答查看: 3294|回复: 3
在使能GPIOD重映射功能之后,原来的引脚还能继续进行复用功能么??
主题帖子精华
新手上路, 积分 33, 距离下一级还需 17 积分
在线时间0 小时
我在学习GPIOD重映射的时候,有一个疑问。。。
根据《STM32中文参考手册_V10.pdf》里面的《8.3 &复用功能I/O和调试配置(AFIO)》的说明:
为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。
设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。
这时,复用功能不再映射到它们的原始分配上。&
因此上,复用功能重新映射的一个优点是改良电路设计。
另外我看到网上的文章中说,复用功能重新映射的另外一个优点就是能增加器件。这个是真的么??
& & USART2外设的TX,RX分别对应PA2,PA3,
但是开发板上的PA2,PA3引脚接了其他设备,
但是为了还要用USART2,“RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO”就打开了GPIOD重映射功能。
把USART2设备的TX,RX映射到PD5,PD6上,我们在这两个引脚上接上MAX232串口芯片就可以使用USART2串口通信了。
根据上面的描述:
很明显的是,一个时间里面只有一个器件可用。也就是说:
在使能GPIOD重映射功能之前,PA2,PA3对应USART2外设的TX,RX。
在使能GPIOD重映射功能之后,PD5,PD6对应USART2外设的TX,RX。
我的问题是:
& & 在使能GPIOD重映射功能之后,原来的PA2,PA3还能继续进行复用功能么??
如果可以,那岂不是就多了一个串口。
如果不可以,那么原来的PA2,PA3变成了什么样子呢???
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间1 小时
楼主自己可以尝试一下!
主题帖子精华
金钱117329
在线时间903 小时
应该是可以的,不会多一个串口,只是可能看看是不是两个地方都会输出相同的数据.
或者有的时候,一个IO有多个复用的情况,这种就有用了.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
在线时间0 小时
当然可以,可以分时复用成两路。
于停用该账号:http://www.microstar.club
Powered by关于stm32f103的usart1的端口重映射问题 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 5916|回复: 14
关于stm32f103的usart1的端口重映射问题
在线时间5 小时
主题帖子好友
新手上路, 积分 43, 距离下一级还需 7 积分
新手上路, 积分 43, 距离下一级还需 7 积分
本帖最后由 无双个妹 于
15:40 编辑
我参考了网上有人发的帖子,但是发现自己用了,TX发出来全是高电平,没有竖线(低电平)
以下是我的程序请大家帮忙端口设置
& && &&&GPIO_InitTypeDef GPIO_InitS
& && && && &&&
& && && & 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);复制代码usart1重映射设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
& && & GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
& && & RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
& &
& && && & USART_InitTypeDef USART_InitS
& && &&&
& && && & USART_ClockInitTypeDef&&USART_ClockInitS
& && &&&USART_ClockInitStructure.USART_Clock = USART_Clock_D
& && &&&USART_ClockInitStructure.USART_CPOL = USART_CPOL_L
& && &&&USART_ClockInitStructure.USART_CPHA = USART_CPHA_2E
& && &&&USART_ClockInitStructure.USART_LastBit = USART_LastBit_D
& && &&&USART_ClockInit(USART1 , &USART_ClockInitStructure);
& && &&&USART_InitStructure.USART_BaudRate = 9600;
& && &&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;
& && &&&USART_InitStructure.USART_StopBits = USART_StopBits_1;
& && &&&USART_InitStructure.USART_Parity = USART_Parity_N
& && &&&USART_InitStructure.USART_HardwareFlowControl =&&USART_HardwareFlowControl_N
& && &&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
& && &&&USART_Init(USART1 , &USART_InitStructure);
& && && && &
& && && & USART_Cmd(USART1 , ENABLE);复制代码 为了使用这个端口我这样设置,AFIO_MAPR|=1&&2;&&
但是总是报错& && && && && && && && && &&&Error[Pe020]: identifier &AFIO_MAPR& is undefined
(13.91 KB, 下载次数: 6)
15:39 上传
在线时间585 小时
ST金币2392
主题帖子好友
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//开启端口B和复用功能时钟
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//使能端口重映射
GPIO_InitTypeDef GPIO_InitS
//uart 的GPIO重映射管脚初始化
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);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_InitTypeDef USART_InitS
//串口参数配置:,无奇偶校验,无硬流量控制 ,使能发送和接收
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_N
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);//串口接收中断
USART_Cmd(USART1, ENABLE);
在线时间5 小时
主题帖子好友
新手上路, 积分 43, 距离下一级还需 7 积分
新手上路, 积分 43, 距离下一级还需 7 积分
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//开启端口B和复用功能时钟&&...
我就是抄这个人的例程的,有问题,实习不了,可能是单片机不一样
在线时间585 小时
ST金币2392
主题帖子好友
本帖最后由 wambob 于
15:50 编辑
貌似你的顺序不对吗,而且有地方不一样,你改程序了
在线时间5 小时
主题帖子好友
新手上路, 积分 43, 距离下一级还需 7 积分
新手上路, 积分 43, 距离下一级还需 7 积分
貌似你的顺序不对吗,你改程序了
我把程序的初始化,分成时钟,端口分别使能
在线时间585 小时
ST金币2392
主题帖子好友
我把程序的初始化,分成时钟,端口分别使能
按你的说法,除了顺序外,因该代码一样多,看你的好象不全
在线时间168 小时
主题帖子好友
高级会员, 积分 705, 距离下一级还需 295 积分
高级会员, 积分 705, 距离下一级还需 295 积分
单片机不一样?你的不是103系列吗?
在线时间5 小时
主题帖子好友
新手上路, 积分 43, 距离下一级还需 7 积分
新手上路, 积分 43, 距离下一级还需 7 积分
单片机不一样?你的不是103系列吗?
是103,但是后面型号不一样,
在线时间168 小时
主题帖子好友
高级会员, 积分 705, 距离下一级还需 295 积分
高级会员, 积分 705, 距离下一级还需 295 积分
你是用的IAR吧?关于 Error[Pe020]: identifier &AFIO_MAPR& is undefined
1、在程序前面加上定义。
#include &xxxx.h&
还不行的话就自己在程序开头重新定义一下就100% OK了。
#define AFIO_MAPR 0x......;
2、重新安装过软件。
也许是软件出错了,这个当然包括软件的安装目录有中文;安装的时候更改了安装路径等等都会出现这种情况。所以最好的安装方法就是“一路回车”。
在线时间5 小时
主题帖子好友
新手上路, 积分 43, 距离下一级还需 7 积分
新手上路, 积分 43, 距离下一级还需 7 积分
单片机不一样?你的不是103系列吗?
其实都是一样的,STM32F103C8和STM32F103RB都差不多
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by

我要回帖

更多关于 stm32f103 adc引脚 的文章

 

随机推荐