title: 3-1 LED输出
tags:
- STM32
categories: - STM32学习
示意图
注意:keilkill.bat程序可以删掉中间文件,这样体积就可以大大减小
回顾操作顺序:
- 使用RCC开启GPIO的时钟
- 使用GPIO_Init初始化GPIO
- 使用输出或者输入的函数控制GPIO
RCC的常用函数
GPIO_DeInit
初始化GPIO,调用这个函数所指定的GPIO外设会被复位
GPIO_AFIODeInit
可以复位AFIO外设
GPIO_Init
用结构体的参数来初始化GPIO口,需要先定义一个结构体变量,再给结构体赋值,最后再调用这个函数,这个函数就会自动读取结构体的值,然后自动把外设的各个参数配置好
GPIO_StructInit
可以把结构体变量赋一个默认值
接下来是GPIO的读取函数
然后是GPIO的写入函数
#include "stm32f10x.h" // Device header
#include "Delay.h" //delay函数直接拿来用就行,不需要问为什么
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //RCC使能
GPIO_InitTypeDef GPIO_InitStructure; //GPIO的结构体初始化
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初始化
while (1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //分别是3种不同的输入方式
Delay_ms(500); //注意这里是Bits,说明这个函数的参数可以是PIN的各种组合
GPIO_SetBits(GPIOA, GPIO_Pin_0); //这种是通过向GPIOA一整排set和reset来控制
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //这个是通过向具体的GPIOA中的A0写数据来控制
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //其中的BitAction是在库函数中的声明,是枚举类型,强制类型转化便可以正常输出
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
Delay_ms(500);
}
}
GPIO的8种输入模式
AIN(Analog IN):模拟输入
IN_FLOATING:浮空输入
IPD(In Pull Down)是下拉输入
IPU(In Pull Up)是上拉输入
Out_OD:开漏输出
开漏输出的高电平相当于高阻态,没有输出能力,低电平有驱动能力
Out_OO:推挽输出
高低电平均有驱动能力,所以一般的输出用推挽输出就可以了,但有一个问题是输出口不能串联
AF_OD(Atl Open Drain):复用开漏
AF_PP(Atl Push Pull):复用推挽
System文件夹是用来存放系统的资源:比方说Delay函数
LED闪烁
- 接线图
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //此处也是需要开启GPIOA的使能
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //直接使用GPIO_ALL 来开启全部端口
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4| //可以使用或|来进行多位的赋值
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);
}
}
蜂鸣器
注意不要是要使用A15,B3,B4,这三个端口默认是JTAG的调试端口,如果想正常使用还需要外加配置
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //此处也是需要开启GPIOB的使能,蜂鸣器使用的是B12输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //直接使用GPIO_ALL 来开启全部端口
//GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4| //可以使用或|来进行多位的赋值
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //记得要取地址
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //因为这个蜂鸣器是有源蜂鸣器,所以直接输入高电平就可以响
Delay_ms(100);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
Delay_ms(100);
}