江科大stm32一.GPIO输出

本文详细介绍了GPIO的工作原理、基本结构、位结构,包括八种模式,以及如何通过RCC和GPIO_Init函数进行操作,如LED闪烁和蜂鸣器控制。
摘要由CSDN通过智能技术生成
一. GPIO介绍
  • 1.通用输入输出口
  • 2.电平:0~3.3v
  • 3.输出模式:控制端口高低电平-LED,蜂鸣器,串口通信I2C,SPI
  • 4.输入模式:读取端口高低电平-按键输入,外界模块电平信号输入,ADC电压采集
二.GPIO基本结构

三.GPIO位结构

  •  输入模式
  1. 上拉输入:默认高电平
  2. 下拉输入:默认低电平
  3. 浮空输入:输入输出易受干扰,电平不确定
  4. 模拟输入:接入ADC,模拟量
  5. 复用功能输入:接入串口输入引脚
  •  输出部分

推挽输出(N/P都开启)开漏输出(N开启)N/P都关闭
高电平P激活N断开(3.3V)N/P断开,断路由外部电路决定高电平外部电路决定高低电平
低电平N激活P断开N激活
优点内部输出3.3V配合外部电路更灵活
缺点只能输出3.3V不能输出高电平
四.GPIO八种模式

  • 一个端口只能有一个输出,可以有多个输入
 五.操作GPIO

Ⅰ 输出

  1.  用RCC开启GPIO时钟
  2. 使用Init函数初始化GPIO
  3. 使用输出输入函数控制GPIO
  •  RCC函数(APB1~3总线)
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
/**
  * @brief  Enables or disables the High Speed APB (APB2) peripheral clock.
  * @param  RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
  *   This parameter can be any combination of the following values:
  *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11     
  * @param  NewState: new state of the specified peripheral clock.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  •  初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIO_InitTypeDef GPIO_InitStructure;//结构体指针
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//第13口
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率
	GPIO_Init(GPIOC, &GPIO_InitStructure);//调用函数
  •  输出函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//根据第3个参数设置端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//同时对16个端口写入

六.示例. 

  •  LED闪烁
        GPIO_SetBits(GPIOC, GPIO_Pin_13);//0
		Delay_ms(500);
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);//1
		Delay_ms(500);
		GPIO_WriteBit(GPIOC, GPIO_Pin_13,Bit_SET);//0
		Delay_ms(500);
		GPIO_WriteBit(GPIOC, GPIO_Pin_13,Bit_RESET);//1

  • 流水灯 
            GPIO_Write(GPIOA, ~0x0001);//0000 0000 0000 0001
    		Delay_ms(500);
    		GPIO_Write(GPIOA, ~0x0002);//0000 0000 0000 0010
    		Delay_ms(500);
    		GPIO_Write(GPIOA, ~0x0004);//0000 0000 0000 0100
    		Delay_ms(500);
    		GPIO_Write(GPIOA, ~0x0008);//0000 0000 0000 1000
    		Delay_ms(500);
    		GPIO_Write(GPIOA, ~0x0010);//0000 0000 0001 0000
    		Delay_ms(500);
    		GPIO_Write(GPIOA, ~0x0020);//0000 0000 0010 00000
    		Delay_ms(500);
    		GPIO_Write(GPIOA, ~0x0040);//0000 0000 0100 00000
    		Delay_ms(500);
    		GPIO_Write(GPIOA, ~0x0080);//0000 0000 1000 0000
    		Delay_ms(500);

  •  蜂鸣器

 Ⅱ.输入

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输入寄存器某一位
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取输入寄存器所有位
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输出寄存器某一位-一般用于输出模式下
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取输出寄存器所有位

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值