2、STM32之GPIO输出

基本结构

这是STM32的I/O口的基本结构。
请添加图片描述
主要分为输入驱动器和输出驱动器。
在这里插入图片描述

每个IO口的内部电路的引脚电平是0v~3.3v,FT标识的IO口是是可以使用5v的。
在这里插入图片描述
如果输入电压>3.3v,从VDD走,保护电路,若电压<0v,从VSS走。起的作用就是一个保护的作用。

如果电压正常
来到上拉电阻和下拉电阻
在这里插入图片描述
上拉电阻和下拉电阻为了给输入一个默认的电平。
如果接上拉电阻就是上拉输出,悬空默认高电平
如果接下拉电阻就是下拉输出,悬空默认低电平
如果都不接就是浮空,电平不确定。

如果输出不接上拉/下拉电阻,电平容易收到干扰。

也就是说,上拉输入为默认高电平输入方式,下拉输入为默认低电平输入模式。

并且阻值较大,是一种弱上拉和弱下拉,目的是尽量不影响正常是输入操作。

在这里插入图片描述
TTL肖特基触发器:对输入电压进行整形,
输入电压大于某一高阈值,就是是高电平,
如果小于某一低阈值,就是低电平。
高阈值和低阈值之间有一段空隙,这样可以有效避免因为信号波动造成的输出抖动现象。

经过触发器整形的波形可以进入输入数据寄存器,再对此进行读取就可以知道输入的电平。

在这里插入图片描述
模拟输入和复用功能输入就是连接到片上外设的一些端口。

然后来看输出部分
在这里插入图片描述
这个mos管是一种电子开关,我们的信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS,在这里可以选择推挽、开漏或关闭三种输出方式。

推挽输出模式下,p-mos和n-mos均有效。
数据寄存器为1时(上管导通,下管断开,输出直接接到VDD)-> 输出高电平。
数据寄存器为0时(上管断开,下管导通,输出直接到VSS)-> 输出低电平。
此模式下,高低电平均有较强的驱动能力,故推挽输出也可以叫强推输出模式,此时STM32对IO口有绝对的控制权,高低电平都由STM32说了算 。

开漏输出模式下,p-mos无效,n-mos在工作。
数据寄存器为1时下管断开,这时输出相当于断开,也就是高阻模式。
数据寄存器为0时,下管导通,输出直接接到VSS,输出低电平。这种模式下只有低电平有驱动能力,高电平没有驱动能力。这个模式可以作为通信协议的驱动方式,比如I2C,在多机通信下,这个模式可以避免各个设备间的互相干扰。可该模式还可用于输出5v的电平信号(连接一个5v的电压(有这么个方法但是我不知道更具体的了)),可兼容5v的设备,这是开漏输出的主要用途。

关闭状态下,当引脚配置为输入模式时,这两个mos管均无效,输出关闭,端口的信号由外部信号来控制。
请添加图片描述

通过对这些寄存器进行配置,端口可配置成8种模式在这里插入图片描述
前三个的区别是上拉电阻和下拉电阻的连接

模拟输出的特征是GPIO无效,引脚直接接入内部ADC,可以说是ADC模数转换器的专属配置。

端口配置寄存器
请添加图片描述
请添加图片描述
关于输出模式的速度,这个是为了低功耗和稳定性。

LED和蜂鸣器

LED:发光二极管,正向通电点亮,反向通电不亮

有源蜂鸣器︰内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
无源蜂鸣器︰内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音
请添加图片描述

点亮LED灯

用的板子是正电原子的mini板
观察开发板原理图
LED0连接PA8,LED1连接PD2
在这里插入图片描述
在这里插入图片描述

主要的过程是
1、配置时钟
2、配置引脚
3、输出电平的设置

LED0进行闪烁

#include "stm32f10x.h"
 void Delay(u32 count)
 {
  u32 i=0;
  for(;i<count;i++);

 }
 int main(void)
 {	
  GPIO_InitTypeDef  GPIO_InitStructure;
 	
	 // 配置时钟,使能IO口时钟,使能PA,PD端口时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);	 
	
	 //初始化IO参数
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出	
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);	//初始化GPIOA.8
  //将GPIOA的8端口设为1	 
  GPIO_SetBits(GPIOA,GPIO_Pin_8);						

  		   
  while(1)
	{
	    GPIO_ResetBits(GPIOA,GPIO_Pin_8);
		Delay(3000000);
		GPIO_SetBits(GPIOA,GPIO_Pin_8);
		Delay(3000000);
	}
 }




LED0和LED1进行交替闪烁。

#include "stm32f10x.h"
 void Delay(u32 count)
 {
  u32 i=0;
  for(;i<count;i++);

 }
 int main(void)
 {	
  GPIO_InitTypeDef  GPIO_InitStructure;
 	
	 // 配置时钟,使能IO口时钟,使能PA,PD端口时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);	 
	
	 //初始化IO参数
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出	
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);	//初始化GPIOA.8
  //将GPIOA的8端口设为1	 
  GPIO_SetBits(GPIOA,GPIO_Pin_8);						

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	    		 
  GPIO_Init(GPIOD, &GPIO_InitStructure);	  				 
  GPIO_SetBits(GPIOD,GPIO_Pin_2); 						   
  while(1)
	{
	  GPIO_ResetBits(GPIOA,GPIO_Pin_8);
	  GPIO_SetBits(GPIOD,GPIO_Pin_2);
		Delay(3000000);
		GPIO_SetBits(GPIOA,GPIO_Pin_8);
	  GPIO_ResetBits(GPIOD,GPIO_Pin_2);
		Delay(3000000);
	}
 }


  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值