stm32操作GPIO
軟件環境:環境搭建https://www.cnblogs.com/bliss-/p/15043021.html
硬件環境:
基於普中定通stm32ZGT6開發板
概述:
GPIO是STM32非常重要的功能,在大多數控制系統中都會使用到GPIO,GPIO【General-purpose input/output】,通用輸入輸出端口,可以用於輸出高低電平,也可以作為輸入采集外部電平。
在我這塊開發板上可以看到控制LED引腳在PF9和PF10引腳上,同時LED二極管的一端為VCC3.3,我們只需要控制另一端將其拉低或者升高就可以控制其亮或者滅。

軟件流程
基本流程比較簡單

- 外設時鍾需要根據具體的IO端口查看手冊中的時鍾樹,也可以看庫函數中的預設參數得知GPIO時鍾都在AHB1時鍾總線上掛着
/**
* @brief Enables or disables the AHB1 peripheral clock.
* @note After reset, the peripheral clock (used for registers read/write access)
* is disabled and the application software has to enable this clock before
* using it.
* @param RCC_AHBPeriph: specifies the AHB1 peripheral to gates its clock.
* This parameter can be any combination of the following values:
* @arg RCC_AHB1Periph_GPIOA: GPIOA clock
* @arg RCC_AHB1Periph_GPIOB: GPIOB clock
* @arg RCC_AHB1Periph_GPIOC: GPIOC clock
* @arg RCC_AHB1Periph_GPIOD: GPIOD clock
* @arg RCC_AHB1Periph_GPIOE: GPIOE clock
* @arg RCC_AHB1Periph_GPIOF: GPIOF clock
* @arg RCC_AHB1Periph_GPIOG: GPIOG clock
* @arg RCC_AHB1Periph_GPIOG: GPIOG clock
* @arg RCC_AHB1Periph_GPIOI: GPIOI clock
* @arg RCC_AHB1Periph_GPIOJ: GPIOJ clock (STM32F42xxx/43xxx devices)
* @arg RCC_AHB1Periph_GPIOK: GPIOK clock (STM32F42xxx/43xxx devices)
* @arg RCC_AHB1Periph_CRC: CRC clock
* @arg RCC_AHB1Periph_BKPSRAM: BKPSRAM interface clock
* @arg RCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clock
* @arg RCC_AHB1Periph_DMA1: DMA1 clock
* @arg RCC_AHB1Periph_DMA2: DMA2 clock
* @arg RCC_AHB1Periph_DMA2D: DMA2D clock (STM32F429xx/439xx devices)
* @arg RCC_AHB1Periph_ETH_MAC: Ethernet MAC clock
* @arg RCC_AHB1Periph_ETH_MAC_Tx: Ethernet Transmission clock
* @arg RCC_AHB1Periph_ETH_MAC_Rx: Ethernet Reception clock
* @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock
* @arg RCC_AHB1Periph_OTG_HS: USB OTG HS clock
* @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock
* @param NewState: new state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->AHB1ENR |= RCC_AHB1Periph;
}
else
{
RCC->AHB1ENR &= ~RCC_AHB1Periph;
}
}
- 我們這里作為GPIO輸出使用,所以我們將GPIO初始化為以下模式
GPIO_InitTypeDef GPIO_LED;
/**GPIOF端口時鍾使能**/
RCC_AHB1PeriphClockCmd(LED_GPIO_CLK,ENABLE);
GPIO_LED.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_LED.GPIO_OType = GPIO_OType_PP; //推挽
GPIO_LED.GPIO_PuPd = GPIO_PuPd_DOWN; //內部上拉
GPIO_LED.GPIO_Speed = GPIO_Low_Speed; //設置為低速率模式
GPIO_LED.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9; //設置引腳9和10
GPIO_Init(GPIOF,&GPIO_LED); //綁定到GPIOF端口並將設置項生效
- 最后可以調用輸出高低電平的庫函數實現控制LED開關
GPIO_ResetBits(GPIO_F,GPIO_Pin_10);
/*拉高引腳 控制LED滅*/
GPIO_SetBits(GPIOF,GPIO_Pin_10);
