入门STM32单片机自学笔记(一)

GPIO综述

GPIO(Geneal Purpose Input Output) 通用输入输出口

可配置为8种输入输出模式

引脚电平:0-3.3V    部分引脚可容忍5V

输出模式-控制端口输出高低电平

输入模式-读取端口的高低电平

GPIO基本构造

寄存器是特殊的存储器,内核通过APB2总线对寄存器进行读写,完成输出和读取电平的功能。

寄存器是32位寄存器,低16位对应0-15号端口,高16位不使用。

寄存器引脚输出为1 端口为高电平

寄存器引脚输出为0 端口为低电平

驱动器的作用是增加驱动能力

 GPIO的八种工作模式

1.浮空输入:一种数字输入,可读取引脚电平,若引脚悬空则电平不确定
2.上拉输入:一种数字输入,内部连接上拉电阻,引脚悬空默认为高电平
3.下拉输入:一种数字输入,内部连接下拉电阻,引脚悬空默认为低电平
4.模拟输入:一种模拟输入,GPIO无效,引脚直接链接内部ADC
5.开漏输出:一种数字输出,数据选择器选择输出数据寄存器控制输出,输出高电平为高阻态,低电平为零
6.推挽输出:一种数字输出,数据选择器选择输出数据寄存器控制输出,输出高电平为一,低电平为零
7.复用开漏输出:一种数字输出,数据选择器选择片上外设控制输出,输出高电平为高阻态,低电平为零
8复用推挽输出:一种数字输出,数据选择器选择片上外设控制输出,输出高电平为一,低电平为零

程序点亮一个LED

#include "stm32f10x.h"                  // Device header


int main()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	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);
	
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	//GPIO_SetBits(GPIOA, GPIO_Pin_0);
	//GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); 向GPIOA0口写入低电平 点亮LED
	//GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);   向GPIOA0口写入高电平 熄灭LED
	
	while(1);
}

点亮一个蜂鸣器

#include "stm32f10x.h"                  // Device header

int main()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	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);
	
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);
	while(1);
}

点亮流水灯

int main()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2 |.....;   按位或的方法配置多个引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while(1)
	{
		for(int i = 0;i < 8;i++)
		{
			GPIO_Write(GPIOA, ~(0X0001 << i));    //1111 1111 1111 1110点亮第一个LED 循环右移依次点亮其他LED
			Delay_ms(500);
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值