STM32端口復(fù)用與重映射
STM32上有很多I/O口,也有很多的內(nèi)置外設(shè),像I2C,ADC,ISP,USART等,為了節(jié)省引出管腳,這些內(nèi)置外設(shè)基本上是與I/O口共用管腳的,也就是I/O管腳的復(fù)用功能。但是STM32還有一特別之處:很多復(fù)用內(nèi)置的外設(shè)的I/O引腳可以通過(guò)重映射功能,從不同的I/O管腳引出,即復(fù)用功能的引腳是可通過(guò)程序改變的。設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)實(shí)現(xiàn)引腳的重新映射。這時(shí),復(fù)用功能不再映射到它們的原始分配上。使用方法:
簡(jiǎn)單的說(shuō) STM32的 io 有3個(gè)功能一個(gè)是默認(rèn)的,一個(gè)是復(fù)用,一個(gè)是重映射功能(這個(gè)其實(shí)也屬于復(fù)用)。如果配置成復(fù)用,則將使用第2個(gè)功能;同時(shí),相應(yīng)的重映射配置了,則將使用第3個(gè)功能。開(kāi)復(fù)用 + 使能設(shè)備+ 是否重映射就可以決定這個(gè)io口到底使用哪個(gè)功能。以串口為例進(jìn)行說(shuō)明,重映射步驟為:
1、打開(kāi)重映射時(shí)鐘和USART重映射后的I/O口引腳時(shí)鐘,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
2、I/O口重映射開(kāi)啟.
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3、配制重映射引腳, 這里只需配置重映射后的I/O,原來(lái)的不需要去配置.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
只需要這三步,串口就可以正常使用了。
對(duì)于定時(shí)器也是類似步驟。
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //上拉輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時(shí)鐘速度
GPIO_Init(GPIOE, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //時(shí)鐘使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);//完全重映射
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE); //部分重映射