这是本人第一次书写博客,写的不好,大家多多担待!!!
本人是一名爱好嵌入式编程的学生,在自学stm32的时候,收获不小,在这里分享给大家
自学的过程中最困难的就是寻找资源,因此遇到了不少的问题,流的泪只有自己去编写程序才会懂,所以我想为那些有理想却没有头绪的朋友提供一下帮助,共同进步。
hello world
大家学习c语言的时候,第一个编写的程序,肯定是输出hello world ,而在嵌入式的学习过程中,第一个实战的程序肯定是点亮一个LED灯,下面为大家分享一下点亮LED灯的程序设计与实现。
我们实验的一个前提就是要有一个开发板,我使用的实验板是正点原子的stm32mini板,在实验过程中使用还是可以的,大家也可以在网上购买一个自己的板子,型号没有什么要求,设计程序的思路都是一样的,只要明白了一个,其他的就都触类旁通了。
在设计程序的时候,我们首先要建立一个自己的模板,在以后的实践过程中就只需编写相应的函数,然后调用,就可以实现功能。工程模板的建立,大家可以参考手册,也可以在网上参考一下其他人的模板。
有两种编写程序的方式,其一是寄存器法,其二是库函数法,我个人来说还是更喜欢库函数法编程的,比较容易理解,使用的时候直接调用函数。(这里插一句,大家在编写程序的时候,需要使用到外设,一定要提前在网上找到它的datasheet,这些传感器的资料网上资源是比较丰富的,文件应该可以找得到,否则去编写的时候,不仅没有头绪,而且无法验证自己的程序是够正确,我在开始的时候也吃了不少的苦)
设计的三个步骤:
第一步:
我们要了解一下,板子上的资源,我使用的stm32mini板上面,有两个LED:LED0、LED1。在手册上查的资料,看它在设计的时候,有没有使用默认的引脚。参考手册资料,我们可以得到,这两个LED分别对应PA8和PD2,那么我们写程序的时候,只需要初始化这两个引脚就可以。
第二步:
为了方便以后的程序编写,我们在工程中建立一个文件夹,专门存放这部分功能的代码,在以后的编写编写时候,只需要引用这个文件就好。调用方式:#include "模块文件名"
。在本次的讲解中是写了点亮LED灯,因此我们就建立一个以LED为名的文件夹,在里面放入.c和.h的文件,也就是LED.c和LED.h。
第三步:
在LED.h 的文件里面,放入了函数的声明,如果不声明的话,程序无法正常的执行;以及一些宏定义,方便了程序的移植。
在LED.c的文件里面,主要是各种函数的书写了,必不可少的就是初始化函数,通常我们将初始化的函数命名为“led_init()”,也就是一种编写程序的习惯,不仅可以方便自己对多程序设计的时候管理,也方便其他人对自己的程序的理解。
设计
初始化函数设计
使能端口→配置引脚→输出电平
在使能端口的时候,我们要去了解,我们需要使用的引脚是在哪里,受哪些控制,与哪些东西共用资源。
在配置引脚的时候,需要配置:
1.输入输出方式
stm32有上面这八种输入输出方式,相对于51来说是比较复杂的,但是只要我们多练习一下,也是没有问题的,配置这些引脚,也就是IO口,按照设计需要选择合适的输入输出方式。、
在我们这个点亮LED灯的程序中,我们使用推挽输出,可以输出高电平,也可以输出低电平。
2.确定配置的引脚是哪个
我们使用的时候,一般会使用一些宏定义,方便我们的移植程序。宏定义的思想我们需要好好看一下,理解一下,对于程序美观、高效移植等有很大的作用,但是如果现在还不是很熟悉的情况下,大家还是按照基本的来练习就可以。
3.IO口速度配置
一般来说只有三种
这是手册上的资料,大家可以看一下。
4.最后输出引脚高电平就可以了。不要忘了声明!!!!
初始化函数大家多多参考各个开发板的例程,里面的初始化函数,会给我们的程序编写带来很好的思路,并且我们可以学习一下他们的命名、格式等。
驱动程序
初始化是每个文件必不可少的,我们要使用开发板的IO口,就必须要对引脚进行初始化,那么为了以后更加方便的运用以前编写的资源,我通常将功能封装到一个函数里面,哪里需要,就在哪里调用,很是方便。
引用头文件、初始化、调用函数、实现功能,这就是实现我们目标的具体的操作
我们现在需要点亮一个LED灯,那么我们在这里让LED0点亮,编写一个LED_ON();的程序,下面大家看一下具体的程序:
函数的初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高
}
点亮LED0(LED0是低电平点亮)
void LED0_ON()
{
LED0 = 0;
}
在这里直接使用LED0,将LED0对应的引脚为低电平,也就是直接点亮了LED0,而LED0也是使用了宏定义的思想,在h文件中定义了一下:#define LED0 PAout(8)
主程序
#include "led.h" //引用头文件
#include "sys.h"
int main()
{
LED_Init(); //初始化
while(1)
{
LED_ON(); //调用函数
}
}
程序完成
程序编写完成之后,我们就需要调试和烧录了,验证我们的程序结果是否正确。
编译结果如下
以上就是点亮一个LED灯的程序设计,大家可以参考一下。
如有错误,请大家批评指正。
预祝大家都能学习到一些东西,实现自己的梦想。