【stm32f407】IO引脚复用和映射

发布者:廿由人最新更新时间:2019-02-12 来源: eefocus关键字:stm32f407  引脚复用  映射 手机看文章 扫描二维码
随时随地手机看文章

一.  什么叫管脚复用


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列出来非常详细,如下


关键字:stm32f407  引脚复用  映射 引用地址:【stm32f407】IO引脚复用和映射

上一篇:【stm32f407】NVIC
下一篇:【stm32f407】SysTick实现延时

推荐阅读最新更新时间:2024-03-16 16:23

如何快速上手STM32学习?
单片机用处这么广,尤其是STM32生态这么火!如何快速上手学习呢? 你要考虑的是,要用STM32实现什么? 为什么使用STM32而不是用8051?是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO?是51的功耗太大,电池挺不住?是51的内存太小而你要存储的东西太多?还是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 当你需要使用STM32某些功能,而51实现不了的时候,那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用spi协议的网卡、要使用串口通信、要使用rtos等等。 寄存器vs库函数 我的观点是:当你debug的时候寄存器很重要,当你需要理解芯片工作细
[单片机]
stm32f407之MyDebugger(操作寄存器)
九、MyDebugger 已经学习了usart和DMA,因为后面的学习,最好有一个直观点的人性化的显示终端。可以通过串口将数据和文字信息发送往电脑,然后在上位机软件上观察数据以及调试信息。为此,我写了一个文件,以供日后调试之用,命名为MyDebugger。 首先,参照之前的程序,略加修改,将USART的接收功能全部去掉,DMA的配置分开,独立写成一个配置DMA的函数USART3_DMA_config(),把发送的部分写到MyDebugger_Message(char *str_address, unsigned int str_len)函数内,很简单地实现了一个发送字符消息的函数。然后写一个操作板子上指示灯的函
[单片机]
<font color='red'>stm32f407</font>之MyDebugger(操作寄存器)
STM32F407系统时钟设置
startup_stm32f40x_cl.s(启动文件) → SystemInit() → SetSysClock () if (HSEStatus == (uint32_t)0x01) { /* Select regulator voltage output Scale 1 mode */ RCC- APB1ENR |= RCC_APB1ENR_PWREN; PWR- CR |= PWR_CR_VOS; /* HCLK = SYSCLK / 1*/ RCC- CFGR |= RCC_CFGR_HPRE_DIV1; #if defined (STM32F40_41xxx) || defined
[单片机]
Linux I/O实现文件复制
前一段时间采用mmap实现了一个文件的复制操作,现在采用linux的I/O实现文件的复制,基本的思想是将文件复制到一个通用的buf中,然后将buf中的数据复制到新的文件中。这种方式比较容易理解,但是也是底层的系统调用,建议少用,但有时候必须采用(设备驱动)。 #include stdio.h #include unistd.h #include fcntl.h #include stdlib.h #include sys/types.h #include sys/stat.h /*操作的基本权限*/ #define DEF_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IW
[单片机]
stm32f407驱动山外鹰眼二值化摄像头
stm32f407芯片主程序: #include main.h uint8_t pic ; bool busy = false; void ov7725_isr(void) { uint8_t *ptr = (uint8_t*)&pic ; if(!busy) { OV7725_GetImg(ptr); busy = true; } } int main(void) { uint16_t i; GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; //GPIO initialize RCC_AHB1
[单片机]
<font color='red'>stm32f407</font>驱动山外鹰眼二值化摄像头
MAXQ微控制器中JTAG接口引脚复用
  简介   通常在嵌入式应用中,微控制器的每个端口引脚对于实际应用来说都是必需的,没有多余的引脚。然而,开发人员可采用其他方法来解决这个问题。大部分MAXQ微控制器可重写内部程序存储器(如闪存或EEPROM),支持标准JTAG/TAP接口(也称为调试端口)。外部主机可利用该接口执行在线调试或在线编程(引导装载)功能。该接口中的所有引脚通常可复用为标准GPIO端口引脚功能,从而使这些引脚在开发阶段结束之后仍然可以被使用。本应用笔记阐述了在常规应用中如何复用这些引脚。同时,本应用笔记还指出了在复用这些引脚时需要考虑的事项。   应用系统开发阶段   在开发阶段,JTAG兼容调试端口可提供许多有用功能。首先,调试端口允许应
[嵌入式]
使用MMU进行地址重映射的启动代码结构探讨
本文是对《使用AXD调试MMU地址映射程序手记(二)》一文的补充,首先对编写启动代码所需要了解的基本知识和大多数初学者可能比较模糊的基本概念作了简单介绍,然后对启动代码的结构或说流程做了一些探讨。 事实上,对于一个简单的嵌入式应用,编写启动代码并不困难,但如果要在启动代码中使用MMU并完成地址重映射,有一些关键的步骤就值得商酌。 本文仅是笔者学习过程中的一点心得,纰漏之处在所难免,旨在抛砖引玉,给初学者一个思考的方向,更多以及更权威内容请参考文后所列的参考资料。 一、映像文件基本组成 映像文件加载时域包括RO和RW段,运行时域则包括RO、RW和ZI三个段。其中RO和RW段的内容在加载时和运行时是一样的,只是存储空间可能不同
[单片机]
IO-Link改变智能工厂决策的三大原因
工业4.0的关键在于从工厂车间边缘收集数据,为工厂控制器提供有价值的洞察,帮助工厂做出更明智或“更智慧”的决策。此外还让制造商能够快速轻松地定制产品,而无需为重新配置制造流程付出大量成本。这就打开了“单件小批量生产”制造流程的大门,有助于减少浪费,让工厂生产更加可持续。IO-Link在实现工业4.0方面扮演着重要角色,不仅适用于新工厂,而且还能轻松升级现有老旧设施。近年来,IO-Link节点的数量呈指数级增长,预计这种增长趋势将持续发展。这篇博文探讨 IO-Link为追求智能化流程的制造商带来的三大关键优势 。下方的图1显示了IO-Link的增长率。 图1.IO-Link节点安装数量不断增加 1.IO-Link将智能引
[工业控制]
<font color='red'>IO</font>-Link改变智能工厂决策的三大原因
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved