ARM嵌入式学习笔记之 点亮LED灯
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等等。在单片机编程的路上,还有很长的路要走,我还在努力地探索中。如果本文哪里有写得不到位的地方,欢迎大家批评指正!