stm32实现LED灯的闪烁

   stm32单片机设计比较复杂,因此,对于外设的控制就相对于51单片机来讲,就复杂不少。那么如何用stm32单片机点亮LED呢?经过一下几个步骤,就能够实现LED的闪烁。这里使用的stm32型号是stm32f03ZET6。ide

   首先,咱们要对LED作一个基本的硬件了解。LED,中文名称,发光二极管。它是一种发光器件。LED一般状况下只有两个引脚,一个正极,一个负极。当给正极一个高电平,负极一个低电平时,LED发光二极管能够点亮。当给正极一个低电平时,LED熄灭。函数

wKiom1nRIbmArJTAAABQZBLCbUs865.jpg

LED灯有可能共阳接电源,也有可能共阴接电源,具体状况要根据原理图来肯定。这里,采用的是LED共阳接电源,也就是说,8个LED的负极经过IO端口引出来。而后经过,IO端口输入高低电平来给LED供电,以此来控制LED的亮灭。也就是说,操控LED的关键就在于操控stm32的端口。那么,咱们接下来就要根据原理图来接线了。ui

wKiom1nRor2xnJQGAAD2VJOVRn0735.png

   其次,根据原理图咱们能够发现,在开发板内部,已经将LED引出来的引脚结了端口C的PC0~PC7。因此咱们的任务就是要可以操控端口PC0~PC7。在操控端口以前,咱们得对端口作个了解。
设计

   而后,咱们要对IO端口进行了解。要学会如何操控stm32的IO端口。关于stm32,一个端口有16个引脚。好比端口A,有16个引脚,其中PA0~PA7为低8位,PA8~PA15为高8位。每个IO口均可以经过软件自由配置成输入模式和输出模式。输入模式有四种:输入浮空、输入上拉、输入下拉、模拟输入。输出模式也有四种:开漏输出、推挽输出、推挽式复用输出、开漏复用输出。stm32单片机的每一个IO端口都有7个寄存器来控制。注意:IO口和IO端口是不同的。在stm32中,一个IO端口是由16个IO口组成。那么,可以操控IO端口的寄存器分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;1个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR。举个例子,咱们来看一下配置端口寄存器。该寄存器的复位值为0x44444444,很重要的一点就是,复位值其实就是配置端口为浮空输入模式。由于PC0~PC7是端口的低四位,因此,咱们只要对配置端口寄存器的CRL作个配置就能够了,至于高八位,由于咱们并不使用,因此能够不用管它。经过查看数据手册咱们能够知道,在CRL中,一个IO口占四位,分别是CNF【1:0】,MODE【1:0】。MODE控制端口是输入模式仍是输出模式,而CNF配置端口为具体的哪种输入模式或者输出模式(由于不论是输入模式仍是输出模式都有四种模式)。对于几种常见的配置,咱们还能够记住它。好比:0x00,表示模拟输入模式(ADC用);0x03表示推挽输出模式,50MHz速率;0x08表示上/下拉输入模式;0x0B,表示复用输出。而CRH和CRL的配置和功能彻底同样,具体信息能够参考数据手册。在输出模式中,有开漏输出和推挽输出,那么这两种输出模式有什么区别呢?推挽输出:能够输出高低电平,链接数字器件;开漏输出:至关于三极管的集电极,想要获得高电平,须要上拉电阻,其吸取电流能力较强,适合作电流型驱动。因此,控制LED灯,咱们通常采用推挽输出模式。至于详细的关于这些寄存器的用法,能够经过《stm32中文参考手册》去作一个详细的了解。咱们如今已经对IO端口有了一个基本的了解了,接下来,就能够开始了解,stm32的库了,由于,stm32的库操做为咱们操做外设提供了很大的便利。
blog

   既然是经过库来操做这些GPIO,那么咱们就得对库函数有所了解。在3.5的库中,有一个初始化的函数GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct ),能够经过这个函数对GPIO进行初始化。咱们能够看到,在这个函数中,有一个形参类型是GPIO_InitTypeDef,这个类型事实上是一个结构体类型,这个类型的原型就是:
ip

typedef struct{

    uint16_t GPIO_Pin;
    GPIOSpeed_TypeDef GPIO_Speed;
    GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;

经过这个结构体原型咱们能够看出,GPIO_InitTypeDefy这个结构体有三个参数开发

GPIO_Pin;    用来设置要选择的Pin口。get

GPIO_Speed;   用来设置IO的速率。原型

GPIO_Mode;   用来选择要设置的IO模式。it

咱们控制LED,对LED进行初始化,起始就是对GPIO进行初始化。代码以下:

void LED_Init (){

    GPIO_InitTypeDef GPIO_InitStructure;
    
    SystemInit();    //系统时钟初始化
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOC, ENALBE );
    
    //配置GPIO的模式和IO口
    GPIO_InitStructure.GPIO_Pin = LED;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //设置推挽输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //设置IO速率
    GPIO_Init ( GPIOC, &GPIO_InitStructure );          //GPIO初始化
    
}

当有了这个LED初始化函数以后,咱们只要在写一个闪烁函数就好了。所谓闪烁,其实就是LED亮一段时间,LED灭一段时间,这个步骤不断重复。LED亮其实就是给二极管阴极一个低电平,LED灭其实就是给二极管阴极一个高电平。那么,代码以下:

void led_display(){

    GPIO_SetBits ( GPIOC, LED );
    delay ( 6000000 );    //约为1s
    GPIO_ResetBits ( GPIOC, LED );
    delay ( 6000000 );    //约为1s
}

最后,咱们只要有一个主函数,就能够运行了。代码以下:

#include "stm32f01x.h"
#include "led.h"

int main()
{
    LED_Init();
    
    while ( 1 ){
    
        led_display();
    }

}
相关文章
相关标签/搜索