STM32功能引脚端口复用和重映射

合集下载

STM32的功能引脚重映射和复用功能

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-复用功能和重映射

stm32-复用功能和重映射IO口的复用最近在学习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手册。

二、保留TIM2在PA口,将USART2重映射到PD口上,很明显,当TIM2完全不重映射时,USART2所需的信号线只有时钟信号Clock不受影响,这种情况下也没有部分映射可言了,必须将USART2完全重映射到PD3~PD7上,同样的,这种情况下FSMC就不能用了(被USART2占用)。

STM32端口复用和端口重映射?什么是端口复用重映射?

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部分重映射和完全重映射(查看数据手册)

STM32部分重映射和完全重映射(查看数据⼿册)
数据⼿册如何查找对应的映射:
打开官⽹直接搜索STM32F可以看到数据⼿册,⾥⾯有关于,输⼊第6页的页码,点击9.3中的9.3x可打开对应的链接。

举例说明:
STM32中拥有重映射功能,可以使硬件电路的设计更加简洁⽅便,在配置GPIO_PinRemapConfig()函数时,发现⼊⼝参数有两种重映射,分为部分重映射(Partial Remap)和完全重映射(Full Remap),那么这两个有什么区别呢?
标题以TIM3为例
根据图⽚可以看到,TIM3的部分重映射和完全重映射对应的引脚是不同的,所以在配置选择部分重映射和完全重映射的时候要考虑⼀下。

重映射引脚分配图在哪
这⼀部分其实并不在STM32的数据⼿册中,⽽在STM32的官⽅⼿册的8.3节,⾥⾯有所有功能的引脚分配情况。

STM32的SPI1引脚重映射

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功能引脚端口复用和重映射
在STM32系列微控制器中,每个引脚都有一个默认的功能。

通过端口复用,我们可以将一个引脚的默认功能改变为其他的功能。

每个引脚都有一个对应的功能选择字,可以通过设置这个字来实现不同的功能。

引脚的功能可以是GPIO输入输出、模拟输入输出、定时器输入输出、串行通信等等。

端口复用功能使我们可以在同一个引脚上实现多种不同功能的选择。

比如,一个IO引脚默认是用作GPIO输入输出的,可以通过端口复用将其改为定时器的输入或输出引脚,实现定时器功能。

在一些情况下,系统的引脚数量有限,无法满足需求,此时就可以使用引脚重映射来实现更多的功能。

引脚重映射是将一个引脚的默认功能映射到其他引脚上,可以实现多个引脚共享一个功能。

引脚重映射需要特定的硬件支持,不是所有引脚都支持重映射。

可以通过引脚映射寄存器来设置引脚重映射。

引脚重映射的功能让系统设计更加灵活和可扩展。

在一个引脚只能实现一个功能的情况下,通过重映射可以将多个引脚的功能映射到一个引脚上,实现多个功能的共享。

端口复用和重映射的具体实现方式和寄存器设置是根据不同型号的STM32微控制器而有所不同的。

在开发过程中,需要查阅相关的文档和手册,了解具体的端口复用和重映射的功能和设置方法。

总之,STM32微控制器的功能引脚可以通过端口复用和重映射实现多种不同的功能。

端口复用可以改变引脚的默认功能,而重映射可以实现多个引脚共享一个功能。

这些功能增强了系统的灵活性和可扩展性。

在实际
应用中,需要根据具体需求选择适当的引脚复用和重映射方式,以满足系统的需求。

stm32 TIM2 重映射过程中的需要注意的细节点

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的功能引脚重映射和复用功能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 端口模块,使用复用功能时的配置。

STM32单片机的复用端口初始化的步骤及方法

STM32单片机的复用端口初始化的步骤及方法

STM32单片机的复用端口初始化的步骤及方法STM32有好几个串口。

比如说STM32F103ZET6有5个串口,串口1的引脚对应的IO为PA9,PA10.PA9,PA10默认功能是GPIO,所以当PA9,PA10引脚作为串口1的TX,RX引脚使用的时候,那就是端口复用。

复用端口初始化有几个步骤:1)GPIO端口时钟使能。

要使用到端口复用,当然要使能端口的时钟了。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);2)复用的外设时钟使能。

比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);3)端口模式配置。

在IO复用位内置外设功能引脚的时候,必须设置GPIO端口的模式,至于在复用功能下GPIO的模式是怎么对应的,这个可以查看手册。

所以,我们在使用复用功能的是时候,最少要使能2个时钟:1)GPIO时钟使能;2)复用的外设时钟使能同时要初始化GPIO以及复用外设功能串口设置的一般步骤可以总结为如下几个步骤:1)串口时钟使能,GPIO时钟使能2)串口复位3)GPIO端口模式设置4)串口参数初始化5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)6)使能串口7)编写中断处理函数端口重映射:(暂略)中断量控制:STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。

而我们常用的就是这68个可屏蔽中断,但是STM32的68个可屏蔽中断,在。

STM32考试习题及答案讲解

STM32考试习题及答案讲解

STM32考试习题及答案、填空题二、选择题三、简答题1•简述不同复用功能的重映射。

答:为了优化不同引脚封装的外设数目,这时,复用功能不再映射到它们原始分配的引脚上。

在程序上,是通过设置复用重映射和调试I/O 配置寄存器(AFIO_MAPR )来实现引脚的重新映射。

各个复用功能的重映射可以参阅 正文的介绍,由于内容比较多,正文介绍非常详细,这里省略。

2 .简述STM32的GPIO 的一些主要特点(至少 5个)。

答:主要特点如下:通用I/O ,可以作为输出、输入等功能。

单独的位设置或位清除。

外部中断/唤醒线。

复用功能(AF )和重映射。

GPIO 锁定机制。

1. 当STM32的I/O 端口配置为输入时,入 _______ 被激活。

根据输入配置(上拉,下拉或浮动 电阻 被连接。

出现在I/O 脚上的数据在每个对输入数据寄存器的读访问可得到I/O 状态。

2. STM32的所有端口都有外部中断能力。

当使用引脚必须配置成输入模式 _________ 。

3 . STM32具有单独的位设置或位清除能力。

这是通过 GPIOx BSRR 和 GPIOx BRR ________ 寄存器来实现的。

4 . ST 公司还提供了完善的通用IO 接口库函数,其位于 stm32f10x_gpio.c ________ ,对应的头文件为stm32f10x_gpio.h _______ 。

5•为了优化不同引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。

这时,复用功能不再映射到它们原始分配的引脚 ___________ 上。

在程序上,是通过设置 复用重映射和调试 I/O 配置寄存器(AFIO_MAPR ) _________________ 来实现引脚的重输出缓冲器 被禁止,)的不同,该引脚的APB2时钟被采样到输入数据寄存器,施密特触发输弱上拉和下拉外部中断线时,相应的1.在APB2上的I/O 脚的翻转速度为A. 18MHz C . 36MHz4•当输出模式位 MODE[1:O]= “ 10” A. 10MHzC . 50MHz(AB . D . )。

STM32的CAN现场总线应用总结

STM32的CAN现场总线应用总结

STM32的CAN现场总线应用总结CAN现场总线的应用最重要的就是其接口端口映射、初始化及数据的发送、接收。

STM32中的CAN物理引脚可以设置成三种:默认模式、重定义地址1模式、重定义地址2模式。

CAN信号可以被映射到端口A、端口B或端口D上,如下表所示,对于端口D,在36、48和64脚的封装上没有重映射功能。

重映射不适用于36脚的封装当PD0和PD1没有被重映射到OSC_IN和OSC_OUT时,重映射功能只适用于100脚和144脚的封装上---------------------------------------------------------------------------------------------------------------------- 默认模式/* Configure CAN pin: RX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/* Configure CAN pin: TX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);---------------------------------------------------------------------------------------------------------------------- 重定义地址1模式/* Configure CAN pin: RX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/* Configure CAN pin: TX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/*Configure CAN Remap 重映射*/GPIO_PinRemapConfig(GPIO_Remap1_CAN,ENABLE);---------------------------------------------------------------------------------------------------------------------- /* Configure CAN pin: RX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/* Configure CAN pin: TX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/*Configure CAN Remap 重映射 */GPIO_PinRemapConfig(GPIO_Remap2_CAN,ENABLE);---------------------------------------------------------------------------------------------------------------------- 设置完CAN 的引脚之后还需要打开CAN 的时钟: /* CAN Periph clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN,ENABLE); 2. 初始化2.1.1 CAN 单元初始化CAN 单元初始化最重要的就是波特率的设置,原理如下:t波特率=1/位时间位时间 = (1 + t BS1 + t BS2)× t q t q = t PCLKt PCLK = APB1例如现有一STM32系统时钟为72MHz ,关于CAN 波特率有以下设置: CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位 CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; //时间段1为8个时间单位 CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; //时间段2为7个时间单位 CAN_InitStructure.CAN_Prescaler = 45; //设定了一个时间单位的长度为45则其CAN 的波特率为1÷[(1+8+7)×456CAN 以外还包括以下设置:CAN_InitTypeDef CAN_InitStructure; //定义一个CAN 单元CAN_InitStructure.CAN_TTCM = DISABLE; //设置时间触发通信模式(失能) CAN_InitStructure.CAN_ABOM = DISABLE;// 使/失能自动离线管理(失能) CAN_InitStructure.CAN_AWUM = DISABLE;// 使/失能自动唤醒模式(失能) CAN_InitStructure.CAN_NART = DISABLE; //使/失能非自动重传输模式(失能) CAN_InitStructure.CAN_RFLM = DISABLE;// 使/失能接收FIFO 锁定模式(失能) CAN_InitStructure.CAN_TXFP = DISABLE; //使/失能发送FIFO 优先级(失能)CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//设置CAN 工作模式(正常模式) 2.1.2 CAN 报文过滤器初始化STM32共有14组过滤器,每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。

STM32复用功能重定义说明__《STM32管脚重定义》一文的误区

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功能。

STM32功能引脚端口复用和重映射

STM32功能引脚端口复用和重映射

STM32功能引脚端口复用和重映射端口复用是指一个引脚可以同时用于不同的外设功能。

每个引脚都有一个默认的功能,但根据需要,可以将其配置为其他功能。

这样,同一个引脚可以在不同的时间用于不同的外设,从而实现更灵活的系统设计。

重映射是指将一个引脚的默认功能切换到另一个引脚。

这样可以实现更多的功能引脚的分配和灵活性。

在STM32系列微控制器中,端口复用和重映射功能是通过复用矩阵和AFIO寄存器来实现的。

复用矩阵是一个硬件单元,用于控制引脚的端口复用。

每个引脚可以配置为多达数个复用功能之一、通过配置相应的复用矩阵,可以选择所需的功能。

AFIO寄存器是配置引脚的重映射功能的控制寄存器。

通过设置相应的寄存器位,可以将一些引脚的默认功能重映射到另一个引脚,同时也可以取消重映射,恢复到默认功能。

引脚端口复用和重映射的具体步骤如下:首先,需要确定所需的引脚功能。

查阅相关的参考手册或数据手册,可以了解到每个引脚的默认功能以及所有可能的复用功能。

然后,根据需要配置复用矩阵。

复用矩阵通常是通过设置GPIO口模式寄存器来实现的。

配置复用矩阵时,需要注意以下几点:1.每个引脚只能选择一种功能,不能同时选择多种功能。

2.不同的引脚可能有不同的复用功能选项,需要确保所选择的功能是合适的。

3.复用功能是互斥的,即其中一个引脚的复用功能被选中后,其他引脚将失去该功能选项。

最后,如果需要进行重映射,可以通过配置AFIO寄存器来实现。

重映射功能通常是通过设置AFIO复用寄存器来完成的。

配置重映射时,需要注意以下几点:1.不是所有的引脚都支持重映射功能,需要查阅相关的参考手册或数据手册来确定。

2.每个引脚的重映射功能选项可能不同,需要确保所选择的选项是合适的。

3.需要小心使用重映射功能,确保不会影响其他外设的正常工作。

端口复用和重映射功能可以极大地增加STM32微控制器的灵活性。

通过合理地使用这些功能,可以最大限度地利用资源,实现更复杂和功能强大的系统设计。

STM32引脚列表中主功能,默认复用功能和重定义功能的区别STM32F103RCT6引脚功能及使用

STM32引脚列表中主功能,默认复用功能和重定义功能的区别STM32F103RCT6引脚功能及使用

STM32引脚列表中主功能,默认复用功能和重定义功能的区别STM32F103RCT6引脚功能及使用1 主功能就是STM32基本IO口,与外设没有连接的,我们可以直接输出或读入高低电平使用时采用要初始化GPIO结构体参数,并打开端口的时钟2 默认复用功能是与外设连接的IO口,单片机通过控制IO口控制外设。

使用时采用要初始化GPIO结构体参数,IO口的工作模式要更具STM32中文参考手册中,IO口复用功能的设置工作模式,设置时,与主功能的唯一区别就是IO口的工作模式的不同。

3 当我想把外设不连接到默认引脚上,那就根据“重定义功能”这一列来重新定义外设连接的IO口。

一般情况我们不会用到。

注意:一旦需要对AFIO寄存器配置时,一定要打开AFIO的时钟(一般在使用外部中断EXTI或外设引脚重定义时)--------------------- 转载----------------------------STM32F103RCT6引脚功能及使用说明:1) VBAT:VBAT给RTC和备份区域供电,目的是在VDD断电时保证相关区域的数据内容有效,一般连接到外部电池。

若不用此功能,可直接连接到VDD。

2) 供电方案:Ø每个VDD各接一个0.1uF陶瓷电容,VDD3需要再接一个4.7~10uF的钽电容;Ø VDDA:10nF陶瓷电容+1nF钽电容;ØVREF+:可接VDDA,也可接外部参考源,此时,需要接10nF陶瓷电容+1nF钽电容;3) PC13/PC14/PC15:内部连接了模拟开关,只能通过少量的电流,驱动能力不够(不能用于点亮LED),且不能同时使用,尽量不用。

4) 进入待机模式之后,PA0-WKUP引脚上的上升沿,作为待机模式唤醒条件。

5) USART:CTS/RTS/CK/TX/RX,一般只使用TX/RX引脚实现异步通信,加上CK可以实现同步通信,CTS/RTS是硬件流控引脚,一般不用。

STM32F10x参考手册参考手册参考手册参考手册

STM32F10x参考手册参考手册参考手册参考手册
CAN_REMAP[1:0]:CAN复用功能重映像 这些位可由软件读写,控制复用功能CANRX和CANTX的重映像 00:CANRX映像到PA11,CANTX映像到PA12 01:未用组合 10:CANRX映像到PB8,CANTX映像到PB9(不能用于36脚的封装) 11:CANRX映像到PD0,CANTX映像到PD1(只适用于100脚的封装)
STM32F10x参考手册
第一版
通用和复用功能I/O(GPIO和AFIO)
5.3
5.3.1 5.3.2
5.3.3
复用功能I/O和调试配置(AFIO)
为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置 复用重映射和调试I/O配置寄存器(AFIO_MAPR)(参见5.4.1节)实现引脚的重新映射。这时, 复用功能不再映射到它们的原始分配上。
调试接口信号被映射到GPIO端口上,如表5-4所示。 表5-4 调试接口信号
复用功能 JTMS/SWDIO JTCK/SWCLK
JTDI JTDO/TRACESWO
JNTRST TRACECK TRACED0 TRACED1 TRACED2 TRACED3
GPIO端口 PA13 PA14 PA15 PB3 PB4 PE2 PE3 PE4 PE5 PE6
其它
禁用
1. I/O口只可在不使用异步跟踪时使用。
定时器复用功能重映射
定时器4的通道1到通道4可以从端口B重映射到端口D。其他定时器的重映射可能性列在表 5-6到表5-9里。
表5-6 定时器4复用功能重映像
复用功能
TIM4_REMAP = 0
TIM4_REMAP = 1
TIM4_CH1
PB6
PD12

STM32的SPI1引脚重映射

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的复用功能和重映射功能

(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也成为这个引脚的复用功能。

STM32IO口函数GPIO使用说明

STM32IO口函数GPIO使用说明

6.GPIO 锁定机制:当在一个端口位上执行了所定(LOCK)程序,在下一 次复位之前,将不能再更改端口位的配置。
GPIO 基本设置
GPIOMode_TypeDef GPIO mode 定义及偏移地址 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 //推挽复用 GPIO 输入输出速度选择: typedef enum { GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz } GPIOSpeed_TypeDef; #define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) ||
1 STM32 的输入输出管脚有下面 8 种可能的配置:(4 输入+2 输出+2 复用输出)
① 浮空输入_IN_FLOATING
② 带上拉输入_IPU
③ 带下拉输入__OD
⑥ 推挽输出_OUT_PP
⑦ 复用功能的推挽输出_AF_PP
⑧ 复用功能的开漏输出_AF_OD
3.3 GPIO 初始化完成
==================================================== =================== 最近刚开始学习 STM32,所以从最基本的 GPIO 开始学起;首先看看 STM32 的 datasheet 上对 GPIO 口的简单介绍:每个 GPI/O 端口有两 个 32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个 32 位数据寄 存器(GPIOx_IDR,GPIOx_ODR),一个 32 位置位/复位寄存器 (GPIOx_BSRR),一个 16 位复位寄存器(GPIOx_BRR)和一个 32 位 锁定寄存器(GPIOx_LCKR)。

stm32重映射功能原理

stm32重映射功能原理

stm32重映射功能原理
重映射功能是指将STM32微控制器的某些外设引脚映射到不同的管脚上的一
种功能。

这在一些特定的应用场景下非常有用,比如当某个外设占用了我们需要使用的管脚时,我们可以通过重映射功能将其映射到其他可用的管脚上,以满足需求。

STM32系列微控制器通常具有多个外设模块,如UART、SPI、I2C等,这些
模块通常需要与外部设备进行通信,并使用管脚来进行数据传输。

每个模块都有一组默认的管脚映射,但有时这些默认的管脚可能与其他模块或外设冲突。

在这种情况下,我们可以通过重映射功能来解决冲突问题。

重映射功能通过修改特定的寄存器来实现。

一般来说,STM32系列微控制器
的引脚可以具有多个功能,如GPIO、复用功能等。

重映射功能实质上是将某个外
设引脚映射到对应的复用功能上。

通过设置相应的寄存器,我们可以将某个外设引脚映射到我们选择的管脚上,以满足硬件连接的需求。

需要注意的是,重映射功能并不适用于所有的管脚和外设。

只有特定的管脚和
外设组合才支持重映射。

因此,在使用重映射功能之前,我们需要查看芯片手册,了解哪些管脚和外设是可供重映射的。

另外,重映射功能还可能涉及到其他相关设置,如使能某个外设、配置引脚的模式等。

总的来说,重映射功能是STM32微控制器提供的一种灵活的功能,它可以帮
助我们解决管脚资源冲突的问题,提高硬件系统的灵活性和可扩展性。

通过合理使用重映射功能,我们可以更好地进行外设配置,满足不同应用场景下的需求。

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微控制器中,复用功能通过寄存器配置来实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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对应的输出寄存器将不影响引脚上的信号。

从图中还可以看出,普通的GPIO端口输入功能与复用的输入功能的配置方式没有分别,这意味着在使用引脚的复用输入功能时,可以在这个引脚的输入寄存器上读出引脚上的信号。

例如在使能了USART3模块时,可以读GPIOB_IDR 寄存器,得到PB11信号线上的当前状态。

有不少引脚上配备了来自多个模块的复用功能引出脚,例如本文第一张图中显示的PB10,默认复用功能就有I2C2_SCL和USART3_TX两个功能,TIM2重映射后,TIM2_CH3也使用PB10的复用功能。

在使用引脚的复用功能时,需要注意在软件上只可以使能一个外设模块,否则在引出脚上可能产生信号冲突。

例如,如果使能了USART3模块,同时没有对USART3进行重映射配置,则不可以使能I2C2模块;同理如果需要使用I2C2模块,则不能使能USART3模块。

但是如果配置了USART3的引脚重映射,USART3的TX和RX信号将从PC10和PC11,或PD8和PD9引出,避开了I2C2使用的PB10和PB11,这时就可以同时使用I2C2模块和USART3模块了。

USART3模块共有5个信号,分别为TX、RX、CK、CTS和RTS,从上面给出的第二张图中可以看出,重映射是对所有信号同时有效。

这5个信号中,在使能了USART3模块后,只有TX和RX是始终与对应的引出脚相连,而其它3个信号分别有独立的控制位,控制它们是否与外部引脚相连,如果程序中不使用某个信号的功能,则可以关闭这个信号的功能,对应的引脚可以做为其它功能的引出脚。

例如,当关闭了USART3的CK、CTS和RTS 功能并且没有重映射USART3时,PB12、PB13和PB14可以作为通用输入输出端口使用,也可以作为其它模块的复用功能引出脚。

下面这张图是一个内部控制连接的等效示意图,它并不表示真正的内部连接,但可以有效地帮助理解重映射和复用引脚的概念。

图中右边引出的信号,分别连接到了本文第三张图的输入输出模块。

相关文档
最新文档