很多码农写出的第一个程序是"Hello World!",因为这个程序简单容易上手,能给你自信心,让你更加坚定学习编程的信念;单片机也是如此,相信很多单片机老师教给你的第一个程序就是点亮一个LED,今天我们就来分享如何使用STM32F103点亮第一个LED灯。
注:本程序使用单片机为STM32F103VET6
一 单片机的硬件电路连接
由原理图我们可以看到,D2(LED)连接在名称为PE1的IO口,且PE1输出高电平,D2点亮,PE1输出低电平,D2熄灭。
二 程序书写顺序
1 使能PE1所在的时钟总线
2 初始化LED相关函数
3 设置PE1相应的IO口输出函数
可能有同学就要问了,为什么STM32每次写程序前,都要使能相应时钟函数呢?而同为单片机的51单片机就不需要使能,每个IO口可以直接拿过来使用?
这是因为随着电子集成度的提高,功耗和发热问题日渐严重,芯片厂家也非常头疼这个问题,于是就针对STM32这类的单片机开发出了使能功能。
简单的理解:把单片机理解为很多水管的集合,我们要使用A水管,就先把A水龙头打开,就可以在获取A水管的水了。如果,全部的水管都打开,就会造成水资源的浪费。单片机也是这个道理,用哪个就使能哪个功能的IO,只有这样,才会使芯片功耗达到最低。
三 程序代码详解
1 使能GPIO E
因为PE1在GPIO E的端口上,所以要使能GPIO E,在工程树中找到rcc.c文件,打开它找到RCC_APB2PeriphClockCmd函数,并在STM32F1库文件使用手册中找到这个函数,理解其用法与参数数据。
所写函数:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE)
找到参数1并且查看其取值范围,可见GPIOE在其取值范围内,打开GPIOE的开关,所以将它设置为ENABLE,
2 初始化GPIO_InitT
GPIO_InitTypeDef函数功能为初始化,继续查看函数库文件使用说明
在这里我们要构造一个函数体
GPIO_InitTypeDef GPIO_InitStructure;
将GPIO_InitTypeDef重新定义命名为GPIO_InitStructure;由使用说明可见,GPIO_Init函数要定义说明3个值,GPIO_PIN(IO口引脚标号) GPIOSpeed(GPIO输出速度)GPIOMode(GPIO输出模式)。在这里我们要将其设置为推挽输出,因为我们要点亮LED,所以需要大电流,而其输出特性刚好满足我们的要求,所以设置为推挽输出。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //
将其设置好以后,继续给GPIO_Init的两个参数赋值,参数1为哪一个GPIO外设,我们将其写为GPIOE,参数2为GPIO_InitStructure,所以我们的函数这样子写:
GPIO_Init(GPIOE, &GPIO_InitStructure);
将设置写入GPIO_InitStructure中,用&将其写入。
根据硬件原理图,我们要将其写高电平才会点亮LED,所以要将GPIOE PIN1口写高电平,在这里我们用GPIO_SetBits函数,SetBit函数为置1函数,RESetBit函数为置0函数。
这个函数可以将相应IO口拉高,让其为高电平,根据参数相关设置,我们写入GPIOE PIN1函数即可。
最后再主函数中调用相关函数即可点亮LED
源码分享:
#include "LED.h"//引用LED头文件#include "stm32f10x.h"void LED_Init(void)//LED初始化函数{ GPIO_InitTypeDef GPIO_InitStructure;//构造结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOE时钟 //指定GPIO成员变量 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOE,&GPIO_InitStructure); GPIO_ResetBits(GPIOE,GPIO_Pin_1);//默认输出低电平,默认不点亮}#include "stm32f10x.h"#include "delay.h"#include "LED.h"int main(void){ LED_Init();delay_init();while(1){ GPIO_SetBits(GPIOE,GPIO_Pin_1); delay_ms(500); GPIO_ResetBits(GPIOE,GPIO_Pin_1); delay_ms(500); }}
总结
要想点亮一个LED,其本质操作为设置其相应的IO口,只有学会了设置和操作IO口,大多数问题都能迎刃而解,设置IO口的关键就是设置哪一个IO口,输出还是输入?以什么模式输出和输入?输出和输入的速度又是多少?最后别忘记了,操作IO口,首先要使能相应的时钟。