STM32串口的部分映射與完全映射
以stm32的USART1來(lái)舉例
默認(rèn)使用的是PA9為T(mén)X,PA10為RX,當(dāng)需要開(kāi)啟復(fù)用功能時(shí),需要注意修改以下幾個(gè)地方的代碼
1 時(shí)鐘的開(kāi)啟
當(dāng)使用復(fù)用功能后,就需要開(kāi)啟復(fù)用時(shí)鐘RCC_APB2Periph_AFIO
2 初始化引腳的不同,原來(lái)的是PA9,PA10,但是現(xiàn)在要初始化PB6,PB7,這一部分就不貼代碼了。
3 調(diào)用GPIO_PinRemapConfig()函數(shù)
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
USART1的重映射開(kāi)啟
注意:GPIO_PinRemapConfig()函數(shù)的參數(shù)是不能隨便寫(xiě)的,在《stm32固件庫(kù)使用手冊(cè)》里面給出了可用參數(shù)的列表
GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE); //USART3的復(fù)用功能完全重映射
GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); //USART3的部分重映射
部分重映射和完全重映射有什么區(qū)別那?在網(wǎng)上我也沒(méi)找到確定的答案,但是建議開(kāi)啟完全重映射,因?yàn)榫W(wǎng)上有資料說(shuō)部分重映射在發(fā)送消息時(shí)候不正常(我自己沒(méi)有做實(shí)驗(yàn))
還需要注意,在開(kāi)啟重映射功能之前一定要先查看一下自己的單片機(jī)是否支持重映射功能。
附:初始化串口的程序
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);
}