根据我最近做的实验,我举出下面例子
例:部分重映射,我用来把TIM3_CH2重映射到PB5上
Pin name |
Type |
Main |
Default |
Remap |
PB5 |
I/O |
PB5 |
I2C1_SMBA/SPI3_MOSI/I2S3_SD |
TIM3_CH2/S PI1_MOSI |
1 GPIO_InitTypeDef gpio_init_struct; /* IO引脚句柄 */ 2 __HAL_RCC_GPIOB_CLK_ENABLE(); /* 开启GPIOB时钟 */ 3 __HAL_RCC_TIM3_CLK_ENABLE(); /* 开启计时器3时钟 */ 4 5 gpio_init_struct.Pin = GPIO_PIN_5; /* CPIO口 */ 6 gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */ 7 gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */ 8 gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */ 9 HAL_GPIO_Init(GPIOB, &gpio_init_struct); 10 __HAL_RCC_AFIO_CLK_ENABLE(); /* 开启AFIO的时钟 */ 11 __HAL_AFIO_REMAP_TIM3_PARTIAL(); /* IO口重映射设置 */
下面是我从头文件stm32f1xx_hal_gpio_ex.h里摘抄的片段:
1 /** 2 * @brief Enable the remapping of TIM3 alternate function channels 1 to 4 3 * @note ENABLE: Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) 4 * @note TIM3_ETR on PE0 is not re-mapped. 5 * @retval None 6 */ 7 #define __HAL_AFIO_REMAP_TIM3_ENABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_FULLREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP) 8 9 /** 10 * @brief Enable the remapping of TIM3 alternate function channels 1 to 4 11 * @note PARTIAL: Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) 12 * @note TIM3_ETR on PE0 is not re-mapped. 13 * @retval None 14 */ 15 #define __HAL_AFIO_REMAP_TIM3_PARTIAL() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_PARTIALREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP) 16 17 /** 18 * @brief Disable the remapping of TIM3 alternate function channels 1 to 4 19 * @note DISABLE: No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) 20 * @note TIM3_ETR on PE0 is not re-mapped. 21 * @retval None 22 */ 23 #define __HAL_AFIO_REMAP_TIM3_DISABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_NOREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP) 24 25 /******************************************************************************************************************************* 26 ************************************************************************************************************************/ 27 //全映射 28 #define AFIO_REMAP_ENABLE(REMAP_PIN) do{ uint32_t tmpreg = AFIO->MAPR; \ 29 tmpreg |= AFIO_MAPR_SWJ_CFG; \ 30 tmpreg |= REMAP_PIN; \ 31 AFIO->MAPR = tmpreg; \ 32 }while(0u) 33 //不开启映射,也就是默认引脚配置 34 #define AFIO_REMAP_DISABLE(REMAP_PIN) do{ uint32_t tmpreg = AFIO->MAPR; \ 35 tmpreg |= AFIO_MAPR_SWJ_CFG; \ 36 tmpreg &= ~REMAP_PIN; \ 37 AFIO->MAPR = tmpreg; \ 38 }while(0u) 39 //部分映射 40 #define AFIO_REMAP_PARTIAL(REMAP_PIN, REMAP_PIN_MASK) do{ uint32_t tmpreg = AFIO->MAPR; \ 41 tmpreg &= ~REMAP_PIN_MASK; \ 42 tmpreg |= AFIO_MAPR_SWJ_CFG; \ 43 tmpreg |= REMAP_PIN; \ 44 AFIO->MAPR = tmpreg; \ 45 }while(0u)
简单的说 STM32的 io 有3个功能 一个是默认的 一个是复用 一个是重映射功能(这个其实也属于复用)
- 默认就是直接用GPIO时钟使能__HAL_RCC_GPIOB_CLK_ENABLE();端口模式配置也就是GPIO_Init()函数的配置。
- 复用:在默认的基础上开启复用外设时钟__HAL_RCC_TIM3_CLK_ENABLE();并配置外设参数。
- 重映射:在复用的基础上开启AFIO的时钟__HAL_RCC_AFIO_CLK_ENABLE();进行重映射的配置__HAL_AFIO_REMAP_TIM3_PARTIAL()。