ARM嵌入式学习笔记(一) 点亮LED灯

本文详细介绍了使用STM32F103单片机通过Keil开发环境实现LED灯点亮的全过程,包括硬件设备连接、软件开发(main函数、GPIO控制及推挽输出)、以及注意事项。
摘要由CSDN通过智能技术生成

ARM嵌入式学习笔记之 点亮LED灯 

1.硬件介绍

硬件设备

单片机实物图

单片机原理图

2.软件介绍

keil开发

main函数介绍

Led.c文件介绍

GPIO

函数介绍

推挽输出

Led.h文件介绍

注意

3.运行效果图

           ​

4.总结


1.硬件介绍

硬件设备

本次嵌入式学习中我使用的是STM32F103RCT6单片机,使用的程序下载器是St-link,以及必备的USB线、排线等等...

单片机实物图

这里是我所使用的单片机实物图

                                       

单片机原理图

如图所示,这里我们使用的LED0和LED1分别连接单片机的PA1和PC13引脚,只要单片机输出低电平,那么LED灯就会发光。

ru

2.软件介绍

keil开发

我采用的是keil uvision5软件进行嵌入式开发,如图为软件打开后的界面。

这里是工程包含的各个文件,User文件夹中包含main.c,Hardware文件夹中包含Led.c和Led.h文件,本文软件介绍主要介绍这三个文件内容。

                                                       

main函数介绍

main函数中包含了LED引脚的初始化,以及LED灯的点亮和熄灭操作,该动作放在while(1)循环中重复执行

int main(void)
{

  LED_Init();//LED初始化

  while (1)//反复循环
  {
		LED_Light(LED0,LED_ON);//点亮LED灯
		LED_Light(LED1,LED_ON);
	}
}

Led.c文件介绍

GPIO

GPIO就是通用输入/输出接口(General-Purpose IO ports),可以配置成输出模式来控制外部设备,也可以配置成输入模式来读取外部信号,是STM32的一种外设,连接芯片外部的引脚,其引脚可以供使用者自由的进行控制。将STM32芯片的GPIO引脚与外部设备连接起来,也可以实现与外部通讯、控制以及数据采集的功能。GPIO最简单的功能是输出高低电平;GPIO还可以被设置为输入功能,用于读取按键的输入信号;也可以将GPIO复用成芯片上的其他外设的控制引脚。

如图为GPIO的内部结构:

函数介绍

Led.c中包含两个函数 LED_Init()和LED_Light(),下面来一一介绍

LED_Init()函数为LED引脚的初始化,先定义了GPIO的结构体变量,然后将引脚的时钟信号使能,再设置相应的引脚为推挽输出,并设置GPIO输出速度为50MHz。

LED_Light()函数包括两个输入变量,第一个是LEDx,代表选中的灯序号,第二个是state,代表选中的灯的亮灭情况。

if语句中为选择点亮的灯,若选中指定的灯,则执行GPIO_SetBits()或GPIO_ResetBits()语句,该语句的作用是将指定的引脚输出高电平或低电平,从而控制LED灯的亮灭。

#include <Led.h>
#include "stm32f10x.h"

void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(LED0_RCC_CLOCK , ENABLE);
  GPIO_InitStructure.GPIO_Pin = LED0_GPIO_PIN ;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  GPIO_Init(LED0_GPIO , &GPIO_InitStructure);
	
  RCC_APB2PeriphClockCmd( LED1_RCC_CLOCK, ENABLE);
  GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN ;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  GPIO_Init(LED1_GPIO , &GPIO_InitStructure);
}

void LED_Light(u8 LEDx, u8 state)
{
	if(state==LED_OFF)
  {
		if(LEDx & LED0)
			GPIO_SetBits(LED0_GPIO,LED0_GPIO_PIN);
		if(LEDx & LED1)
			GPIO_SetBits(LED1_GPIO,LED1_GPIO_PIN);
  }
	else 
	{
		if(LEDx & LED0)
			GPIO_ResetBits(LED0_GPIO,LED0_GPIO_PIN);
		if(LEDx & LED1)
			GPIO_ResetBits(LED1_GPIO,LED1_GPIO_PIN);
	}
}

推挽输出

推挽输出结构是由两个MOS或者三极管收到互补控制的信号控制,两个管子时钟一个在导通,一个在截止,如图所示:

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有较大的驱动能力。

Led.h文件介绍

Led.h头文件中主要是一些变量的宏定义和函数的定义,包括LED0_RCC_CLOCK,LED0_GPIO_PIN ,LED0_GPIO,LED_ON等其他变量的宏定义。使用宏定义的好处是能够让用户更加方便修改参数,只需要修改宏定义的值即可完成IO口的转换。

#ifndef __LED_H__
#define __LED_H__
#include <stm32f10x.h>

#define LED0_RCC_CLOCK            RCC_APB2Periph_GPIOA
#define LED0_GPIO_PIN                 GPIO_Pin_1
#define LED0_GPIO                     GPIOA

#define LED1_RCC_CLOCK            RCC_APB2Periph_GPIOC
#define LED1_GPIO_PIN                 GPIO_Pin_13
#define LED1_GPIO                     GPIOC

#define LED0                          (uint8_t)0x01
#define LED1                          (uint8_t)0x02
#define LED_OFF 0
#define LED_ON 1

void LED_Init(void);
void LED_Light(u8 LEDx, u8 state);

#endif 

注意

在.c文件中撰写的函数都要在.h头文件中进行定义,否则可能发生未知错误,曾经有过教训....

3.运行效果图

从图中我们可以看到单片机上的两个LED灯都点亮了。

           

4.总结

 本次学习顺利完成了Stm32单片机的点灯功能,我个人习惯使用keil软件进行开发,当然大家也可以用其他顺手的软件比如vscode等等。在单片机编程的路上,还有很长的路要走,我还在努力地探索中。如果本文哪里有写得不到位的地方,欢迎大家批评指正!

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值