1. 程式人生 > >STM32F030如何正確配置IO口的復用功能

STM32F030如何正確配置IO口的復用功能

追蹤 ini its 映射模式 輸入 parameter eve com typedef


  本文所使用的單片機型號為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口的復用功能