一、GPIO学习
1.总的介绍
所有GPIO都挂在PB2总线上:
2.I/O端口详细电路结构与解释
上拉下拉电阻的作用:
施密特触发器:利用滞回特性对输入的数字信号进行整形
模拟输入:连接到ADC上的
复用功能输入:可以连接到其他需要读取端口的外设上的
输出数据寄存器:只能整体读写数据(32位)
位设置/清除寄存器:可以控制输出寄存器进行某一位的输出,解决了只能整体输出的短板(当然也可以先读出输出寄存器,再用按位与、按位或&= |=的方式对某个位进行修改,然后写入寄存器进行输出)
推挽输出模式:N/PMOS均为有效输出,此时的输出高低电平都具有较强的驱动能力。
开漏模式:只有低电平输出有电流驱动能力。
用于兼容5V信号。
3.GPIO端口的8种模式
(1)输入配置
(2)输出配置
4.几种库函数的使用方法
查找库函数使用手册即可
或者使用帮助文档也可以:(通常固件库都有)
二、项目:LED闪烁、LED流水灯、蜂鸣器
1.LED、蜂鸣器介绍
为什么推荐选择第一种接法:
如果面包板中间的金属条是断开的,则:
2.项目1:LED闪烁工程
硬件连接及其实物图:
了解一下GPIO这几种模式在库函数的显示:
AIN:模拟输入
IN-FLOATING:浮空输入
IPD:下拉输入
IPU:上拉输入
PP是推挽输出
OD是开漏
AF是复用功能端
代码:(注意这里使用的延时函数可以自己设置添加,不用他的头文件,可以参考我另一篇文章stm32配置计数/延时函数_歌者長門的博客-CSDN博客)
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
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);
while (1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
Delay_ms(500);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
Delay_ms(500);
}
}
3.项目2:LED流水灯
硬件连接及:
技巧:使用按位或的方式同时选中多个引脚
介绍一下write函数:可以直接写入16位进入ODR寄存器控制所有引脚的输出
代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
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_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000
Delay_ms(100);
GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000
Delay_ms(100);
}
}
4.项目3:蜂鸣器
硬件连接图:
注意:这三个是调试端口,不要选
代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
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);
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Delay_ms(100);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
Delay_ms(100);
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Delay_ms(100);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
Delay_ms(700);
}
}