STM32F030如何正确配置IO口的复用功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F030如何正确配置IO口的复用功能相关的知识,希望对你有一定的参考价值。


  本文所使用的单片机型号为STM32F030C8T6.

  在030系列的单片机中,PA2引脚除了作为普通的IO引脚用作输入输出功能以外,还可以作为内部外设串口1,串口2,定时器15通道1这三个外设的功能引脚.那么如何配置这个IO口用作哪一种外设的功能引脚呢?查找STM32F030数据手册的31-32页,看到有这么两个表格,
  <Table 12. Alternate functions selected through GPIOA_AFR registers for port A>
  <Table 13. Alternate functions selected through GPIOB_AFR registers for port B>.
  这两个表格详细说明了,如何在IO口和外设之间做一一映射.

例如,想要配置PA2为TIM15_CH1功能,则配置复用功能的模式为AF0,可以调用库函数实现:

  //进行IO映射,PA2映射到TIM15_CH1
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_0); //PA2-->TIM15_CH1

  这里我们对该库函数进行一下说明,追踪其定义,该函数的原型可以不必理会,只需要看函数传递的参数即可.
  void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
  第一个参数GPIOx: 也就是我们需要进行映射的GPIO端口,既然我们是要对PA2进行映射,那这个参数当然是传递GPIOA啦.
  第二个参数GPIO_PinSource: 也就是我们要传递的GPIO具体的哪一个引脚,既然是对PA2进行映射,那就使用GPIO_PinSource2啦,注意这里不要使用GPIO_Pin_2,因为GPIO_PinSource2和GPIO_Pin_2是完全不一样的.
  第三个参数GPIO_AF: 也就是表格中的映射关系,或者说是映射模式,查看表格,可以看到应该是使能AF0模式,那就传入GPIO_AF_0啦
/**
* @param GPIOx: where x can be (A or B) to select the GPIO peripheral.
* @param GPIO_PinSource: specifies the pin for the Alternate function.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
* @param GPIO_AF: selects the pin to used as Alternate function.
* This parameter can be one of the following value:
* @arg GPIO_AF_0: WKUP, EVENTOUT, TIM15, SPI1, TIM17,MCO, SWDAT, SWCLK, TIM14,
* BOOT,USART1, CEC, IR_OUT, SPI2
* @arg GPIO_AF_1: USART2, CEC, Tim3, USART1, USART2,EVENTOUT, I2C1, I2C2, TIM15
* @arg GPIO_AF_2: TIM2, TIM1, EVENTOUT, TIM16, TIM17
* @arg GPIO_AF_3: TS, I2C1, TIM15, EVENTOUT
* @arg GPIO_AF_4: TIM14
* @arg GPIO_AF_5: TIM16, TIM17
* @arg GPIO_AF_6: EVENTOUT
* @arg GPIO_AF_7: COMP1 OUT, COMP2 OUT
* @note The pin should already been configured in Alternate Function mode(AF)
* using GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
*/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
  uint32_t temp = 0x00;
  uint32_t temp_2 = 0x00;

  /* Check the parameters */
  assert_param(IS_GPIO_LIST_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  assert_param(IS_GPIO_AF(GPIO_AF));

  temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4));
  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4));
  temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
}

  若是想要配置PA2为USART2_TX功能呢,查看映射表格发现有点奇怪,PA2的AF1映射模式对应着两个外设功能引脚,分别是USART1_TX和USART2_TX,那加入我们将PA2配置成AF1映射模式了,那这个IO口到底是映射到了USART1_TX还是USART2_TX呢?这确实是一个疑惑,不过这怎么能难倒聪明的程序员先生呢?我们发现表格中有两个上标USART1_TX(1),USART2_TX(2)追踪上标的意义,可以看到:
  1. This feature is available on STM32F030x6 and STM32F030x4 devices only.
  2. This feature is available on STM32F030x8 devices only.
  原来在STM32F030C8T6这款单片机中,PA2引脚只能够映射为USART2_TX功能,因为USART1_TX与PA2的映射只存在与STM32F030x6和STM32F030x4系列的单片机中.那就可以很容易的可以得出映射函数的参数了:
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); //PA2--USART2_TX

以上,经供参考.

以上是关于STM32F030如何正确配置IO口的复用功能的主要内容,如果未能解决你的问题,请参考以下文章

开源硬件STM32F030R8T6系统板

刚看到stm32f030的消息,stm8s还有意义吗

STM32的IO口的8种配置

STM32F030 IO口外部中断应用

STM32F030 和 BOOT0 引脚

STM32F4 HAL库开发 -- GPIO