STM32F03C8T6-GPIO输出

 一 、GPIO原理和stm32f103c8t6引脚

 带FT表示可以容忍5V电压

 

内核通过APB2对寄存器进行读写来驱动引脚进行输入输出。

1、原理图基本结构

 1、上面是输入部分,下面是输出部分,左边是寄存器,右边是具体引脚。

 2、两个二极管用于保护内部电路,若电压大于VDD3.3V,走1,电压小Vss 0V走2

3、输入电路中有上拉电阻和下拉电阻,可通过程序配置开关,对应上拉输入和下拉输入。上拉输入表示引脚没有输入时默认使用Vdd输入,下拉输入表示引脚没有输入时默认使用Vss输入。上下拉电阻比较大,为若上拉和下拉,防止影响正常的输入操作。

两个都断开就是浮空输入模式,比较容易受干扰。

4、然后输入进入一个施密特触发器

 

然后通过输入数据寄存器就可以知道当前引脚输入电平了。

5、另外输入可以进入模拟输入(ADC采集,所以在施密特触发器前)和复用功能输入(用于连接其他需要输入的外设上,例如串口SPI等,需要使用复用功能,因为为数字量,所以在施密特触发器后)

 6、输出部分由片上外设或者寄存器控制,输出到输出控制部分

7、输出控制通过P-MOS或者N-MOSs输出,可通过寄存器控制使用P-N-MOS开关,当PMOS关闭,VDD输出,NMOS关闭,VSS输出,这种输出有较强的驱动能力,若P-N-MOS都使用,则为推挽输出模式,又叫强推输出模式。开漏模式为N-Mos关闭,P-MOS无效,STM32引脚只控制低电平输出。

开漏模式可以作为通信协议的驱动方式, 比如I2C通信协议,使用开漏模式方式多机相互干扰。

开漏模式也可以用于输出5V的电平信号,需要外接上拉电阻,这样外部上拉生效,内部N-MOS 的Vss低电平有效。

引脚为输入模式使,两个MOS都无效。

 复用输出模式表示:使用片上外设控制引脚的输出

 在输出模式下输入有效,输入模式下输出无效。可以在输出时检测自己的输出

 文档中的参考电路:

8、不同功能时引脚模式设置

 9、GPIO寄存器配置

 

2、点灯和蜂鸣器驱动

LED一般长脚是正极,断脚是负极(LED内部较小的是正极)

有源蜂鸣器上电就响,如电路,2引脚高电平响低电平停。

1、三极管驱动蜂鸣器电路和LED驱动电路

功率稍大的负载,单片机直接驱动会有较大的负担,可使用三极管驱动,上图上面是PNP三极管驱动,下面是NPN三极管驱动。

PNP:左边是基极,带箭头的是发射极,下面是集电极,左边给低电平,三极管导通,可以驱动蜂鸣器。

NPN:和PNP相反,但是也需要基极和集电极导通,这样使得集电极和发射极导通电流驱动。 

 2、接电路和程序撰写

1、电灯

灯的负极接A0使用低电平驱动,正极接VCC3+,使用STLINK给STM32供电,STLINK的使用和配置见其他文章,已发布。

#include "stdio.h"
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开APB2的GPIOA时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	while(1){
		Delay_s(1);
		GPIO_SetBits(GPIOA,GPIO_Pin_0);//灭
		Delay_s(1);
		GPIO_ResetBits(GPIOA,GPIO_Pin_0);//亮
		Delay_s(1);
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,1);//灭
		Delay_s(1);
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,0);//亮
		Delay_s(1);
		GPIO_Write(GPIOA,0x0001);//灭  写入16bit引脚
		Delay_s(1);
		GPIO_Write(GPIOA,0x0000);//亮
	}
	return 0;
}
2、控制有源蜂鸣器

正负极接正负极

#include "stdio.h"
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开APB2的GPIOB时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	while(1){
		//buzzer
		Delay_s(1);
		GPIO_WriteBit(GPIOB,GPIO_Pin_12,1);//响
		Delay_s(1);
		GPIO_WriteBit(GPIOB,GPIO_Pin_12,0);//停
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值