1. 程式人生 > >stm32f103串列埠實現對映功能

stm32f103串列埠實現對映功能

在實際開發中,經常遇到串列埠的預設輸出IO口被其他模組佔用了,所以我們要用到串列埠IO口對映功能,是指將原來實現功能的IO口對映到其他指定IO口,其他不變。具體操作如下:

先貼出預設下的串列埠初始化設定:

void USART1Conf(u32 baudRate)
{
	USART_InitTypeDef USART_InitSturct;//定義串列埠1的初始化結構體

	GPIO_InitTypeDef GPIO_InitStruct;//定義串列埠對應管腳的結構體

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);//開啟串列埠管腳時鐘
	//USART1_Tx_Pin Configure 
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//輸出引腳
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;//設定最高速度50MHz
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//推輓複用輸出
	GPIO_Init(GPIOA , &GPIO_InitStruct);//將初始化好的結構體裝入暫存器

//USART1_Rx_Pin Configure
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO模式懸浮輸入
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;//輸入引腳
  GPIO_Init(GPIOA, &GPIO_InitStruct);//將初始化好的結構體裝入暫存器

//USART1 Configure	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);//時鐘使能
	USART_InitSturct.USART_BaudRate = baudRate;//波特率19200
	USART_InitSturct.USART_WordLength = USART_WordLength_8b;//資料寬度8位
	USART_InitSturct.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitSturct.USART_Parity = USART_Parity_No;//無奇偶校驗
	USART_InitSturct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitSturct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能傳送與接收
	USART_Init(USART1 , &USART_InitSturct);//將初始化好的結構體裝入暫存器	
	//USART1_INT Configure
	USART_ITConfig(USART1 , USART_IT_RXNE , ENABLE);//使能接收中斷
//	USART_ITConfig(USART1 , USART_IT_TXE , ENABLE);
	USART_Cmd(USART1 , ENABLE);//開啟串列埠
	USART_ClearFlag(USART1 , USART_FLAG_TC);//解決第一個資料傳送失敗的問題
}

下面是對映後的串列埠設定,根據datasheet,重對映設定IO口:Rx: PA9 ---- PB6     Tx: PA10 ------ PB7
void USART1Conf(u32 baudRate)
{
	USART_InitTypeDef USART_InitSturct;//定義串列埠1的初始化結構體

	GPIO_InitTypeDef GPIO_InitStruct;//定義串列埠對應管腳的結構體

	//使用串列埠IO口對映功能 add by LC 2015.07.01 18:03
//重對映設定	 PA9 ---- PB6      PA10 ------ PB7
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能要對映IO模組
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB , ENABLE);//開啟串列埠管腳時鐘
	//USART1_Tx_Pin Configure 
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;//輸出引腳
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;//設定最高速度50MHz
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//推輓複用輸出
	GPIO_Init(GPIOB , &GPIO_InitStruct);//將初始化好的結構體裝入暫存器

//USART1_Rx_Pin Configure
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO模式懸浮輸入
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;//輸入引腳
  GPIO_Init(GPIOB, &GPIO_InitStruct);//將初始化好的結構體裝入暫存器
	
	GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
	//end by LC 2015.07.01 18:03

//USART1 Configure	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);//時鐘使能
	USART_InitSturct.USART_BaudRate = baudRate;//波特率19200
	USART_InitSturct.USART_WordLength = USART_WordLength_8b;//資料寬度8位
	USART_InitSturct.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitSturct.USART_Parity = USART_Parity_No;//無奇偶校驗
	USART_InitSturct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitSturct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能傳送與接收
	USART_Init(USART1 , &USART_InitSturct);//將初始化好的結構體裝入暫存器	
	//USART1_INT Configure
	USART_ITConfig(USART1 , USART_IT_RXNE , ENABLE);//使能接收中斷
//	USART_ITConfig(USART1 , USART_IT_TXE , ENABLE);
	USART_Cmd(USART1 , ENABLE);//開啟串列埠
	USART_ClearFlag(USART1 , USART_FLAG_TC);//解決第一個資料傳送失敗的問題
}