-
2022-05-04 12:33:06
在设计一个项目的时候,因为用的是STMF103C8T6,引脚较少,所以把可以用的GPIO都需要用上,但是由于下载的引脚在出生时,被厂家已经配置好了,所以我们得利用软件配置一下,使引脚变成正常的GPIO。
这也是一个坑,有时候不知道这个引脚是下载引脚就会使,那我们正常配置时,就配置不成功。我就踩到这个坑了,在这里分享出来。
STMF103C8T6一共有48个引脚,一共有五个下载接口,分别是:
PA13——JTMS/SWDIO
PA14——JTCK/SWCLK
PA15——JTDI
PB3——JTDO
PB4——NITRST
因为我需要使用SWDIO和SWCLK进行ST-Link进行程序下载,而且我只使用PA15引脚了,所以我在这里就配置一下GPIOA_Pin_15;
首先开启重映射时钟(AFIO),这个在APB2总线上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
然后调用解除SWJ重映射函数,使GPIO正常化
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
第一次参数有下列三种选择
GPIO_Remap_SWJ_NoJTRST:解除PB4的复位调试端口
GPIO_Remap_SWJ_JTAGDisable:解除JTAG下载接口(PA15和PB3)
GPIO_Remap_SWJ_Disable:解除全部下载接口(PA13,PA14,PA15和PB3)
一定慎用这几个参数,要是一不小心把接口全部解除重映射,那么只能利用串口下载程序了。
完整程序,解除PA15,PB4的端口复用功能,使PA15,PB4正常
void Init ( void ) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启外设时钟*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); /* 开启端口复用时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 解除PA15,PB4的端口复用 */ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); /*选择要控制的引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_PIn_15; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化*/ GPIO_Init ( GPIOA, &GPIO_InitStructure ); }
更多相关内容 -
STM32F103串口1重映射
2019-09-03 11:40:41在STM32F103c8t6单片机上实现串口1端口重映射功能,将串口1引脚PA9、PA10重映射为PB6、PB7引脚。 -
stm32 CAN重映射
2017-11-07 15:20:41stm32 CAN引脚占用时,可以进行重映射,需要开启重映射时钟。 -
关于STM32的GPIO的复用功能和重映射功能
2020-07-31 12:37:27文章内容为STM32的GPIO的复用功能和重映射功能相关知识。 -
STM32F103单片机printf函数重映射
2020-03-11 13:15:44在STM32F103C8T6单片机上,将printf函数重新映射到串口3上。可以通过串口3输出调试打印信息。 -
电脑键盘键位映射的重映射
2021-05-26 14:58:12通过python代码实现按键功能的重映射 -
存储器映射和存储器重映射
2020-08-03 15:36:43本文介绍了存储器映射和存储器重映射的概念、原理以及原因等内容。 -
嵌入式系统/ARM技术中的地址重映射在S3C4510B系统中的实现
2020-12-10 06:30:14详细介绍Remap(重映射)的实现过程及部分关键代码,给出启动代码中异常中断向量的处理。 关键词:Remap 地址重映射 S3C4510B 异常中断近年来,随着32位芯片制造技术的不断完善,制造成本不断降低,国内的32位MCU... -
战舰V3&精英TIM2部分重映射2(PA0,PA1,PB10,PB11)测试程序.rar
2021-09-16 15:39:50stm32 学习 -
remap重映射
2020-12-21 00:35:03相机畸变主要是由于透镜成像原理导致的,其畸变的原理可以参考相机模型,它的畸变按照原理可以分解为切向畸变和径向畸变。 原创文章 11获赞 0访问量 381 关注 私信 展开阅读全文 作者:123天晴了 -
USART1(引脚重映射remap)+DMA正常模式重新启动
2018-09-18 10:11:04这个是自己写的32程序,已经实测过可用---USART1(引脚重映射remap)+DMA正常模式重新启动 -
Java+opencv3.2.0实现重映射
2020-08-28 00:50:43主要为大家详细介绍了Java+opencv3.2.0实现重映射的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
STM32F10X系例 GPIO复用+重映射模式及寄存器记录.docx
2020-12-03 17:41:03重新加深STM32F103系列GPIO的复用和重映射功能,结合“正点原子”相关教材和《STM32中文参考手册》,写了这边关于GPIO的总结文档,防止自己忘记后有迹可查。 -
【STM32】端口复用和重映射,完全重映射,部分重映射
2021-09-15 12:02:51文章目录 端口复用 端口复用函数总结 端口重映射 完全重映射 完全重映射函数总结 部分重映射 端口复用 当 PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用(相较于作为普通的 GPIO 口而言)。...端口复用
当 PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用(相较于作为普通的 GPIO 口而言)。
复用端口初始化有几个步骤:
- GPIO 端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- 复用的外设时钟使能。比如你要将端口 PA9,PA10 复用为串口,所以要使能串口时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- 端口模式配置。
//USART1_TX PA.9 复用推挽输出 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); //USART1_RX PA.10 浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);
所以,我们在使用复用功能的时候,最少要使能 2 个时钟:
- GPIO 时钟使能
- 复用的外设时钟使能
同时要初始化 GPIO 以及复用外设功能
端口复用函数总结
所有的函数写到一起后的形式为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //USART1_TX PA.9 复用推挽输出 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); //USART1_RX PA.10 浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);
端口重映射
完全重映射
外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
简单的讲就是把管脚的外设功能映射到另一个管脚,但不是可以随便映射的
重映射我们同样要使能复用功能的时候讲解的 2 个时钟外,还要使能 AFIO 功能时钟,然后 要调用重映射函数。详细步骤为:
- 使能 GPIOB 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- 使能串口 1 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- 使能 AFIO 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- 开启重映射:
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
完全重映射函数总结
所有的函数写到一起后的形式为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
部分重映射
GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
-
电子-战舰amp精英F103TIM2重映射测试PA15.PB3.PB10.PB11.rar
2019-09-05 11:11:55电子-战舰amp精英F103TIM2重映射测试PA15.PB3.PB10.PB11.rar,单片机/嵌入式STM32-F0/F1/F2 -
重映射
2018-09-21 18:08:47重映射就是重新分配这种一一对应的关系。     我们可以把存储器看成一个具有输出和输入口的黑盒子。如下图所示,输入量是地址,输出的是对应地址上存储的...映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系。
我们可以把存储器看成一个具有输出和输入口的黑盒子。如下图所示,输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。 图1
普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。如图1,CPU读取0x00000000地址上存储单元的过程。 图2
ARM比较复杂。ARM芯片与普通单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了。图3是随意举了个例子(不要与ARM芯片对应),旨在说明地址重映射的过程。图3表示把0x00000000地址上的存储单元映射到新的地址0x00000007上。CPU存取0x00000007就是存取0x00000000上的物理存储单元。 图3
图4,图5是对ARM芯片的两种地址重映射方式的图示。图3 假设我们的应用程序存放在外扩FLASH当中,那么应用程序的异常向量表就存放在0x80000000起始的64个(其中有32个存放异常向量)物理存储单元中。但是ARM核发生异常(中断)后是从0x00000000~0x 0000003F地址范围取异常向量的。所以要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。以后CPU存取0x00000000~0x0000003F地址就是存取0x80000000~0x8000003F范围内的存储单元。图4只显示出第一个异常向量的地址重映射,整个异常向量表的地址重映射等同这个过程。 图4
图5图示了ARM芯片的另外一种映射方式。这个映射可以由用户决定采用还是不采用(相关代码在工程文件的startup.s中,这个文件是第三方提供,用户可以修改)。这个映射主要是为了提高应用程序异常相应得速度。当我们把应用程序存放在片内FLASH的时候,异常向量表存放在0x00000000~0x0000003F存储单元内。每次发生异常,CPU从0x00000000~0x0000003F地址上取异常向量。但是对RAM的存取速度远高于对FLASH的 图5
存取速度,所以为了提高异常相应速度我们采取以下做法: (1)先把0x00000000~0x0000003F(FLASH)存储单元内的异常向量表复制到0x40000000~0x4000003F(片内RAM的最低端64个字节的存储单元)范围内存储单元中。
(2) 把0x40000000~0x4000003F范围内存储单元地址重新映射到0x00000000~0x0000003F地址范围。
这样做了以后,当异常发生的时候,CPU取异常向量就是从RAM区中的异常向量表中区,速度快了。比如复位中断发生,CPU从地址0x00000000取指令,但此时由于已经过地址重新映射,这个0x00000000被地址转换器转换成0x40000000,CPU实际上是取的RAM区中0x400000000这个存储单元内的指令(异常向量)。 当然用户可以不进行这种映射。片内FLASH中0x00000000~0x0000003F存储单元具有一模一样的异常向量表。只不过不进行这种处理,异常相应速度慢一点。但是这种速度上的差别很多情况下是不必要在意的。
图中的地址转换器受控制寄存器 MENMAP 的控制,用户可以设置 MENMAP 实现对地址重映射的控制。这个地址转换器显然是通过内部硬件电路实现的。 -
STM32端口复用和重映射
2021-05-21 20:07:53进行重映射 部分重映射 & 完全重映射 部分重映射:功能外设的部分引脚重新映射,还有一部分引脚是原来的默认引脚 完全重映射:功能外设的所有引脚都重新映射 引脚重映射配置过程 1.使能GPIO时钟(重映射后的IO) 2....参考正点原子视频
端口复用
STM32有很多内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用
简单来说就是 咱们的板子上有很多的引脚,这些引脚本来是你作为普通的输入输出使用的(就是你自己这是这个引脚的功能),但是咱们芯片的内置外设也需要与外界进行信息交流啊啊,但是引脚就这么多(比如咱们mini板子只有51个外接引脚),如果每个内置外设都要占用引脚的话,普通的引脚就不够用了,所以这个时候伟大的人类想到了一个办法,就是一个引脚,平常可以做普通的引脚,但是它还有另一个隐藏的身份,就是某个内置外设的输入输出引脚,当你需要用到这个外设的时候,这个普通的引脚就可以变成相关外设的引脚(就相当于中国的建设兵团,平常是农民,打仗的时候就是军人,但还是同一个人)。这就是端口复用。那么端口复用有什么用处呢?之前就说过了,如果内置外设都要单独占用一个引脚的话,普通的引脚就很少了,所以端口复用使得引脚的利用最大化。
内置外设
还记得单片机吧(就是那个黑片片),你可以把它当做一个人,人都知道有脑袋,和身体各个器官(废话),那么芯片也是一样的芯片的大脑就是微处理器,它的作用就是接收命令和发出命令(就相当于有了尿意大脑就接收到了命令要尿尿,就对你的膀胱发出命令,我要尿尿,手动滑稽),它没有实现命令的能力,该怎么办呢?芯片里的其他部分就是实现命令的设备(只是这些设备很小而已),它们就相当于咱们身体的五脏啊、肌肉啊、膀胱啊之类的器官(别说啥肌肉不是器官,我喜欢说咬我啊,略略略),比如说ADC、DAC之类的(不懂这些是啥吧,我也不知道,一点一点慢慢搞吧)。这些东西就叫内置外设。
例如串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而是做复用功能串口1的发送接收引脚的时候,叫端口复用
端口复用配置过程
以PA9,PA10配置为串口1为例
GPIO端口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
复用外设时钟使能
比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
端口模式配置。GPIO_Init()函数
查表:《STM32中文参考手册V10》,P110的表格端口复用配置过程
GPIO引脚输入输出结构体
typedef enum { GPIO_Mode_AIN = 0x0,//模拟输入 GPIO_Mode_IN_FLOATING = 0x04,//浮空输入 GPIO_Mode_IPD = 0x28,//带下拉输入 GPIO_Mode_IPU = 0x48,//带上拉输入 GPIO_Mode_Out_OD = 0x14,//开漏输出 GPIO_Mode_Out_PP = 0x10,//推挽输出 GPIO_Mode_AF_OD = 0x1C,//复用功能的开漏输出 GPIO_Mode_AF_PP = 0x18//复用功能的推挽输出 }GPIOMode_TypeDef;
PA9,PA10复用为串口1配置过程
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//IO时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//外设时钟使能 //USART1_TX GPIOA.9 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);// //USART1_RX GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//
端口重映射
重映射就是引脚重映射,本来每个内置外设都有原来设定的引脚,所谓的重映射就是通过某种方式,将外设本来的引脚的功能赋予给另外的引脚(比如一个外设的引脚是PA10,但你的这个引脚正在被使用,你又想用这个外设,你就可以通过重映射,将PA11设定成PA10,也就是说PA11取代了PA10的功能,成为了外设的引脚),但是重映射也是有规定可以映射到哪个引脚的(需要查看手册)而不是你想映射到哪个引脚就映射到哪个引脚。
I/O端口的重映射
1.I/O的复用:GPIO和内置外设共用引出管脚
2.I/O的重映射:复用功能(AFIO)从不同的GPIO管脚引出
3.方便了PCB的设计,潜在地减少了信号的交叉干扰
4.分时复用某些外设,虚拟地增加了端口数目
AFIO重映射的操作步骤
1.使能被重新映射到的I/O端口时钟
2.使能被重新映射的外设时钟
3.使能AFIO功能的时钟(勿忘)
4.进行重映射部分重映射 & 完全重映射
部分重映射:功能外设的部分引脚重新映射,还有一部分引脚是原来的默认引脚
完全重映射:功能外设的所有引脚都重新映射
引脚重映射配置过程
1.使能GPIO时钟(重映射后的IO)
2.使能功能外设时钟(例如串口1)
3.使能AFIO时钟。(重映射必须使能AFIO时钟)RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
开启重映射
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
根据第一个参数,来确定是部分重映射还是全部重映射
开启AFIO时钟
对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟
AFIO_MAPR:配置复用功能重映射
AFIO_EXTICRX:配置外部中断线映射
AFIO_EVCR:配置EVENTOUT事件输出 -
TIME3四路-PWM输出(重映射).zip
2020-04-01 00:06:45STM32测试程序,可以重映射,使用time3也可以换成其他的STM32测试程序,可以重映射,使用time3也可以换成其他的 -
STM32重映射浅析.docx
2020-02-16 17:00:08STM32重映射浅析 -
pic bootloader 重映射说明
2014-04-06 14:10:30pic 官方bootloader 01310a_cn资料说明文档。 向量表重映射。 -
PIC24F dsPIC33F Configurator:为 PIC24F 和 dsPIC33F 配置引脚(包括可重映射)-开源
2021-06-29 02:56:44该程序用于配置 PIC24F 和 dsPIC33F 器件的引脚。 现在这个软件是预阿尔法 -
STM32_基础入门(七)_端口复用和重映射
2022-01-30 17:06:00STM32_基础入门(七)_端口复用和重映射 -
Remapping 重映射
2021-09-01 20:20:19文章目录一、重映射是什么?二、实例 一、重映射是什么? 把一个图像中一个位置的像素放置到另一个图片指定位置的过程. 为了完成映射过程, 有必要获得一些插值为非整数像素坐标,因为源图像与目标图像的像素坐标... -
图像处理6-重映射
2022-02-21 17:53:13重映射 -
STM32 部分重映射和完全重映射
2021-01-28 17:16:22STM32中拥有重映射功能,可以使硬件电路的设计更加简洁方便,在配置GPIO_PinRemapConfig()函数时,发现入口参数有两种重映射,分为部分重映射(Partial Remap)和完全重映射(Full Remap),那么这两个有什么区别呢... -
STM32单片机重映射USART设计
2021-01-30 10:00:02发表于 2018-11-12 15:31 • 146次阅读 打开重映射时钟和USART重映射后的I/O口引脚时钟, RCC_APB2PeriphClock... 发表于 2018-11-12 15:04 • 148次阅读 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在... -
数值重映射方法(Remap)
2022-04-21 14:08:57数值重映射虽然不属于系统的 api,但在我们平时的工作中又是不可或缺的。 0~1 之间其实很简单 -1,1 -> 0,1 时,就是 x * 0.5 + 0.5 = y 0,1 -> -1,1 时,就是 y * 2 - 1 = x x和y是具有可逆性的 除了... -
ARM处理器重映射原理的分析与实现
2021-01-14 04:52:43本文详细论述了什么是重映射,为什么要进行重映射,以及怎样实现重映射,并以LPC2210处理器为例给出了从片外Flash启动和重映射的实现方法。同时对在ARM嵌入式软件开发过程中经常遇到一些基本概念,比如存储器映射、... -
stm32f4引脚重映射
2021-01-11 22:44:51同理, PA15 对应的重映射复用功能 的名称 TIM2_...... PA0 PA1 PA2 PA3 PA5 PA6 PA7 PA8 PA9 PA10 PA11 PA12 PA15 PB0 PB1 PB3 PB4 PB5 STM32F407ZET6 定时器通道对应引脚整理——Mr.L TIM2_CH1_...... 标签: 引脚| ... -
串口重映射printf
2021-11-19 11:37:49串口重映射printf 1、建立一个UART.c文件,添加到工程中。输入以下代码: #include "stdio.h" #include "main.h" #ifdef __GNUC_ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_...