新疆时时彩三开奖结果走势图

stm32 io引脚复用器和映射

STM32F4有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。这部分知识在《STM32F4中文参考手册》第七章和芯片数据手册有详细的讲解哪些GPIO管脚是可以复用为哪些内置外设。 <p></p>对于本小节知识,STM32F4中文参考手册讲解比较详细,我们同样会从中抽取重要的知识点罗列出来。同时,我们会以串口使用为例给大家讲解具体的引脚复用的配置。 <p></p>STM32F4系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之间不会发生冲突。 <p></p>每个IO引脚都有一个复用器,该复用器采用16路复用功能输入(AF0到AF15),可通过GPIOx_AFRL(针对引脚0-7)和GPIOx_AFRH(针对引脚8-15)寄存器对这些输入进行配置,每四位控制一路复用: <p></p>1)完成复位后,所有IO都会连接到系统的复用功能0(AF0)。 <p></p>2)外设的复用功能映射到AF1到AF13。 <p></p>3)Cortex-M4 EVENTOUT映射到AF15。 <p></p>复用器示意图如下图4.4.1: <p></p>图4.4.1复用器示意图 <p></p>接下来,我们简单说明一下这个图要如何看,举个例子,探索者STM32F407开发板的原理图上PC11的原理图如图4.4.2所示: <p></p>图4.4.2 探索者STM32F407开发板PC11原理图 <p></p>如上图所示,PC11可以作为SPI3_MISO/U3_RX/U4_RX/SDIO_D3/DCMI_D4/I2S3ext_SD等复用功能输出,这么多复用功能,如果这些外设都开启了,那么对STM32F1来说,那就可能乱套了,外设之间可互相干扰,但是STM32F4,由于有复用功能选择功能,可以让PC11仅连接到某个特定的外设,因此不存在互相干扰的情况。 <p></p>上图4.4.1是针对引脚0-7,对于引脚8-15,控制寄存器为GPIOx_AFRH。从图中可以看出。当需要使用复用功能的时候,我们配置相应的寄存器GPIOx_AFRL或者GPIOx_AFRH,让对应引脚通过复用器连接到对应的复用功能外设。这里我们列出GPIOx_AFRL寄存器的描述,GPIOx_AFRH的作用跟GPIOx_AFRL类似,只不过GPIOx_AFRH控制的是一组IO口的高八位,GPIOx_AFRL控制的是一组IO口的低八位。 <p></p>图4.4.3 GPIOx_AFRL寄存器位描述 <p></p>从表中可以看出,32位寄存器GPIOx_AFRL每四个位控制一个IO口,所以每个寄存器控制32/4=8个IO口。寄存器对应四位的值配置决定这个IO映射到哪个复用功能AF。 <p></p>在微控制器完成复位后,所有IO口都会连接到系统复用功能0(AF0)。这里大家需要注意,对于系统复用功能AF0,我们将IO口连接到AF0之后,还要根据所用功能进行配置: <p></p>1) JTAG/SWD:在器件复位之后,会将这些功能引脚指定为专用引脚。也就是说,这些引脚在复位后默认就是JTAG/SWD功能。如果我们要作为GPIO来使用,就需要对对应的IO口复用器进行配置。 <p></p>2) RTC_REFIN:此引脚在系统复位之后要使用的话要配置为浮空输入模式。 <p></p>3) MCO1和MCO2:这些引脚在系统复位之后要使用的话要配置为复用功能模式。 <p></p>对于外设复用功能的配置,除了ADC和DAC要将IO配置为模拟通道之外其他外设功能一律 <p></p>要配置为复用功能模式,这个配置是在IO口对应的GPIOx_MODER寄存器中配置的。同时要配置GPIOx_AFRH或者GPIOx_AFRL寄存器,将IO口通过复用器连接到所需要的复用功能对应的AFx。 <p></p> 不是每个IO口都可以复用为任意复用功能外设。到底哪些IO可以复用为相关外设呢?这在芯片对应的数据手册(请参考光盘目录:)上面会有详细的表格列出来。对于STM32F407,数据手册里面的Table 9.Alternate function mapping表格列出了所有的端口AF映射表,因为表格比较大,所以这里只列出PORTA的几个端口为例方便大家理解: <p></p> PA0 PA5 PA8 PA9 PA10 <p></p>表4.4.4 PORTA部分端口AF映射表 <p></p>从表4.4.4可以看出,PA9连接AF7可以复用为串口1的发送引脚USART1_TX,PA10连接AF7可以复用为串口2的接受引脚USART1_RX。 <p></p>接下来我们以串口1为例来讲解怎么配置GPOPA.9,GPIOA.10口为串口1复用功能。 <p></p><p></p>1)首先,我们要使用IO复用功能外设,必须先打开对应的IO时钟和复用功能外设时钟。 <p></p>/*使能GPIOA时钟*/ <p></p>RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); <p></p>/*使能USART1时钟*/ <p></p>RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 这里需要说明一下,官方库提供了五个打开GPIO和外设时钟的函数分别为: <p></p>void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState); <p></p>void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState); <p></p>void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState); <p></p>void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); <p></p>void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); <p></p> 这五个函数分别用来打开相应的总线下GPIO和外设时钟。比如我们的串口1是挂载在APB2总线之下,所以我们调用对应的APB2总线下外设时钟使能函数RCC_APB2PeriphClockCmd来使能串口1时钟。对于其他外设我们调用相应的函数即可。具体库函数要怎么快速找到对应的外设使能函数,大家可以参考我们接下来的4.7小节快速组织代码技巧,我们有详细的举例说明。 <p></p><p></p>2)其次,我们在GIPOx_MODER寄存器中将所需IO(对于串口1是PA9,PA10)配置为复用功能(ADC和DAC设置为模拟通道)。 <p></p><p></p>3)再次,我们还需要对IO口的其他参数,例如类型,上拉/下拉以及输出速度。 <p></p>上面两步,在我们库函数中是通过GPIO_Init函数来实现的,参考代码如下: <p></p>/*GPIOA9与GPIOA10初始化*/ <p></p>GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; <p></p> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 <p></p> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz <p></p> GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 <p></p> GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 <p></p> GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10 <p></p><p></p>4)最后,我们配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接到所需的AFx。 <p></p>这些步骤对于我们使用库函数来操作的话,是调用的GPIO_PinAFConfig函数来实现的。具体操作代码如下: <p></p>/*PA9连接AF7,复用为USART1_TX */ <p></p>GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); <p></p>/* PA10连接AF7,复用为USART1_RX*/ <p></p>GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); <p></p>对于函数GPIO_PinAFConfig函数,入口第一个第二个参数很好理解,可以确定是哪个IO,对于第三个参数,实际上我们确定了这个IO到底是复用为哪种功能之后,这个参数也很好选择,因为可选的参数在stm32f4xx_gpio.h列出来非常详细,如下 <p></p>#define IS_GPIO_AF(AF) (((AF) == GPIO_AF_RTC_50Hz) ||((AF) == GPIO_AF_TIM14) || \ <p></p> ((AF) == GPIO_AF_MCO) || ((AF) == GPIO_AF_TAMPER) || \ <p></p> ((AF) == GPIO_AF_SWJ) || ((AF) == GPIO_AF_TRACE) || \ <p></p> ((AF) == GPIO_AF_TIM1) || ((AF) == GPIO_AF_TIM2) || \ <p></p> ((AF) == GPIO_AF_TIM3) || ((AF) == GPIO_AF_TIM4) || \ <p></p> ((AF) == GPIO_AF_TIM5) || ((AF) == GPIO_AF_TIM8) || \ <p></p> ((AF) == GPIO_AF_I2C1) || ((AF) == GPIO_AF_I2C2) || \ <p></p> ((AF) == GPIO_AF_I2C3) || ((AF) == GPIO_AF_SPI1) || \ <p></p> ((AF) == GPIO_AF_SPI2) || ((AF) == GPIO_AF_TIM13) || \ <p></p> ((AF) == GPIO_AF_SPI3) || ((AF) == GPIO_AF_TIM14) || \ <p></p> ((AF) == GPIO_AF_USART1) || ((AF) == GPIO_AF_USART2) || \ <p></p> ((AF) == GPIO_AF_USART3) || ((AF) == GPIO_AF_UART4) || \ <p></p> ((AF) == GPIO_AF_UART5) || ((AF) == GPIO_AF_USART6) || \ <p></p> ((AF) == GPIO_AF_CAN1) || ((AF) == GPIO_AF_CAN2) || \ <p></p> ((AF) == GPIO_AF_OTG_FS) || ((AF) == GPIO_AF_OTG_HS) || \ <p></p> ((AF) == GPIO_AF_ETH) || ((AF) == GPIO_AF_OTG_HS_FS) || \ <p></p> ((AF) == GPIO_AF_SDIO) || ((AF) == GPIO_AF_DCMI) || \ <p></p> ((AF) == GPIO_AF_EVENTOUT) || ((AF) == GPIO_AF_FSMC)) <p></p>参考这些宏定义标识符,能很快找到函数的入口参数。 <p></p>ST32F4的端口复用和映射就给大家讲解到这里,希望大家课余结合相关实验工程和手册巩固本小节知识。

 
新疆时时彩三开奖结果走势图
彩计划9cbapp下载 北京pk赛车7码计划软件 时时彩后二组选万能码 快三在线稳定计划app 澳洲时时彩精准计划 6合必中app苹果版 微信红包扫雷玩法群规 三粒骰子点数大小玩法 购彩计划软件 今天3d试机号是多少