建设银行管方网站,网站如何做付费,找人做网站需要交接什么,个人网站搭建步骤系列文章目录
STM32之GPIO#xff08;General Purpose Input/Output#xff0c;通用型输入输出#xff09; 文章目录 系列文章目录前言一、LED和蜂鸣器简介1.1 LED1.2 蜂鸣器1.3 面包板 二、LED硬件电路2.1 低电平驱动电路2.2 高电平驱动电路 三、蜂鸣器硬件电路3.1 PNP型三…系列文章目录
STM32之GPIOGeneral Purpose Input/Output通用型输入输出 文章目录 系列文章目录前言一、LED和蜂鸣器简介1.1 LED1.2 蜂鸣器1.3 面包板 二、LED硬件电路2.1 低电平驱动电路2.2 高电平驱动电路 三、蜂鸣器硬件电路3.1 PNP型三极管驱动电路3.2 NPN型三极管驱动电路 四、GPIO输出控制案例4.1 LED闪烁4.1.1 电路接线图4.1.2 应用案例代码4.1.3 应用案例分析 4.2 LED流水灯4.2.1 电路接线图4.2.2 应用案例代码4.2.3 应用案例分析 4.3 蜂鸣器4.3.1 电路接线图4.3.2 应用案例代码4.3.3 应用案例分析 前言
提示本文主要用作在学习江协科大STM32入门教程后做的归纳总结笔记旨在学习记录如有侵权请联系作者
本文主要探讨stm32的GPIO输出控制模式最后通过几个简单的应用案例LED闪烁、LED流水灯以及蜂鸣器实现了GPIO的输出控制功能。 一、LED和蜂鸣器简介
1.1 LED
LED是一种发光二极管它正向通电点亮反向通电不亮 。LED电路符号如下左边是正级右边是负极。
如下为LED的实物图LED内部较小的是正极较大的是负极。 1.2 蜂鸣器
蜂鸣器分有源蜂鸣器、无源蜂鸣器两种。
有源蜂鸣器 内部自带振荡源将正负极接上直流电压即可持续发声频率固定。 无源蜂鸣器 内部不带振荡源需要控制器提供振荡脉冲才可发声调整提供振荡脉冲的频率可发出不同频率的声音。 如上左图所示就是有源蜂鸣器的内部电路图这里用了一个PNP型的三极管开关电路进行驱动将VCC和GND分别接上正负极的供电。如果引脚2接低电平蜂鸣器就会响。反之接高电平蜂鸣器就关闭。
1.3 面包板
简单讲一下面包板如下所示分别为面包板的正反面以及内部金属爪的示例图。
面包板正面如下 面包板背面如下 金属爪示意图如下 对于面包板我们只需要知道上面两排以及下面两排打横是连通的中间竖着的是连通的即可。至于内部就是上面看到的金属爪了当我们插入一个电子元器件的时候就会夹住从而接入电路了。
二、LED硬件电路
使用stm32的GPIO口驱动LED电路有两种方式分别是低电平驱动以及高电平驱动。
这里的限流电阻一般都是要接的一方面它可以防止LED因为电流过大而烧毁另一方面它可以调整LED的亮度如果你觉得LED太亮可以适当的增大限流电阻的阻值。
要选择哪一种电平驱动方式就得看IO口高低电平的驱动能力如何了。在前面GPIO的章节里有讲到在GPIO的推挽输出模式下高低电平均有较强的驱动能力所以两种方式都可以。在单片机的电路里一般倾向使用低电平驱动的方式。
2.1 低电平驱动电路 上图所示为低电平驱动电路结构图LED正极接3.3v负极通过一个限流电阻接到PA0上。当PA0输出低电平时LED两端就会产生电压差就会形成正向导通的电流这样LED就会点亮。当PA0输出高电平时因为LED两端都是3.3v的电压不会形成电流所以高电平LED就会熄灭。这就是低电平驱动电路啦。
2.2 高电平驱动电路 上图所示为高电平驱动电路结构图LED负极接到GND正极通过一个限流电阻接到PA0上。当PA0输出高电平时LED两端就会产生电压差就会形成正向导通的电流这样LED就会点亮。当PA0输出低电平时因为LED两端都是GND不会形成电流所以低电平LED就会熄灭。这就是高电平驱动电路啦。
三、蜂鸣器硬件电路
这里使用了三极管开关的驱动方案。三极管开关是最简单的驱动电路了对于功率稍微大一点的 直接用IO口驱动会导致STM32负担过重这时可以用一个三极管驱动电路来完成驱动任务。
需要注意的是PNP型的三极管最好接在上边NPN型的三极管最好接到下边这是因为三极管的通断是需要在发射极和基极产生一定的开启电压的如果将负载接在发射极这边可能会导致三极管不能开启。
3.1 PNP型三极管驱动电路 上图所示为PNP型三极管的驱动电路三极管的左边是基极(b)带箭头的是发射极(e)剩下的是集电极c。当基极(b)给低电平时三极管就会导通再通过3.3V和GND就可以给蜂鸣器提供驱动电流了。当基极(b)给高电平时三极管截止蜂鸣器没有电流。
3.2 NPN型三极管驱动电路 上图所示为NPN型三极管的驱动电路同样左边是基极(b)带箭头的是发射极(b)剩下的是集电极c。它的驱动逻辑和上面的是相反的当基极(b)给高电平时三极管导通。当基极(b)给低电平时三极管断开。
有关三极管的NPN型与PNP型的更加详细介绍可以参考一下我的另一篇文章三极管NPN型、PNP型工作原理
四、GPIO输出控制案例
4.1 LED闪烁
本案例实现了一个通过控制GPIO的PA0引脚输出高低电平实现LED闪烁的功能。
4.1.1 电路接线图 4.1.2 应用案例代码
延时头文件Delay.h
#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif
延时实现文件Delay.c
#include stm32f10x.h/*** brief 微秒级延时* param xus 延时时长范围0~233015* retval 无*/
void Delay_us(uint32_t xus)
{SysTick-LOAD 72 * xus; //设置定时器重装值SysTick-VAL 0x00; //清空当前计数值SysTick-CTRL 0x00000005; //设置时钟源为HCLK启动定时器while(!(SysTick-CTRL 0x00010000)); //等待计数到0SysTick-CTRL 0x00000004; //关闭定时器
}/*** brief 毫秒级延时* param xms 延时时长范围0~4294967295* retval 无*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** brief 秒级延时* param xs 延时时长范围0~4294967295* retval 无*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
} 主程序文件main.c
#include stm32f10x.h // Device header
#include Delay.hint 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);}
}4.1.3 应用案例分析
以上代码实现了通过GPIOA的PA0引脚控制一个LED灯闪烁的功能。主要使用了STM32标准外设库函数来配置GPIO端口以下是对代码的详细分析
1. 配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 使能GPIOA端口的时钟。在STM32中任何外设在使用前都需要先使能其时钟。
2. GPIO初始化
定义了一个GPIO_InitTypeDef结构体变量GPIO_InitStructure并通过它来配置GPIOA的PA0引脚。GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; 设置PA0为推挽输出模式。GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; 指定配置的是GPIOA的PA0引脚。GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; 设置GPIO的输出速度为50MHz尽管这个速度对于简单的LED闪烁来说可能过高但它不会影响LED的功能。GPIO_Init(GPIOA, GPIO_InitStructure); 将上述配置应用到GPIOA上。
3. LED闪烁循环
程序进入一个无限循环通过改变PA0引脚的状态来控制LED的亮灭。GPIO_ResetBits(GPIOA, GPIO_Pin_0); 和 GPIO_SetBits(GPIOA, GPIO_Pin_0); 分别用于将PA0引脚置为低电平LED熄灭和高电平LED点亮。GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); 和 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); 是另一种写入单个GPIO引脚的方法效果与上面的函数相同。GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); 和 GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); 使用了枚举类型BitAction来指定引脚状态这里(BitAction)0和(BitAction)1分别对应Bit_RESET和Bit_SET。Delay_ms(500);每次状态改变后程序都会暂停500毫秒以实现闪烁效果。
总结 这段代码通过配置GPIOA的PA0引脚为推挽输出模式并在一个无限循环中交替地将其置为高电平和低电平从而控制连接在该引脚上的LED灯闪烁。同时代码中展示了两种设置GPIO引脚状态的方法。
4.2 LED流水灯
本案例实现了一个简单的LED流水灯功能。
4.2.1 电路接线图 4.2.2 应用案例代码
主程序文件main.c
#include stm32f10x.h // Device header
#include Delay.hint 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 0001Delay_ms(100);GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000Delay_ms(100);}
}延迟函数的实现以及头文件已经在上面的案例中贴过了这里就不再累述了。
4.2.3 应用案例分析
该代码前面部分跟上一个LED闪烁的案例基本一致其实操作GPIO的套路都是差不多的。首先是使能GPIO外设时钟然后再初始化进行GPIO端口属性设置最后就是对GPIO的某个端口进行读写设置。这里就不再累述了。
具体步骤如下
使能GPIOA时钟确保GPIOA引脚可以被配置和操作。配置GPIOA所有引脚为推挽输出模式。主循环中依次设置GPIOA不同引脚的状态并通过延时函数实现LED的流水效果。
总结 这段代码实现了一个简单的LED流水灯效果通过不断变化GPIOA引脚的状态依次点亮连接在GPIOA的不同引脚上的LED并通过延时函数控制LED点亮的时间间隔。
4.3 蜂鸣器
本案例实现了一个蜂鸣器按照一定的频率进行工作的功能。
4.3.1 电路接线图 4.3.2 应用案例代码
主程序文件main.c
#include stm32f10x.h // Device header
#include Delay.hint 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);}
}延迟函数的实现以及头文件已经在上面的案例中贴过了这里就不再累述了。
4.3.3 应用案例分析
本案例的实现代码基本思路是跟第一个案例是一致的只不过是把控制LED变成了控制蜂鸣器的I/O这里就不再累述了。