用库函数点亮第一个LED灯

一想到你在关注我就忍不住有点紧张

 

 

★入学手册★

 

上学的机会是受人控制的,但读书与实践才是获取知识的主要课堂,在这个博主这里学习的权力只掌握在你自己手中,是任何人都剥夺不了的。让学习成为一种生活的习惯,这比任何名牌大学的校徽重要得多!

——一个嵌入式开发者

 

基本知识

点亮STM32的第一个LED灯需要的基础知识非常多,在写代码前要先建立正确的工程模板,还需要了解GPIO口的知识,当然写程序之前还需要比较扎实的C语言知识(结构体,指针),否则就算跟着例程写了程序也没有搞懂为什么。在之后的实训里面我应该都会用库函数实现功能,但是如果对寄存器一点都不了解的话,在之后程序出了bug也不太好解决,所以这篇文章我会尝试用三种方法分别实现点亮第一个LED灯,当然更新时间也可能不同。

用库函数点亮第一个LED灯

准备工作

首先,新建一个工程模板,我这里直接使用的之前教程已经建好的模板,文件名为Template。打开MDK5,在左侧Project设计树中找到新建的工程模板,右键Template。

选择Manage Project Items ,然后在第二列Groups里面添加一个文件夹,之后将会在这个文件夹里面写初始化GPIO口的函数,在这里我将这个文件夹命名为HARDWARE。同样的在工程模板里也添加一个一模一样的文件夹,如下图所示。

写GPIO口初始化函数

在上面两个HARDWARE文件夹创建好了之后,就可以开始写程序了。首先在HARDWARE文件夹里面建一个LED的文件夹,然后在LED文件夹里面分别建一个led.c和led.h两个文件。这两个文件的创建方式可以新建一个日记本然后改后缀,我是直接在MDK5里面另存为创建的。

用MDK5打开 led.c和led.h两个文件,先将led.c添加进MDK5中的左侧设计树中,具体方式如下。
由于我等会要调用led.h的库函数,所以要先将led.h的文件夹加入路径,具体方式如下图所示。这些步骤完成之后可以编译一下,如果没有报错就可以继续。
下面写的是led.h的函数,及等会调用led,h库函数中的LED_Init即可实现对LED灯的GPIO口进行初始化。

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
    



#endif接下来写led.c的程序,这里面就要实现对如何GPIO口的初始化,即定义LED_Init函数。(可能措辞不准,大概就是这个意思。。)

在写这个程序之前首先要对GPIO口有一个基本的了解。首先 STM32 的 IO 口可以由软件配置成 8 种模式,而点亮LED灯用的模式是推挽输出。而我们的目的就是让我们需要点亮的LED灯的GPIO口的输出模式便为推挽输出并设置其他合适的参数。

GPIO 相关的函数和定义分布在固件库文件stm32f10x_gpio.c 和头文件 stm32f10x_gpio.h 文件中,这就意味着等会我们在写初始化程序的时候必须在这两个文件中的代码中来回翻。

以STM32F103开发板为例,它的LED1灯的连接原理图如下,所以等会我们只需初始化PA11即可。

我们先找到stm32f10x_gpio.h这个库函数里面的初始化GPIO的定义函数,最后我们初始化GPIO口肯定是调用的这个库函数,而这个库函数该怎么用,主要就是看括号里面的内容,前一个GPIO_TypeDef* GPIOx的意思是是哪一个GPIO口,例如PE5就是GPIOE。而后面是一个地址型的变量,定义了一个结构体指针,所以在我们的led.c文件中也要定义一个相同的结构体指针,而它的结构体里面的变量则可以通过右键,然后Go to the…了解。


我们点击这个之后可以看到,这个结构体指针里面有三个变量,即速度,模式和速度,它的定义代码如下:

所以,我们的led.c程序里面也要定义一个相同的结构体指针,来初始化GPIO口,具体方式如下:
Mode Pin 和Speed的许用值可以查看GPIO_Init的定义下找到assert_param下的Mode Pin 和Speed,在转至其定义,就可以查看到许用值。

#include"led.h"  
#include"stm32f10x.h"

void LED_Init(void)       
{
 GPIO_InitTypeDef GPIO_InitStruct;  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11;  
 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOB,&GPIO_InitStruct);   
 GPIO_SetBits(GPIOA,GPIO_Pin_11);
}


 

 

main函数

然后写main函数,main函数主要控制LED闪烁时间。

#include "stm32f10x.h"
#include "led.h"   
#include "delay.h"
int main(void)
    
{
    delay_init();
    LED_Init();
    while(1){   
    GPIO_SetBits(GPIOA,GPIO_Pin_11);
    delay_ms(500);  
    GPIO_ResetBits(GPIOA,GPIO_Pin_11);
    delay_ms(500);
    }
}

到这里然后在下载到STM32就可以正常工作了。虽然是点亮一个LED1灯,但是也需要花很多时间去理解,尤其是GPIO口的初始化部分。仅仅对于LED1灯可能库函数还不如寄存器或者位带操作方便。

点击蓝字

关注这个多彩的世界

 

 

 

更多精彩内容请关注我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值