IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 从零开始学STM32(学习笔记——第四天)_LED灯的点亮 -> 正文阅读

[嵌入式]从零开始学STM32(学习笔记——第四天)_LED灯的点亮

※LED灯初始化

一、Led_Init

void LED_Init(void)
{ 
 	//LED灯的接口初始化
	GPIO_InitTypeDef  GPIO_InitStructure; 	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); 
		GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13; //选择端口号(0~15或all)                        
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
		GPIO_Init(GPIOC, &GPIO_InitStructure);		
}

1. GPIO_InitTypeDef GPIO_InitStructure;

/** 
  * @brief  GPIO Init structure definition  
  */

typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;


对结构体使用typedef来定义一个新的数据类型名字GPIO_InitTypeDef,然后使用这个新的数据类型GPIO_InitTypeDef来直接定义结构变量 GPIO_InitStructure;
该结构体的作用 提供单片机引脚,引脚速度(MHz),输入输出模式的选择

(1)GPIOSpeed_TypeDef GPIO_Speed; 输出 最大频率选择

/** 
  * @brief  Output Maximum frequency selection  
  */

typedef enum
{ 
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \
                              ((SPEED) == GPIO_Speed_50MHz))

对枚举使用typedef来定义一个新的数据类型名字GPIOSpeed_TypeDef,然后使用这个新的数据类型GPIOSpeed_TypeDef来直接定义结构变量 GPIO_Speed;

(2)GPIOMode_TypeDef GPIO_Mode; 配置模式枚举

/** 
  * @brief  Configuration Mode enumeration  
  */

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \
                            ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \
                            ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \
                            ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))

对枚举使用typedef来定义一个新的数据类型名字GPIOSpeed_TypeDef,然后使用这个新的数据类型GPIOSpeed_TypeDef来直接定义结构变量 GPIO_Speed;

二、RCC_APB2PeriphClockCmd

关于这个APB2的外设时钟启用或者禁用的函数,本人学习深度有限,不做过多分析,直接上图。但是通过固件库手册可以看出输入参数1是选择不同外设,输入参数2是选择为你选择的外设进行时钟的配置(启用或者禁用)。而且可以通过"|"进行多个外设的选择,然后使能比如初始化函数的第二条函数

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); 

启用或禁用高速 APB (APB2) 外设时钟。
在这里插入图片描述

三、引脚配置

通过GPIO_InitTypeDef GPIO_InitStructure; 这条语句定义了结构体GPIO_InitStructure之后,对该结构体内部的定义 (I/O的选择,IO口的工作方式以及IO口速度) 进行配置

		GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13; //选择端口号(0~15或all)                        
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度

四、GPIO_Init(GPIOC, &GPIO_InitStructure);

最后一条语句:GPIO_Init(GPIOC, &GPIO_InitStructure); 通过固件库手册可以看出,GPIOC作为输入参数1是我们选中的外设,而 输入参数**&GPIO_InitStructure**通过取地址符让传给我们的指针形参。具体函数的实现方式,有大佬可以在评论区进行补充,但是就算不知道函数是如何实现初始化功能的,也不影响我们的使用。
在这里插入图片描述
#※ LED点灯程序(以点亮PC13这个LED为例子)
从STM32F103C8T6的原理图可以看到,LED(D2)已经有3.3V的高电平,为了点亮LED(D2)灯我们应该让PC13给一个低电平。
在这里插入图片描述

※LED的点亮程序

一、方法一:GPIO_WriteBit

该函数可以对每一位引脚的数据进行设置或者清除,对于LED灯来说就是对其控制引脚输入高电平或者低电平。
在这里插入图片描述
那么我们通过

		GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);

就可以把LED点亮了;

二、方法二:GPIO_SetBits&GPIO_ResetBits

通过数据手册可以知道这两个函数是将GPIO_WriteBit的拆分。
GPIO_SetBits只用来设置高电平,且可以控制一个外设的多个引脚。
GPIO_ResetBits只用来清除高电平或者设置低电平,且可以控制一个外设的多个引脚。
在这里插入图片描述
在这里插入图片描述
那么我们通过

GPIO_SetBits(GPIOC,GPIO_Pin_13);

是可以点亮LED灯的;

三、方法三:GPIO_Write

该函数的输入参数1是我们熟悉的GPIO外设的选择。我们知道GPIO是有16个引脚,对应其端口数据寄存器的16位,那么GPIO_Pin_13也就是端口寄存器的第13位,低电平选中的话对应的16进制也就是**~0x2000**
在这里插入图片描述
那么通过

GPIO_Write(GPIOC,~0x2000);

是可以点亮LED灯的;

四、方法四:P_out(n);

**“_”**这里代表我们要操作的那一组外设,"n"代表这个外设的哪一个引脚。

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

那么我们通过

PCout(13) = 0;

也是可以点亮LED的;

五、LED的闪烁

如何实现LED的闪烁呢?这里我们需要延时函数的参与,那么上面4中方法与延时函数的结合很容易就可以把LED闪烁的功能实现。这里介绍一下另个函数也可以实现LED的闪烁功能。
GPIO_ReadOutputDataBit的功能的可以返回引脚的电平高低。
在这里插入图片描述
那么我们通过GPIO_WriteBit函数就可以实现闪烁功能。

		GPIO_WriteBit(GPIOC,GPIO_Pin_13,1-(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_13)));
		delay_ms(500);

这里delay函数大家可以自己百度啦,就不多在赘述。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:31:28  更:2022-10-22 21:34:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 14:06:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码