STM32 ~ UART 重映射


在進行原理圖設計的時候發現管腳的分配之間有沖突,需要對管腳進行重映射,在手冊中了解到STM32 上有很多I/O口,也有很多的內置外設像:I2C,ADC,ISP,USART等 ,為了節省引出管腳,這些內置外設基本上是與I/O口共用管腳的,也就是I/O管腳的復用功能。但是STM32還有一特別之處就是:很多復用內置的外設的 I/O引腳可以通過重映射功能,從不同的I/O管腳引出,即復用功能的引腳是可通過程序改變的。

第一次這么干感覺心里沒底,所以針對USART1在STM32F103RBT6的板子上實現了一把,以下是相關的測試代碼:

/*****************************************************************************

//函數名:void Uart1_Init(void)

//功能:串口(USART1)重映射初始化配置函數,由TX PA9~PB6    RX PA10~~PB7

*****************************************************************************/

void Uart1_Init(void)

{

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | 
   RCC_APB2Periph_AFIO,ENABLE);//開啟端口B和復用功能時鍾
   GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//使能端口重映射
   GPIO_InitTypeDef GPIO_InitStructure;

   //uart 的GPIO重映射管腳初始化 PB6 usart1_TX PB7 USART_RX

   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);

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
   USART_InitTypeDef USART_InitStructure;
   //串口參數配置:9600,8,1,無奇偶校驗,無硬流量控制 ,使能發送和接收

   USART_InitStructure.USART_BaudRate = 9600;
   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_ITConfig(USART1, USART_IT_RXNE,ENABLE);//串口接收中斷
   USART_Cmd(USART1, ENABLE);
}

  

 

簡要分析重映射驟為:

1.打開重映射時鍾和USART重映射后的I/O口引腳時鍾,

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  |RC C_APB2Periph_AFIO,ENABLE);

2.I/O口重映射開啟. 

GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

3.配制重映射引腳, 這里只需配置重映射后的I/O,原來的不需要去配置.

 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);  

只需要簡單的以上三步就能輕松搞定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM