STM32引脚复用与重映射(HAL库)

发布时间 2023-04-14 10:46:32作者: dreamerYang

根据我最近做的实验,我举出下面例子

例:部分重映射,我用来把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个功能 一个是默认的 一个是复用 一个是重映射功能(这个其实也属于复用)

  1. 默认就是直接用GPIO时钟使能__HAL_RCC_GPIOB_CLK_ENABLE();端口模式配置也就是GPIO_Init()函数的配置。
  2. 复用:在默认的基础上开启复用外设时钟__HAL_RCC_TIM3_CLK_ENABLE();并配置外设参数。
  3. 重映射:在复用的基础上开启AFIO的时钟__HAL_RCC_AFIO_CLK_ENABLE();进行重映射的配置__HAL_AFIO_REMAP_TIM3_PARTIAL()。