• 【STM32】LED闪烁&LED流水灯&蜂鸣器(江科大)


    在这里插入图片描述
    LED正极:外部长脚、内部较小
    LED负极:外部短脚、内部较大
    在这里插入图片描述
    LED电路
    限流电阻:保护LED,调节LED亮度(本实验用面包板为了方便,省去了限流电阻,设计电路时要加上)
    左上图:低电平驱动 左下图:高电平驱动
    GPIO在推挽输出模式下,高低电平均有较强的驱动能力,在这里两种接法均可,但在单片机的电路里,一般倾向使用第一种接法,因为很多单片机或芯片,都使用了高电平弱驱动,低电平强驱动的规则,可以一定程度上避免高低电平打架,所以如果高电平驱动能力弱,就不能使用第二种接法。
    蜂鸣器电路
    三极管开关是最简单的驱动电路,对于功率稍微大一点的,直接用IO口驱动会导致STM32负担过重,这时就可以用一个三极管驱动电路来完成驱动的任务。
    右上图是PNP三极管的驱动电路,三极管的左边是基极,带箭头的是发射极,剩下的是集电极。基极给低电平三极管就会导通,通过3.3V和GND就可以给蜂鸣器提供驱动电流;基极给高电平三极管截止,蜂鸣器没有电流。
    右下图是NPN三极管的驱动电路,同样三极管的左边是基极,带箭头的是发射极,剩下的是集电极。它的驱动逻辑跟上面的相反,基极给高电平导通,低电平断开。
    注意PNP的三极管最好接在上边,NPN的三极管最好接在下边,这时因为三极管的通断,是需要在发射极和基极直接产生一定的开启电压的,如果把负载(蜂鸣器)接在发射极这边,可能会导致三极管不能开启。
    在这里插入图片描述

    一、LED闪烁

    在这里插入图片描述
    操作STM32的GPIO共需要3个步骤
    1.使用RCC开启GPIO的时钟
    2.使用GPIO_Init函数初始化GPIO
    3.使用输出或者输入的函数控制GPIO口
    在这里总共涉及了RCC和GPIO两个外设
    RCC库函数
    在这里插入图片描述
    Library中找到rcc.h文件,RCC有很多库函数,但大部分用不到,最常用的只有三个函数:RCC AHB外设时钟控制、RCC APB2外设时钟控制、RCC APB1外设时钟控制


    在这里插入图片描述
    右键跳转到函数定义,AHB外设时钟控制的函数就是使能或者失能AHB外设时钟的


    在这里插入图片描述
    下面介绍第一个参数就是选择哪个外设


    在这里插入图片描述
    STM32互联型的设备可以在这个列表选择


    在这里插入图片描述
    其他设备在下面这个列表选择


    在这里插入图片描述

    接着第二个参数就是ENABLE或者DISABLE


    然后下面的APB2外设时钟控制和APB1外设时钟控制都是一样的操作方法,第一个参数选择外设,第二个参数使能或失能
    GPIO库函数
    打开gpio.h的文件
    在这里插入图片描述
    目前需要了解这些函数
    1.GPIO_DeInit,参数可以写GPIOA、GPIOB等等,调用这个函数后,所指定的GPIO外设就会被复位
    2.AFIO_DeInit也是一样,可以复位AFIO外设
    3.GPIO_Init是非常重要的函数,这个函数的作用是,用结构体的参数来初始化GPIO口。需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然后自动把外设的各个参数配置好,这种Init函数在STM32中基本所有的外设都有,一般初始化外设都是使用这个Init函数来完成的
    4.GPIO_StructInit函数可以把结构体变量赋一个默认值
    5.接下来四个是GPIO的读取函数,再下面四个是GPIO的写入函数,这些函数可以实现读写GPIO口的功能
    调用RCC里面的APB2外设时钟控制函数
    在这里插入图片描述
    复制粘贴到main.c,右键跳转到定义
    在这里插入图片描述
    要点亮PA0口的LED,所以选择RCC_APB2外设_GPIOA这一项,放到第一个参数
    在这里插入图片描述
    第二个参数选择ENABLE,放到第二个参数
    在这里插入图片描述
    调用GPIO_Init函数
    第一个参数选择GPIOA;第二个参数是一个结构体,先把结构体类型复制下来
    在这里插入图片描述
    在GPIO_Init上面粘贴,起个名字叫GPIO_InitStructure,这里这个结构体实际上也是一种局部变量
    接着复制结构体名字,用点把结构体的成员都引出来,右键跳转,看一下说明,复制粘贴一下参数
    最后把GPIO初始化结构体的地址放到GPIO_Init的第二个参数,这样初始化就完成了,当GPIO_Init函数执行完,这个GPIOA外设的0号引脚就自动被配置为推挽输出、50MHz的速度,它内部的主要执行逻辑就是读取结构体的参数、执行一堆判断和运算、最后写入到GPIO配置寄存器
    在这里插入图片描述
    在这里插入图片描述

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    
    int main(void)
    {
    	/*开启时钟*/
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
    															//使用各个外设前必须开启时钟,否则对外设的操作无效
    	
    	/*GPIO初始化*/
    	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
    	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
    	
    	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
    															//函数内部会自动根据结构体的参数配置相应寄存器
    															//实现GPIOA的初始化
    	
    	/*主循环,循环体内的代码会一直循环执行*/
    	while (1)
    	{
    		/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
    		
    		/*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
    		GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平
    		Delay_ms(500);										//延时500ms
    		GPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平
    		Delay_ms(500);										//延时500ms
    		
    		/*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
    		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);		//将PA0引脚设置为低电平
    		Delay_ms(500);										//延时500ms
    		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);			//将PA0引脚设置为高电平
    		Delay_ms(500);										//延时500ms
    		
    		/*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
    		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);		//将PA0引脚设置为低电平
    		Delay_ms(500);										//延时500ms
    		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);		//将PA0引脚设置为高电平
    		Delay_ms(500);										//延时500ms
    	}
    }
    
    

    二、LED流水灯

    在这里插入图片描述

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    
    int main(void)
    {
    	/*开启时钟*/
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
    															//使用各个外设前必须开启时钟,否则对外设的操作无效
    	
    	/*GPIO初始化*/
    	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
    	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;				//GPIO引脚,赋值为所有引脚
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
    	
    	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
    															//函数内部会自动根据结构体的参数配置相应寄存器
    															//实现GPIOA的初始化
    	
    	/*主循环,循环体内的代码会一直循环执行*/
    	while (1)
    	{
    		/*使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯*/
    		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
    		Delay_ms(100);				//延时100ms
    		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010,PA1引脚为低电平,其他引脚均为高电平
    		Delay_ms(100);				//延时100ms
    		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平
    		Delay_ms(100);				//延时100ms
    		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平
    		Delay_ms(100);				//延时100ms
    		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平
    		Delay_ms(100);				//延时100ms
    		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000,PA5引脚为低电平,其他引脚均为高电平
    		Delay_ms(100);				//延时100ms
    		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000,PA6引脚为低电平,其他引脚均为高电平
    		Delay_ms(100);				//延时100ms
    		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000,PA7引脚为低电平,其他引脚均为高电平
    		Delay_ms(100);				//延时100ms
    	}
    }
    
    

    三、蜂鸣器

    在这里插入图片描述

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    
    int main(void)
    {
    	/*开启时钟*/
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//开启GPIOB的时钟
    															//使用各个外设前必须开启时钟,否则对外设的操作无效
    	
    	/*GPIO初始化*/
    	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
    	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;				//GPIO引脚,赋值为第12号引脚
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
    	
    	GPIO_Init(GPIOB, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
    															//函数内部会自动根据结构体的参数配置相应寄存器
    															//实现GPIOB的初始化
    	
    	/*主循环,循环体内的代码会一直循环执行*/
    	while (1)
    	{
    		GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为低电平,蜂鸣器鸣叫
    		Delay_ms(100);							//延时100ms
    		GPIO_SetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为高电平,蜂鸣器停止
    		Delay_ms(100);							//延时100ms
    		GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为低电平,蜂鸣器鸣叫
    		Delay_ms(100);							//延时100ms
    		GPIO_SetBits(GPIOB, GPIO_Pin_12);		//将PB12引脚设置为高电平,蜂鸣器停止
    		Delay_ms(700);							//延时700ms
    	}
    }
    
    
  • 相关阅读:
    个人简历管理系统winform
    构建企业分支网络
    原版畅销36万册!世界级网工打造TCP/IP圣经级教材,第5版终现身
    区块链技术:解密去中心化的革命
    【三维目标检测】Part-A2(二)
    Springboot+Easyexcel将数据写入模板文件并导出Excel
    在3分钟内使用AI-Chat生成精美PPT(附AI工具)
    【设计模式】工厂模式
    MySQL介绍
    cocopods上传自动化
  • 原文地址:https://blog.csdn.net/2302_80796399/article/details/139578973