STM32学习笔记之 重映射功能
STM32单片机的重映射与地址映射的使用方法及步骤
STM32单片机的重映射与地址映射的使用方法及步骤重映射STM32中对于一些端口的外设已经被其他引脚所使用,这是就需要用端口重映射来解决了,很方便。
以USART1为例重映射的步骤为:打开重映射时钟和USART重映射后的I/O口引脚时钟,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);I/O口重映射开启。
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);配制重映射引脚,这里只需配置重映射后的I/O,原来的不需要去配置。
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_A F_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_I N_FLOATING;GPIO_Init(GPIOB,12345678这样就可以了,很简单。
地址映射对于地址映射是在查重映射时发现的,感觉ST的库很机智,就记录下来。
首先看一下M3 存储器映射我们的操作就在这512MB的地址进行。
在LED灯的程序中,存在宏定义:#defineGPIOC_BASE(APB2PERIPH_BASE+0x1000)#defineAPB2PERIPH_BASE (PERIPH_BASE+0x10000)#definePERIPH_BASE((uint32_t)0x40000000)123。
STM32 printf函数重映射
STM32 printf 函数重映射/* Private function prototypes -----------------------------------------------*/#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- >Libraries->Small printf set to Yes) calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__ *//** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */PUTCHAR_PROTOTYPE{ /* Place your implementation of fputc here */ /* Loop until the end of transmission */ while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} /* write a character to the USART */ USART_SendData(EVAL_COM1, (uint8_t) ch);return ch;}某人的解释:这段代码的意思是将C 语言的库函数printf 重定向,或重映射,这词有点太专业,简单的讲:就是C 语言的库中printf 函数会调用PUTCHAR_PROTOTYPE 这个硬件接口函数,向显示器上输出char 型变量,用来显示,STM32 当然是没有显示器的,所以就用UART 输出Char 型变量到PC 机,由PC 机的超级终端来显示,说白了,就是原来送到显示器上的显示数据,现在送到STM32 的串口上;如果调不过去,你要注意两点:1.你的板子上用的是不是USART1,如果是,那连到PC 的串口,就可以在超级终端上,看到打印出来的东西了,如果不是,请参考第2 点.2.先将你的板子上的USART 初始化,然后把PUTCHAR_PROTOTYPE 函数体中的USART1 换成你现在用的那个USART.于免费送一个注意点,当然以上也都免费,呵呵1.STM32 的外设输出引脚可以重映射,如USART2,要注意板子上,是按原来的引。
STM32的功能引脚重映射和复用功能
STM32的功能引脚重映射和复用功能STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能,本文对一些在使用引脚重映射时所遇到的有关问题加以说明。
我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出脚位都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的脚位外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的脚位。
下面是STM32F103xC中有关USART3引脚的摘要片段;从这里可以看出,USART3_TX的默认引出脚是PB10,USART3_RX的默认引出脚是PB11;但经过重映射后,可以变更USART3_TX的引出脚为PD8,变更USART3_RX的引出脚为PD9。
STM32中的很多内置外设都具有重映射的功能,比如USART、定时器、CAN、SPI、I2C等,详细请看STM32参考手册(RM0008)和STM32数据手册。
有些模块(内置外设)的重映射功能还可以有多种选择,下面是RM0008上有关USART3输入输出引脚的重映射功能表:从这个表中可以看出,USART3的TX和RX引脚默认的引出脚位是PB10和PB11,根据配置位的设置,可以重映射到PC10和PC11,还可以重映射到PD8和PD9。
一个模块的功能引脚不管是从默认的脚位引出还是从重映射的脚位引出,都要通过GPIO端口模块实现,相应的GPIO端口必须配置为输入(对应模块的输入功能,如USART的RX)或复用输出(对应模块的输出功能,如USART的TX),对于输出引脚,可以按照需要配置为推挽复用输出或开漏复用输出。
上图是STM32的GPIO端口模块,使用复用功能时的配置。
从图中可以看出,配置为复用输出时,该端口对应的GPIO输出功能将不起作用。
例如当配置PB10对应的引脚为复用输出功能时,操作PB10对应的输出寄存器将不影响引脚上的信号。
STM32端口复用和端口重映射?什么是端口复用重映射?
STM32端口复用和端口重映射?什么是端口复用重映射?对于(单片机)而言,GPIO引脚配置是最基本的,也是最重要的,因为所有的((信号))输入和(控制)输出都是通过这些配置起作用的。
这里就不得不提到单片机的复用功能AF(Al(te)rnate Func(ti)on),这篇文章我们说一说复用功能。
(STM32)Fxx系列单片机的GPIO可以配置为浮空输入(input floating)、上拉输入(input pull-up)、下拉输入(input pull-down)、(模拟)输入((analog))、开漏输出(output open-drain)、推挽输出(ouput push-pull)、复用开漏输出(alternate function open-drain)、复用推挽输出(alternate function push-pull)等8种模式。
先说明一下开漏输出和推挽输出的区别。
STM32Fxx系列单片机的输出电路由两个MOS管,分别是P-MOS 和N-MOS。
在开漏输出模式下,P-MOS管不工作,只有N-MOS管工作。
若输入数据(寄存器)的值为0,则N-MOS导通,IO口输出低电平;若输出数据寄存器的值为1,则N-MOS截止;由于P-MOS不工作,此时IO口既不是高电平,也不是低电平,这种状态被称为高阻态。
STM32F1xx IO口基本结构在推挽输出模式下,若输出数据寄存器的值为0,则N-MOS导通,P-MOS截止,IO口输出低电平;若输出数据寄存器的值为1,则N-MOS截止,P-MOS导通,IO口输出高电平。
上面提到了STM32Fxx系列单片机还有复用开漏输出和复用推挽输出,它们和上面讲到的(通用)开漏输出和(普通)推挽输出有什么区别?这就涉及到引脚复用的功能。
使用过单片机的(工程师)都了解,STM32Fxx内部集成了很多的外设(控制器),比如USART、SPI、(CAN)等,这些外设控制器,也需要通过引脚与外设连接。
STM32部分重映射和完全重映射(查看数据手册)
STM32部分重映射和完全重映射(查看数据⼿册)
数据⼿册如何查找对应的映射:
打开官⽹直接搜索STM32F可以看到数据⼿册,⾥⾯有关于,输⼊第6页的页码,点击9.3中的9.3x可打开对应的链接。
举例说明:
STM32中拥有重映射功能,可以使硬件电路的设计更加简洁⽅便,在配置GPIO_PinRemapConfig()函数时,发现⼊⼝参数有两种重映射,分为部分重映射(Partial Remap)和完全重映射(Full Remap),那么这两个有什么区别呢?
标题以TIM3为例
根据图⽚可以看到,TIM3的部分重映射和完全重映射对应的引脚是不同的,所以在配置选择部分重映射和完全重映射的时候要考虑⼀下。
重映射引脚分配图在哪
这⼀部分其实并不在STM32的数据⼿册中,⽽在STM32的官⽅⼿册的8.3节,⾥⾯有所有功能的引脚分配情况。
如何配置STM32F103的重映射USART
如何配置STM32F103的重映射USART分类:学习笔记2012-12-26 10:18 136人阅读评论(0) 收藏举报STM32stm32USART重映射这两天用STM32F103操作MC39i,其中用到STM32的重映射串口3,部分重映射到PC10、PC11上。
经参考了正点原子的《STM32不完全手册》并查看手册,调试成功讲解如下,如有不足欢迎指正。
经查找手册见下图:此时配置串口步骤如下:1.开启辅助时钟:RCC->APB2ENR|=1<<0;2.配置重映射寄存器,请串口3部分映射到PC口上:AFIO->MAPR|=1<<4;//USART3_REMAP[1:0]=0B01;3.使能PC口和串口:RCC->APB2ENR|=1<<4; //使能PORTC口时钟RCC->APB1ENR|=1<<18; //使能串口时钟4.配置IO口的状态:GPIOC->CRH=0X44444B44;//IO状态设置PC10/PC115.复位串口:RCC->APB1RSTR|=1<<18; //复位串口1RCC->APB1RSTR&=~(1<<18);//停止复位6.设置波特率和传输方式:USART3->BRR、USART3->CR1。
7.配置接受中断和中的优先级:USART3->CR1|=1<<8; //PE中断使能USART3->CR1|=1<<5; //接收缓冲区非空中断使能MY_NVIC_Init(2,3,USART1_IRQChannel,2);//组2,最低优先级至此配置完成。
备注:串口管脚配置见下图。
STM32的SPI1引脚重映射
STM32的SPI1引脚重映射初次使用STM32有些不太明白,此次调试经验奉献出来与大家分享!系统:STM32 + SD + FA TFSSTM32与SD卡的连接如下定义,PB口#define SD_SCK GPIO_Pin_3#define SD_MISO GPIO_Pin_4#define SD_MOSI GPIO_Pin_5#define SD_CS GPIO_Pin_7我想使用SPI1并重映射引脚使用时注意的事项如下:1.使能PB0时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);2.使能AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);3.使能SPI1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE);4.禁用JTAG时钟复用 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);5.SPI1引脚重映射 GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);接着初始化GPIO和SPI1即可,如:void SpiOpen(void){GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;/* Configure SPI1 pins: SCKand MOSI */GPIO_InitStructure.GPIO_Pin = SD_MOSI|SD_SCK|SD_MISO;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);/* Configure PB7 pin: CS pin */GPIO_InitStructure.GPIO_Pin = SD_CS;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,SD_CS);/* SPI1 Config */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* SPI1 enable */SPI_Cmd(SPI1, ENABLE);}可是这一切完成的时候结果却与想象的不同,无法在SD卡内创建文件,找一个晚上没有结果不得已采用另一种方法:软件模拟SPI测试了一下,结果另人出呼意料,一次搞定,没有任何问题,但为了效率还是希望使用硬SPI口,于是从引脚重映射上寻找原因又费了一晚上无果第三个晚上:经过无数次的改动 + 测试终于OK了,问题出在哪里了呢?原来SD卡的初始时钟不一定是<400KHz就行ST标准库初始化系统时APB2时钟为72MHz,经过256分频波特率约等于280KHz(SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;)对于我测试用的SD卡这个速度仍太快,于是降APB2时钟进行测试,OK!RCC_PCLK2Config(RCC_HCLK_Div4); //72/4=18MHz仅仅是一行代码,这就是初学代价!,哈哈.另外要说明的是,在MISO引脚上加了一个22k上接电阻.代码://#define USE_SOFT_SPI#ifdef USE_SOFT_SPIBYTE g_SPISpeedFlag=0;static void delay_bus(void){unsigned int i=100;if(g_SPISpeedFlag) //高速模式 < 25MHzi=10;while(--i) //低速模式 < 400KHz__nop();}void SpiOpen(void){//IO初始化用结构体GPIO_InitTypeDef GPIO_InitStructure;//输出引脚初始化GPIO_InitStructure.GPIO_Pin=SD_SCK|SD_CS|SD_MOSI;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);//输入引脚配置GPIO_InitStructure.GPIO_Pin=SD_MISO;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING ; GPIO_Init(GPIOB, &GPIO_InitStructure);//设置端口初始电平GPIO_SetBits(GPIOB,SD_CS);GPIO_SetBits(GPIOB,SD_SCK);g_SPISpeedFlag=0;}void SpiClose(void){GPIO_SetBits(GPIOB,SD_CS);GPIO_SetBits(GPIOB,SD_SCK);Stat &= ~STA_NOINIT;}void SPI_SetHeighSpeed(void){g_SPISpeedFlag=1;}BYTE SPI_ReadWriteByte(BYTE outgoing){uint32_t i;uint8_t ret=0;delay_bus();for(i=0;i<8;i++){ret<<=1;if(outgoing &0x80) //主设备锁存数据GPIO_SetBits(GPIOB,SD_MOSI);elseGPIO_ResetBits(GPIOB,SD_MOSI);GPIO_ResetBits(GPIOB,SD_SCK); //产生第一个时钟沿,让从设备也在此时锁存数据 delay_bus();if(GPIO_ReadInputDataBit(GPIOB,SD_MISO)) //主设备采样ret|=1;GPIO_SetBits(GPIOB,SD_SCK); //产生第二个时钟沿,让从设备也在此时采样delay_bus();outgoing<<=1;}return ret;}#else //硬件SPI 使用SPI1引脚重映射void SpiOpen(void){GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);/* Configure SPI1 pins: SCKand MOSI */GPIO_InitStructure.GPIO_Pin = SD_MOSI|SD_SCK|SD_MISO;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);/* Configure PB7 pin: CS pin */GPIO_InitStructure.GPIO_Pin = SD_CS;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,SD_CS);/* SPI1 Config */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* SPI1 enable */SPI_Cmd(SPI1, ENABLE);}void SpiClose(void){SPI_Cmd(SPI1, DISABLE);Stat &= ~STA_NOINIT;}void SPI_SetHeighSpeed(void){SPI_InitTypeDef SPI_InitStructure;/* SPI1 Config */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);}BYTE SPI_ReadWriteByte(BYTE outgoing){/* Loop while DR register in not emplty */while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);/* Send byte through the SPI1 peripheral */SPI_I2S_SendData(SPI1, outgoing);/* Wait to receive a byte */while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);/* Return the byte read from the SPI bus */return SPI_I2S_ReceiveData(SPI1);}#endif。
STM32功能引脚端口复用和重映射
STM32功能引脚端口复用和重映射
在STM32系列微控制器中,每个引脚都有一个默认的功能。
通过端口复用,我们可以将一个引脚的默认功能改变为其他的功能。
每个引脚都有一个对应的功能选择字,可以通过设置这个字来实现不同的功能。
引脚的功能可以是GPIO输入输出、模拟输入输出、定时器输入输出、串行通信等等。
端口复用功能使我们可以在同一个引脚上实现多种不同功能的选择。
比如,一个IO引脚默认是用作GPIO输入输出的,可以通过端口复用将其改为定时器的输入或输出引脚,实现定时器功能。
在一些情况下,系统的引脚数量有限,无法满足需求,此时就可以使用引脚重映射来实现更多的功能。
引脚重映射是将一个引脚的默认功能映射到其他引脚上,可以实现多个引脚共享一个功能。
引脚重映射需要特定的硬件支持,不是所有引脚都支持重映射。
可以通过引脚映射寄存器来设置引脚重映射。
引脚重映射的功能让系统设计更加灵活和可扩展。
在一个引脚只能实现一个功能的情况下,通过重映射可以将多个引脚的功能映射到一个引脚上,实现多个功能的共享。
端口复用和重映射的具体实现方式和寄存器设置是根据不同型号的STM32微控制器而有所不同的。
在开发过程中,需要查阅相关的文档和手册,了解具体的端口复用和重映射的功能和设置方法。
总之,STM32微控制器的功能引脚可以通过端口复用和重映射实现多种不同的功能。
端口复用可以改变引脚的默认功能,而重映射可以实现多个引脚共享一个功能。
这些功能增强了系统的灵活性和可扩展性。
在实际
应用中,需要根据具体需求选择适当的引脚复用和重映射方式,以满足系统的需求。
STM32F0系列MCU中断向量表的重映射
STM32F0系列MCU中断向量表的重映射最近使⽤了⼀款Cortex-M0内核的芯⽚STM32F030CC,发现它中断向量表的重映射⽅法与STM32F10x系列的有所区别,在这⾥记录与分享⼀下。
由于需要通过IAP进⾏固件升级,所以芯⽚的FLASH⾥⾯要烧录两份代码:⼀个Boot loader, ⼀个⽤户应⽤程序。
理所当然的,在⽤户应⽤程序中,必须得重新映射中断向量表。
可是在ST提供的固件库⾥,我却没有发现类似于stm32f10x固件库中的void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)接⼝。
浏览了⼀下,原来M0并没有SCB->VTOR这个寄存器,难怪ST的库⾥没有提供NVIC_SetVectorTable这个接⼝。
这下要怎么办?在⽹络上搜索了⼀下,受到⽹友的启发,我在中找到以下说明:Physical remap Once the boot mode is selected, the application software can modify the memory accessible in the code area.This modification is performed by programming the MEM_MODE bits in the SYSCFG configuration register 1 (SYSCFG_CFGR1). Unlike Cortex® M3 and M4, the M0 CPU does not support the vector table relocation. For application code which is located in a different address than 0x0800 0000, some additional code must be added in order to be able to serve the application interrupts. A solution will be to relocate by software the vector table to the internal SRAM: • Copy the vector table from the Flash (mapped at the base of the application load address) to the base address of the SRAM at0x2000 0000. • Remap SRAM at address 0x0000 0000, using SYSCFG configuration register 1. • Then once an interrupt occurs, the Cortex®-M0 processor will fetch the interrupt handler start address from the relocated vector table in SRAM, then it will jump to execute the interrupt handler located in the Flash. This operation should be done at the initialization phase of the application. Please refer to and attached IAP code from for more details. OK,解决⽅法找到了! 在⽤户应⽤程序中,按照以上⽅法,添加以下两⾏代码:memcpy((void*)0x20000000, (void*)0x08004000, VECTOR_SIZE);SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); 其中,0x2000 0000是SRAM的起始地址,这个不需要改动。
stm32 TIM2 重映射过程中的需要注意的细节点
stm32的TIM2的端口使用组合有下面四种:1.当不重映射时,默认TIM2四个的IO口是PA0、PA1、PA2、PA32.要使用PA15、PB3、PA2、PA3的端口组合,要调用下面的语句进行部分重映射:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重映射必须要开AFIO时钟GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);3.要使用PA0、PA1、PB10、PB11的端口组合,要调用下面的语句进行部分重映射:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重映射必须要开AFIO时钟GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE);4.要使用PA15、PB3、PB10、PB11的端口组合,要调用下面的语句进行完全重映射:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重映射必须要开AFIO时钟GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);同时还要禁用JTAG功能,PA15、PB3、PB10、PB11才会正常输出。
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);/**********************1.执行端口重映射时,复用功能时钟得使能:RCC_APB2Periph_AFIO2. 1. GPIO_Remap_SWJ_Disable: !< Full SWJ Disabled (JTAG-DP + SW-DP)此时PA13|PA14|PA15|PB3|PB4都可作为普通IO用了为了保存某些调试端口,GPIO_Remap_SWJ_Disable也可选择为下面两种模式:2. GPIO_Remap_SWJ_JTAGDisable: !< JTAG-DP Disabled and SW-DP Enabled此时PA15|PB3|PB4可作为普通IO用了3. GPIO_Remap_SWJ_NoJTRST: !< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST此时只有PB4可作为普通IO用了**********************/GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); //使能禁止JTAGGPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //JATG-DP禁用,但是SW-DP可使用//初始化GPIOB 推挽输出GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_3|GPIO_Pin_4);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_3|GPIO_Pin_4);//初始化GPIOA 推挽输出GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);。
STM32的功能引脚重映射和复用功能
STM32的功能引脚重映射和复用功能STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能,本文对一些在使用引脚重映射时所遇到的有关问题加以说明。
我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出脚位都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的脚位外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的脚位。
下面是STM32F103xC中有关USART3引脚的摘要片段;从这里可以看出,USART3_TX的默认引出脚是PB10, USART3_RX的默认引出脚是PB11;但经过重映射后,可以变更USART3_TX的引出脚为PD8,变更USART3_RX的引出脚为PD9。
STM32中的很多内置外设都具有重映射的功能,比如USART、定时器、CAN、SPI、I2C等,详细请看STM32参考手册(RM0008)和STM32数据手册。
有些模块(内置外设)的重映射功能还可以有多种选择,下面是RM0008 ±有关USART3输入输出引脚的重映射功能表:Table 44, USART3 remapping从这个表中可以看出,USART3的TX和RX引脚默认的引出脚位是PB10^ PB11,根据配置位的设置,可以重映射到PC10和PC11,还可以重映射到PD8和PD9。
一个模块的功能引脚不管是从默认的脚位引出还是从重映射的脚位引出,都要通过GPIO端口模块实现,相应的GPIO端口必须配置为输入(对应模块的输入功能,如USART的RX)或复用输出(对应模块的输出功能,如USART的TX),对于输出引脚,可以按照需要配置为推挽复用输出或开漏复用输出。
Figure 17, Alternate function configurationail1. V DD FT 1$ H pot*?nri<ii specific to tiie-voh td^nt I Os and ditfe 冷m from V DD上图是STM32的GPIO 端口模块,使用复用功能时的配置。
单片机重映射
单片机重映射随着科技的发展和应用的广泛,单片机(Microcontroller)在各个领域中得到了广泛的应用。
单片机重映射(Remapping)是指将单片机的引脚或者功能进行重新分配和配置,以满足特定应用需求的一种技术手段。
通过单片机重映射,可以使单片机具备更多的功能和扩展性,提高系统的灵活性和效率。
单片机重映射涉及到对单片机的引脚和功能进行重新配置,使其能够适应不同的应用场景。
在单片机设计中,通常会有一些功能模块或引脚需要被多个外设所共享,而这些外设可能需要在不同的时间段内使用。
为了解决这个问题,就需要对单片机进行重映射,将不同的功能或引脚分时使用,从而实现多个外设的共享。
单片机重映射的具体实现方法可以有多种,比较常见的有软件重映射和硬件重映射两种方式。
软件重映射是通过软件编程的方式实现的,通过对单片机的寄存器进行设置和配置,将某个引脚或功能从一个外设映射到另一个外设。
软件重映射的优点是灵活性高,可以根据需要随时进行配置和修改。
但是,软件重映射的缺点是需要占用额外的处理器资源和时间,并且可能会影响系统的实时性能。
硬件重映射是通过硬件电路的方式实现的,通过对单片机的引脚进行物理连接和切换,将某个引脚或功能从一个外设映射到另一个外设。
硬件重映射的优点是实时性好,不会影响系统的性能和时序要求。
但是,硬件重映射的缺点是配置和修改比较困难,需要设计和制造专门的硬件电路。
单片机重映射的应用非常广泛。
在嵌入式系统中,由于单片机的引脚和功能资源有限,需要通过重映射来实现多个外设的共享。
比如,一个单片机可能需要同时连接多个传感器、执行器和通信模块,通过重映射可以将不同的功能映射到不同的引脚上,从而实现多个外设的并行工作。
在工业控制系统中,单片机重映射也发挥着重要的作用。
工业控制系统通常需要连接大量的传感器、执行器和通信设备,通过重映射可以将不同的功能映射到不同的引脚上,从而实现系统的灵活配置和扩展。
单片机重映射还可以用于汽车电子、医疗设备、智能家居等领域。
STM32功能引脚端口复用和重映射
STM32功能引脚端口复用和重映射端口复用是指一个引脚可以同时用于不同的外设功能。
每个引脚都有一个默认的功能,但根据需要,可以将其配置为其他功能。
这样,同一个引脚可以在不同的时间用于不同的外设,从而实现更灵活的系统设计。
重映射是指将一个引脚的默认功能切换到另一个引脚。
这样可以实现更多的功能引脚的分配和灵活性。
在STM32系列微控制器中,端口复用和重映射功能是通过复用矩阵和AFIO寄存器来实现的。
复用矩阵是一个硬件单元,用于控制引脚的端口复用。
每个引脚可以配置为多达数个复用功能之一、通过配置相应的复用矩阵,可以选择所需的功能。
AFIO寄存器是配置引脚的重映射功能的控制寄存器。
通过设置相应的寄存器位,可以将一些引脚的默认功能重映射到另一个引脚,同时也可以取消重映射,恢复到默认功能。
引脚端口复用和重映射的具体步骤如下:首先,需要确定所需的引脚功能。
查阅相关的参考手册或数据手册,可以了解到每个引脚的默认功能以及所有可能的复用功能。
然后,根据需要配置复用矩阵。
复用矩阵通常是通过设置GPIO口模式寄存器来实现的。
配置复用矩阵时,需要注意以下几点:1.每个引脚只能选择一种功能,不能同时选择多种功能。
2.不同的引脚可能有不同的复用功能选项,需要确保所选择的功能是合适的。
3.复用功能是互斥的,即其中一个引脚的复用功能被选中后,其他引脚将失去该功能选项。
最后,如果需要进行重映射,可以通过配置AFIO寄存器来实现。
重映射功能通常是通过设置AFIO复用寄存器来完成的。
配置重映射时,需要注意以下几点:1.不是所有的引脚都支持重映射功能,需要查阅相关的参考手册或数据手册来确定。
2.每个引脚的重映射功能选项可能不同,需要确保所选择的选项是合适的。
3.需要小心使用重映射功能,确保不会影响其他外设的正常工作。
端口复用和重映射功能可以极大地增加STM32微控制器的灵活性。
通过合理地使用这些功能,可以最大限度地利用资源,实现更复杂和功能强大的系统设计。
STM32的SPI1引脚重映射
STM32的SPI1引脚重映射初次使用STM32有些不太明白,此次调试经验奉献出来与大家分享!系统:STM32 + SD + FA TFSSTM32与SD卡的连接如下定义,PB口#define SD_SCK GPIO_Pin_3#define SD_MISO GPIO_Pin_4#define SD_MOSI GPIO_Pin_5#define SD_CS GPIO_Pin_7我想使用SPI1并重映射引脚使用时注意的事项如下:1.使能PB0时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);2.使能AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);3.使能SPI1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE);4.禁用JTAG时钟复用 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);5.SPI1引脚重映射 GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);接着初始化GPIO和SPI1即可,如:void SpiOpen(void){GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;/* Configure SPI1 pins: SCKand MOSI */GPIO_InitStructure.GPIO_Pin = SD_MOSI|SD_SCK|SD_MISO;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);/* Configure PB7 pin: CS pin */GPIO_InitStructure.GPIO_Pin = SD_CS;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,SD_CS);/* SPI1 Config */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* SPI1 enable */SPI_Cmd(SPI1, ENABLE);}可是这一切完成的时候结果却与想象的不同,无法在SD卡内创建文件,找一个晚上没有结果不得已采用另一种方法:软件模拟SPI测试了一下,结果另人出呼意料,一次搞定,没有任何问题,但为了效率还是希望使用硬SPI口,于是从引脚重映射上寻找原因又费了一晚上无果第三个晚上:经过无数次的改动 + 测试终于OK了,问题出在哪里了呢?原来SD卡的初始时钟不一定是<400KHz就行ST标准库初始化系统时APB2时钟为72MHz,经过256分频波特率约等于280KHz(SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;)对于我测试用的SD卡这个速度仍太快,于是降APB2时钟进行测试,OK!RCC_PCLK2Config(RCC_HCLK_Div4); //72/4=18MHz仅仅是一行代码,这就是初学代价!,哈哈.另外要说明的是,在MISO引脚上加了一个22k上接电阻.代码://#define USE_SOFT_SPI#ifdef USE_SOFT_SPIBYTE g_SPISpeedFlag=0;static void delay_bus(void){unsigned int i=100;if(g_SPISpeedFlag) //高速模式 < 25MHzi=10;while(--i) //低速模式 < 400KHz__nop();}void SpiOpen(void){//IO初始化用结构体GPIO_InitTypeDef GPIO_InitStructure;//输出引脚初始化GPIO_InitStructure.GPIO_Pin=SD_SCK|SD_CS|SD_MOSI;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);//输入引脚配置GPIO_InitStructure.GPIO_Pin=SD_MISO;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING ; GPIO_Init(GPIOB, &GPIO_InitStructure);//设置端口初始电平GPIO_SetBits(GPIOB,SD_CS);GPIO_SetBits(GPIOB,SD_SCK);g_SPISpeedFlag=0;}void SpiClose(void){GPIO_SetBits(GPIOB,SD_CS);GPIO_SetBits(GPIOB,SD_SCK);Stat &= ~STA_NOINIT;}void SPI_SetHeighSpeed(void){g_SPISpeedFlag=1;}BYTE SPI_ReadWriteByte(BYTE outgoing){uint32_t i;uint8_t ret=0;delay_bus();for(i=0;i<8;i++){ret<<=1;if(outgoing &0x80) //主设备锁存数据GPIO_SetBits(GPIOB,SD_MOSI);elseGPIO_ResetBits(GPIOB,SD_MOSI);GPIO_ResetBits(GPIOB,SD_SCK); //产生第一个时钟沿,让从设备也在此时锁存数据 delay_bus();if(GPIO_ReadInputDataBit(GPIOB,SD_MISO)) //主设备采样ret|=1;GPIO_SetBits(GPIOB,SD_SCK); //产生第二个时钟沿,让从设备也在此时采样delay_bus();outgoing<<=1;}return ret;}#else //硬件SPI 使用SPI1引脚重映射void SpiOpen(void){GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);/* Configure SPI1 pins: SCKand MOSI */GPIO_InitStructure.GPIO_Pin = SD_MOSI|SD_SCK|SD_MISO;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);/* Configure PB7 pin: CS pin */GPIO_InitStructure.GPIO_Pin = SD_CS;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,SD_CS);/* SPI1 Config */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* SPI1 enable */SPI_Cmd(SPI1, ENABLE);}void SpiClose(void){SPI_Cmd(SPI1, DISABLE);Stat &= ~STA_NOINIT;}void SPI_SetHeighSpeed(void){SPI_InitTypeDef SPI_InitStructure;/* SPI1 Config */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);}BYTE SPI_ReadWriteByte(BYTE outgoing){/* Loop while DR register in not emplty */while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);/* Send byte through the SPI1 peripheral */SPI_I2S_SendData(SPI1, outgoing);/* Wait to receive a byte */while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);/* Return the byte read from the SPI bus */return SPI_I2S_ReceiveData(SPI1);}#endif。
(26条消息)STM32的GPIO的复用功能和重映射功能
(26条消息)STM32的GPIO的复用功能和重映射功能1、复用功能:内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚)STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
2、重映射功能:复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变到其他的引脚上!直接好处:PCB电路板的设计人员可以在需要的情况下,不必把某些信号在板上绕一大圈完成联接,方便了PCB的设计同时潜在地减少了信号的交叉干扰。
如:USART1:0: 没有重映像(TX/PA9,RX/PA10);1: 重映像(TX/PB6,RX/PB7)。
(参考AFIO_MAPR寄存器介绍)[0,1为一寄存器的bit值]【注】下述复用功能的引出脚具有重映射功能:- 晶体振荡器的引脚在不接晶体时,可以作为普通I/O口- CAN模块; - JTAG调试接口;- 大部分定时器的引出接口; - 大部分USART引出接口- I2C1的引出接口; - SPI1的引出接口;开启复用功能:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PPRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);开启重映射功能:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);举例:对于STM32F103VBT6,47引脚为PB10,它的复用功能是I2C2_SCL和USART3_TX,表示在上电之后它的默认功能为PB10,而I2C2的SCL和USART3的TX为它的复用功能;另外在TIM2的引脚重映射后,TIM2_CH3也成为这个引脚的复用功能。
stm32重映射功能原理
stm32重映射功能原理
重映射功能是指将STM32微控制器的某些外设引脚映射到不同的管脚上的一
种功能。
这在一些特定的应用场景下非常有用,比如当某个外设占用了我们需要使用的管脚时,我们可以通过重映射功能将其映射到其他可用的管脚上,以满足需求。
STM32系列微控制器通常具有多个外设模块,如UART、SPI、I2C等,这些
模块通常需要与外部设备进行通信,并使用管脚来进行数据传输。
每个模块都有一组默认的管脚映射,但有时这些默认的管脚可能与其他模块或外设冲突。
在这种情况下,我们可以通过重映射功能来解决冲突问题。
重映射功能通过修改特定的寄存器来实现。
一般来说,STM32系列微控制器
的引脚可以具有多个功能,如GPIO、复用功能等。
重映射功能实质上是将某个外
设引脚映射到对应的复用功能上。
通过设置相应的寄存器,我们可以将某个外设引脚映射到我们选择的管脚上,以满足硬件连接的需求。
需要注意的是,重映射功能并不适用于所有的管脚和外设。
只有特定的管脚和
外设组合才支持重映射。
因此,在使用重映射功能之前,我们需要查看芯片手册,了解哪些管脚和外设是可供重映射的。
另外,重映射功能还可能涉及到其他相关设置,如使能某个外设、配置引脚的模式等。
总的来说,重映射功能是STM32微控制器提供的一种灵活的功能,它可以帮
助我们解决管脚资源冲突的问题,提高硬件系统的灵活性和可扩展性。
通过合理使用重映射功能,我们可以更好地进行外设配置,满足不同应用场景下的需求。
STM32的功能引脚重映射和复用功能
STM32的功能引脚重映射和复用功能STM32是意法半导体公司推出的一系列32位ARM Cortex-M处理器的微控制器系列产品。
它主要用于嵌入式系统和物联网设备中,具有高性能、低功耗和丰富的外设功能。
在STM32微控制器中,功能引脚重映射和复用功能是非常重要的特性之一,它可以提高引脚的灵活性和可扩展性。
下面将详细介绍STM32的功能引脚重映射和复用功能。
功能引脚重映射是STM32微控制器系列中的一项功能,它允许用户将一些功能引脚的功能重新映射到其他引脚上。
这样就能够根据具体的应用需求来灵活配置引脚的功能,以适应不同的外设和接口。
通过功能引脚重映射,用户可以实现一些引脚的多种不同功能,提高了引脚的利用率。
STM32的功能引脚重映射功能通过寄存器设置来实现。
例如,在STM32F4系列微控制器中,有一个叫做AFIO(Alternate Function IO)的外设,它提供了一组寄存器用于配置引脚的功能和重映射。
用户可以根据手册中的引脚映射表来选择合适的重映射功能,并将相应的值写入到AFIO寄存器中即可完成功能引脚重映射。
在实际应用中,功能引脚重映射功能可以用于实现多种不同功能,例如GPIO、串口、SPI、I2C、定时器等。
以串口为例,STM32的串口通信功能可以通过功能引脚重映射来实现不同的串口接口。
对于一些串口功能引脚,可以将其重映射为USART1、USART2、USART3等串口接口,以满足不同的应用需求。
这样就可以通过配置功能引脚重映射,灵活地选择串口接口和引脚分配,提高了系统的扩展性和可移植性。
除了功能引脚重映射,STM32还提供了复用功能,它允许多个外设共享一个引脚。
通过复用功能,可以实现在不同的时刻使用同一个引脚来连接不同的外设。
例如,一个引脚可以在一些时刻连接到一个定时器,而在另一个时刻连接到一个ADC。
这种引脚复用功能可以大大减少外设的引脚资源,提高系统的灵活性和可扩展性。
在STM32微控制器中,复用功能通过寄存器配置来实现。
stm32存储器映射原理
stm32存储器映射原理小伙伴!今天咱们来唠唠STM32的存储器映射原理,这就像是给STM32芯片里的各种东西安排住址一样有趣呢!你可以把STM32想象成一个超级大的公寓,里面住着各种各样的数据和程序。
这个公寓有好多不同的房间,每个房间都有它独特的用途,这就是存储器映射的概念啦。
在这个芯片公寓里,有不同类型的存储器。
比如说,有Flash存储器,这就像是公寓里的大仓库。
它用来存放那些不会轻易改变的东西,像程序代码之类的。
这个大仓库可重要啦,就像我们把家里的贵重物品和常用工具放在固定的地方一样。
程序代码就安安稳稳地待在Flash里,随时准备被调用执行。
然后呢,还有SRAM,这就像是公寓里的临时工作间。
当程序运行的时候,会产生很多临时的数据,这些数据就像一群忙碌的小工匠,它们在SRAM这个临时工作间里跑来跑去,干着各种各样的活儿。
比如说,变量的值就存在这里。
你可以想象成小工匠们在这里记录自己的工作进度呀,或者是临时存放一些材料什么的。
那这个存储器映射呢,就是给这些不同的存储器,也就是Flash、SRAM等,分配了特定的地址范围。
这就好比给公寓里的每个房间都编上了门牌号。
比如说,Flash 存储器可能被分配到从地址0x08000000开始的一大片地址空间,这就是它的专属区域啦。
就像住在这个公寓里的某个家庭有自己特定的楼层和房间号一样。
当CPU这个公寓管理员想要找某个数据或者程序的时候,它就根据这个地址去找。
就像我们要找某个小伙伴,知道他住在哪间房,就直接奔着那个门牌号去了。
比如说,CPU要执行一段程序代码,它就知道去Flash存储器对应的地址范围里找,因为那里是程序代码的“家”。
而且呀,这种存储器映射还有个好处呢。
它让整个系统看起来非常有条理。
就像公寓里的布局规划得很好,大家各司其职,不会乱成一团。
不同的外设,像定时器、串口等,它们也有自己对应的地址空间。
这就好比公寓里的各种设施,比如电梯、健身房之类的,也都有自己特定的位置编号。
STM32学习笔记之使能AFIO时钟与重映射功能
STM32学习笔记之使能AFIO时钟与重映射功能最近在学习STM32的外部中断时,例程上有这样⼀句代码RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 这句代码的功能是使能复⽤功能时钟,刚开始不知道为什么有时候需要启动RCC_APB2Periph_AFIO时钟,有时候⼜不需要,之后在⽹上查找资料和看⼿册,终于搞清楚了。
STM32F10xxx的参考⼿册中⽂版本对AFIO寄存器描述STM32 AFIO复⽤功能寄存器(参考)AFIO_EVCR:复⽤事件控制寄存器AFIO_MAPR:复⽤功能重映射和调试I/O配置寄存器,配置某些引脚第三功能。
AFIO_EXTICR1:外部中断配置寄存器1,配置外部中断EXTI0,1,2,3给Px0,Px1,Px2,Px3引脚。
(x=A,B,C,D,E…)AFIO_EXTICR2:外部中断配置寄存器2,配置外部中断EXTI4,5,6,7给Px4,Px5,Px6,Px7引脚。
(x=A,B,C,D,E…)AFIO_EXTICR3:外部中断配置寄存器3,配置外部中断EXTI8,9,10,11给Px8,Px9,Px10,Px11引脚。
(x=A, B,C,D,E…)AFIO_EXTICR4:外部中断配置寄存器4,配置外部中断EXTI12,13,14,15给Px12,Px13,Px14,Px15引脚。
(x=A,B,C,D,E…)因为在配置外部中断时,要对 AFIO_EXTICRX进⾏读写操作,所以要打开RCC_APB2Periph_AFIO时钟。
RCC_APB2Periph_AFIO是重映射功能的时钟,只要你没有将特定的外设指定的IO Remap(重映射)到其它端⼝(也是指定的),就不需要打开AFIO时钟。
⽐如说,在使⽤TIM1时,因为使⽤的默认的PA、PB相应端⼝,并没有进⾏Remap,因此不需要读写AFIO寄存器,所以不需要启动RCC_APB2Periph_AFIO时钟。
STM32复用功能重定义说明__《STM32管脚重定义》一文的误区
STM32复⽤功能重定义说明__《STM32管脚重定义》⼀⽂的误区在⽹上看到这么⼀篇关于STM32复⽤功能重定义的⽂章,其中有很多误读的部分,本⼈做⼀些修正,望⾼⼿指教!其⽂如下:“近来在进修STM32,在BZ上⼀篇关于的串⼝通信⽂章⾥有这么⼀段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);当初是参考开辟的⾥⼦写的⼀向对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂,经由过程这⼏天在⽹上查找材料和看⼿册,终于⾼清楚了,不敢独享,欲望能对跟我⼀样的新⼿有所帮助吧o(∩_∩)o...STM32上有很多I/O⼝,也有很多的内置外假想I2C,ADC,ISP,USART等,为了节俭引出管脚,这些内置外设根蒂根基上是与I/O⼝共⽤管脚的,也就是I/O管脚的复⽤功能。
然则STM32还有⼀希罕之处就是:很多复⽤内置的外设的I/O引脚可以经由过程重映射功能,从不合的I/O管脚引出,即复⽤功能的引脚是可经由过程法度改变的。
知道了这些我们就不难懂得上⽅代码的意思了,法度顶⽤到的USART2外设的TX,RX分别对应PA2,PA3,然则我的进修板上的PA2,PA3引脚接了其他设备,然则为了还要⽤USART2,“RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO”就打开了GPIOD重映射功能把USART2设备的TX,RX映射到PD5,PD6上,我们在这两个引脚上接上MAX232串⼝芯⽚就可以应⽤USART2串⼝通信了。
那为看官该问:“USART2是不是可以映射到随便率性管脚呢?”答案是否定的,它只能映射到固定的管脚,下图是USART2重映射表其他外设的重映射可以参考STM32100X⼿册。
为了节俭IO资料单⽚机会在⼀个IO上复⽤很多功能,⼀般的单⽚机⽤到⼀个功能后就能再⽤两外复⽤的功能了,这就表现出了STM32 GPIO的强⼤功能了,我们⽤重映射的办法把此中⼀个外设映射到其他IO脚上!在datasheet上 PA0的默认功能是WKUP/USART2_CTS(8)/ADC_IN0/TIM2_CH1_ETR(8),PD3的重定义功能是USART2_CTS,也就是上⽂所说PD3可重定义为PA0的USART2_CTS功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32 学习笔记之重映射功能
简介:最近在学习STM32,在BZ 上一篇关于的串口通信文章里有这么一
段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); 当初是参考开发的里子写的一直对GPIOD
或上RCC_APB2Periph_ ...关键字:STM32 重映射最近在学习STM32,在BZ 上一篇关于的串口通信文章里有这么一段代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);
当初是参考开发的里子写的一直对GPIOD 或上RCC_APB2Periph_AFIO 这
句话的意思没搞懂,通过这几天在网上查找资料和看手册,终于高清楚了,不
敢独享,希望能对跟我一样的新手有所帮助吧o(∩_∩)o...
STM32 上有很多I/O 口,也有很多的内置外设想I2C,ADC,ISP,USART 等,
为了节省引出管脚,这些内置外设基本上是与I/O 口共用管脚的,也就是I/O
管脚的复用功能。
但是STM32 还有一特别之处就是:很多复用内置的外设的
I/O 引脚可以通过重映射功能,从不同的I/O 管脚引出,即复用功能的引脚是可
通过程序改变的。
知道了这些我们就不难理解上面代码的意思了,程序中用到
的USART2 外设的TX,RX 分别对应PA2,PA3,但是我的学习板上的
PA2,PA3 引脚接了其他设备,但是为了还要用
USART2,RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO 就打开了GPIOD 重映射功能把USART2 设备的TX,RX 映射到PD5,PD6 上,我们在这两个引
脚上接上MAX232 串口芯片就可以使用USART2 串口通信了。
那为看官该问:USART2 是不是可以映射到任意管脚呢?答案是否定的,它只能映射到固定的
管脚,下图是USART2 重映射表。