以stm32的USART1來舉例
默認使用的是PA9為TX,PA10為RX,當需要開啟復用功能時,需要注意修改以下幾個地方的代碼
1 時鐘的開啟
當使用復用功能后,就需要開啟復用時鐘RCC_APB2Periph_AFIO
2 初始化引腳的不同,原來的是PA9,PA10,但是現(xiàn)在要初始化PB6,PB7,這一部分就不貼代碼了。
3 調用GPIO_PinRemapConfig()函數(shù)
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
USART1的重映射開啟
注意:GPIO_PinRemapConfig()函數(shù)的參數(shù)是不能隨便寫的,在《stm32固件庫使用手冊》里面給出了可用參數(shù)的列表
GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE); //USART3的復用功能完全重映射
GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); //USART3的部分重映射
部分重映射和完全重映射有什么區(qū)別那?在網上我也沒找到確定的答案,但是建議開啟完全重映射,因為網上有資料說部分重映射在發(fā)送消息時候不正常(我自己沒有做實驗)
還需要注意,在開啟重映射功能之前一定要先查看一下自己的單片機是否支持重映射功能。
附:初始化串口的程序
voidUSART1_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
/*configUSART1clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
/*USART1GPIOconfig*/
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);
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
//GPIO_AFIODeInit();
/*USART1modeconfig*/
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}