【STM32学习笔记-点亮LED灯】

STM32学习笔记-点亮LED灯


文章目录

  • STM32学习笔记-点亮LED灯
  • 一、原理图分析
  • 二、代码分析
    • 1.mian函数
    • 2.led.c函数
    • 3.led.h函数
    • 4.函数文件整理
    • 5.LED_Init(); LED灯初始化函数分析
    • 6.while(1){} 循环函数内容分析
    • 7.结果显示
  • 三、四种方法实现LED的闪烁
    • 1、GPIO_WriteBit()函数
    • 2、GPIO_ReadOutputDataBit()函数
    • 3、GPIO_SetBits()和GPIO_ResetBits()函数
    • 4、GPIO_Write()函数


一、原理图分析

【STM32学习笔记-点亮LED灯】_第1张图片
此图中LED右端接地(GND),左端连接PB0、PB1(见下图),可知该电路输出为高电平时led点亮,低电平时led熄灭

【STM32学习笔记-点亮LED灯】_第2张图片
【STM32学习笔记-点亮LED灯】_第3张图片


二、代码分析

1.mian函数

代码如下(示例):

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"//延时函数
#include "led.h"


int main (void){//主程序
	RCC_Configuration(); //时钟设置(暂时不研究时钟)
	LED_Init();
	while(1){
		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
		delay_us(50000); //延时1秒
		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
		delay_us(50000); //延时1秒
	}
}

2.led.c函数

代码如下(示例):

#include "led.h"

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 = LED1 | LED2; //选择端口号(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(LEDPORT, &GPIO_InitStructure);			
}

3.led.h函数

代码如下(示例):

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"
//#define LED1 PBout(0)// PB0
//#define LED2 PBout(1)// PB1	
#define LEDPORT	GPIOB	//定义IO接口
#define LED1	GPIO_Pin_0	//定义IO接口
#define LED2	GPIO_Pin_1	//定义IO接口
void LED_Init(void);//初始化	 				    
#endif

4.函数文件整理

【STM32学习笔记-点亮LED灯】_第4张图片
CMSIS-User文件均由stm官网提供(查阅固件库安装)

5.LED_Init(); LED灯初始化函数分析

跳转至函数出处
【STM32学习笔记-点亮LED灯】_第5张图片
光标放置在LED_Init();语句行,右键-选择Go Too Definition Of ‘LED_Init’,跳转到led.c函数中

GPIO_InitTypeDef  GPIO_InitStructure; 

led.c函数的第一句如上,通过寻找起源,我们可以看到此函数来自于stm32f10x_gpio.h 函数的一个结构体的定义,如下代码

typedef struct
{
  uint16_t GPIO_Pin; /*需要配置的GPIO引脚,这个参数
  						可以是@ref GPIO_pins_define的任意值*/

  GPIOSpeed_TypeDef GPIO_Speed;  /*指定所选引脚的速度。这个参数
  									可以是@ref GPIOSpeed_TypeDef的值   */

  GPIOMode_TypeDef GPIO_Mode;    /*指定所选引脚的工作模式。这个参数
  									可以是@ref GPIOMode_TypeDef的值   */
}GPIO_InitTypeDef;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); 

led.c函数第二句如上,功能为打开或关闭对应的外设输出时钟端口
【STM32学习笔记-点亮LED灯】_第6张图片
输入参数1:RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
采用了GPIOA时钟或者GPIOB时钟或者GPIOC时钟
输入参数2:ENABLE(使能够启动)
【STM32学习笔记-点亮LED灯】_第7张图片

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

以上三句对应了第一句的结构体定义(定义参数的端口号、工作方式和接口速度)

  1. 接口的端口号:LED1和LED2在led.h函数中进行了宏定义
#define LED1	GPIO_Pin_0	//定义IO接口
#define LED2	GPIO_Pin_1	//定义IO接口

GPIO_Pin0和Pin1也对应了不同的地址,在系统文件stm32f10x_gpio.h中被宏定义

#define GPIO_Pin_0  ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1  ((uint16_t)0x0002)  /*!< Pin 1 selected */

2.工作方式:输入输出的8种模式,这要根据外电路和作用选择(此处选择了推免输出模式:可以输出高,低电平,连接数字器件

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;
GPIO_Init(LEDPORT, &GPIO_InitStructure);

led.c函数的最后一句,改函数详情如下:
【STM32学习笔记-点亮LED灯】_第8张图片
输入参数1:LEDPORT  此处在led.h中被宏定义为GPIOB

#define LEDPORT	GPIOB	//定义IO接口

STM32有5组GPIO引脚,分别是GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,每组GPIO有16个引脚。根据型号不同有着不同的引脚数量,此处采用了B组的16个引脚。
以上LED_Init()函数分析完毕。

6.while(1){} 循环函数内容分析

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));//LED1接口输出高电平1
delay_us(50000); //延时1秒
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(50000); //延时1秒

GPIO_WriteBit()函数使用方法如下:
【STM32学习笔记-点亮LED灯】_第9张图片

输入参数1:LEDPORT(在led.h中宏定义为GPIOB)采用B组接口
输入参数2:LED1(在led.h中宏定义为GPIO_Pin_0)使用B组的0号接口
输入参数3:(BitAction)(1)表示置位,输出为高电平(0表示清零)

7.结果显示

【STM32学习笔记-点亮LED灯】_第10张图片
LED1和LED2交替闪烁

三、四种方法实现LED的闪烁

1、GPIO_WriteBit()函数

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
delay_us(50000); //延时1秒
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(50000); //延时1秒

2、GPIO_ReadOutputDataBit()函数

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //取反LED1
delay_ms(500); //延时1秒

【STM32学习笔记-点亮LED灯】_第11张图片
读取出端口管脚的值后利用“1-”来取它的反值(1-0=1 1-1=0)

3、GPIO_SetBits()和GPIO_ResetBits()函数

GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)
delay_s(1); //延时1秒
GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0)
delay_s(1); //延时1秒

【STM32学习笔记-点亮LED灯】_第12张图片
【STM32学习笔记-点亮LED灯】_第13张图片

4、GPIO_Write()函数

GPIO_Write(LEDPORT,0x0001); //直接数值操作将变量值写入LED
delay_s(2); //延时1秒
GPIO_Write(LEDPORT,0x0000); //直接数值操作将变量值写入LED
delay_s(2); //延时1秒

【STM32学习笔记-点亮LED灯】_第14张图片


以上就是点亮LED灯的代码详解,通过修改闪灯延时时间可以得到不同的效果

你可能感兴趣的:(stm32,学习,arm,单片机)