STM32之端口复用与重映射

发布者:中原读书客最新更新时间:2019-03-12 来源: eefocus关键字:STM32  端口复用  重映射 手机看文章 扫描二维码
随时随地手机看文章

首先来说下什么是端口复用。


STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。


其实说白了,简单易懂的说,就是某些普通的外设引脚也可以用来其它功能。比如说那我使用的正点原子哥的板子来说吧,串口1 的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作普通的GPIO口,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。


接下来说下端口复用的配置过程


首先,GPIO端口时钟使能。(这个不管用不用端口复用,要使用某个IO口必须要对时钟进行使能)


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);11


接下来就是你要使能复用外设时钟。(这里以串口1为例)


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);1212


接下里就是端口模式配置。 GPIO_Init()函数。


  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  1234567891012345678910


这个可以参考(这里仅仅贴出了串口和定时器的端口配置模式)



以上就是端口复用的配置。

接下来说下什么是重映射。


每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。


为了使不同器件封装的外设IO功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。


打个比方说,串口1的TX,RX引脚是在PA9,和PA10端口,但是同时它有两个映射端口PB6,PB7。开启重映射,PB6和PB7同样可以使用串口1。


详情可参考下表关于串口1和串口2的重映射表。


这里写图片描述


此外,还有有一个部分重映射,所谓部分重映射,顾名思义,就是有部分的端口进行了重映射。


比如time1(当做部分映射时,TIM1_BKIN为PA6引脚,而作为完全重映射是为PE15引脚而TIM1_ETR一直为PA12引脚)


这里写图片描述


接下来还是以串口1为例写下配置过程。


首先,使能GPIO时钟(注意:重映射后的IO);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);11

接下来是使能功能外设时钟;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);11


然后是使能AFIO时钟:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);1212


这里注明下为什么要使能这个AFIO时钟。


对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟。


AFIO_MAPR:配置复用功能重映射 

AFIO_EXTICRX:配置外部中断线映射 

AFIO_EVCR: 配置EVENTOUT事件输出


最后要开启重映射:


GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);1212


之后只需要再次初始化GPIO端口即可。

以上也就是端口重映射的配置过程了。


关键字:STM32  端口复用  重映射 引用地址:STM32之端口复用与重映射

上一篇:STM32F429HAL库ADCDMA学习笔记
下一篇:STM32中的串口通信

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

野火STM32 Flash&sd卡模拟U盘
在USB库文件mass_mal.c中添加对flash和sd读写的函数,USB库调用这些函数从而实现模拟U盘的功能 1 //mass_mal.c 2 /* Includes ------------------------------------------------------------------*/ 3 #include ..Usersdcardbsp_sdio_sdcard.h 4 #include ..Userspi_flashfatfs_flash_spi.h 5 #include mass_mal.h 6 #include stdio.h 7 /* Private typedef ---------
[单片机]
stm32中“拔掉jlink”程序无法正确运行
Q:在调试stm32程序时,从电脑USB口拔掉jlink后开发板上程序为什么无法正确运行?断点复位后也不行。 A:首先,要拔了jlink与开发板的连接(而不仅仅是其与PC的连接),因为jlink本省内部也有电路,对开发板上的程序运行有所影响; 其次,检查stm32的boot 的配置,将BOOT0配置为0才能从复位后Flash启动。BOOT的具体配置如下: BOOT1 BOOT0 启动模式 说明 X 0 Flash 复位后选择主闪存启动 0 1
[单片机]
STM32单片机中使用SPI通信的方法
  在本教程中,我们将使用 STM32F103C8 的 Blue Pill 板替换一个 Arduino 板,并将使用 SPI 总线与 Arduino 板进行通信。在这个STM32 SPI 示例中,我们将使用Arduino UNO作为 Slave,STM32F103C8 作为 Master,两个16X2 LCD 显示器分别连接在一起。两个电位器还与STM32(PA0)和Arduino(A0)相连,通过改变电位器来确定主机到从机和从机到主机的发送值(0到255)。   STM32F103C8中的SPI   比较 Arduino 和 STM32F103C8 Blue Pill 板中的 SPI 总线,STM32 有2 条 SPI 总线
[单片机]
在<font color='red'>STM32</font>单片机中使用SPI通信的方法
循环冗余校验技术,以及在STM32中的一些具体使用体会
在嵌入式产品应用中,常常需要应对系统数据在存储或者传输过程中的完整性问题。 所谓完整性是指数据在其生命周期中的准确性和一致性。这些数据可能存储在EEPROM/FLASH里,或者基于通信协议进行传输,它们有可能因为外界干扰或者程序错误,甚至系统入侵而导致被破坏。如果这些数据在使用前不做校验,产品功能可能失效。在一些特定领域,严重时可能会危及用户财产甚至生命安全。 本文就来聊聊使用较为广泛的循环冗余校验技术,以及在STM32中的一些具体使用体会。 所谓循环冗余校验(CRC:Cyclic Redundancy Check)是一种错误检测算法,通常在通信协议中或存储设备中用于检测原始数据的意外变动。可以简单理解成对有用数据按照一定的算法进
[单片机]
循环冗余校验技术,以及在<font color='red'>STM32</font>中的一些具体使用体会
stm32 定时器中断时间计算
分频值是是指你将系统时钟的频率减小,假设时钟频率是72Mhz,然后分频值是7199,现在你的定时器值就是10kHz,表示每计一个数,然后过了1/(10^4)秒,然后你的重装值就是你的时间了,如果值是9999,就表示定时时间为1s。 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); TIM_T
[单片机]
STM32中断优先级理解及先占优先级和从优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响 如上,NVIC_IRQChannelPreemptionPriority 和 NVIC_IRQChannelSubPriority
[单片机]
<font color='red'>STM32</font>中断优先级理解及先占优先级和从优先级
基于stm32做的遥控器源程序(按键和摇杆均有)
按键的话非常简单,定义一个函数,然后可以直接在主函数里实现,要确认好自己的蓝牙就可以,波特率也要一致才行。 int main(void) { delay_init(); LED_Init(); Key_Init(); uart_init(9600); while(1) { keys(); } } 摇杆的话,需要用到ADC算法,下面会分享一个ADC搜集数据的程序然后将搜集的数据加以利用就好了。 如下: void chuli(void ) { u16 x; u16 y; x = Get_Adc_Average(ADC_Channel_1 , 10);
[单片机]
ST宣布STM32 F4系列为迄今性能最高ARM® Cortex™-M微控制器
   横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)宣布,采用Green Hills软件公司最新软件工具独立进行的处理器性能评测证实,STM32 F4系列是迄今全球性能最高的ARM® Cortex™-M微控制器。 在行业基准CoreMark™评测 中,Green Hills软件公司的2012版编译器让STM32 F4系列多释放出29%的性能。CoreMark测试成绩用单一数字表示,以便设计人员比较不同品牌的处理器。这个创新高的CoreMark得分让工程师对STM32 F4系列微控制器更有信心,为他们选择业界性能最高的Cortex-M微控制器,
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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