初学STM32,用固件库点亮LED灯全过程

本文用于记录学习过程,如果有错误的地方还请各位看官指出来,谢谢啦

切本文适用于纯小白和刚入门的同学,所以讲的比较繁琐,希望各位看官见谅

跳过工程模板的创建,自己在网上找或者问别人要awa

因为是通过固件库来写,可能用到的文件比较多

需要用到的文件有:

首先先把我们模板外还要创建的文件bsp_led.c和bsp_led.h创建好

bsp_led文件为我们点灯所写的主要程序;(其实这个文件名叫啥都行大家随意)

main就是主函数了,到时候我们点灯程序在bsp_led.c里写好后再在bsp_led.h声明一下就可以直接在main函数里调用了;

stm32f10x.h用来实现内核之外的外设寄存器映射;

stm32f10x_gpio.c和stm32f10x_rcc.c是外设的驱动函数库文件;

stm32f10x_gpio.h和stm32f10x_rcc.h存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明;

(因为我们要用到gpio和rcc嘛,所以就调用gpio和rcc的文件)

当然了还有启动文件startup_stm32f10x_hd.s别忘了,记得加上去。

好了

文件都准备好了就可以开始我们代码的敲写了

首先我要点亮的灯是PE^5(我51习惯这样写了awa)

从中文参考手册-寄存器映射和原理图里可以先确认三个东西:ABP2,  GPIOE,^5

打开我们准备好的工程模板:

先点点魔术棒

然后点c/c++

在右下角的…里选着你刚刚放点灯程序文件的文件夹地址

这样编译器才能找到你的头文件

注意:每次我们添加头文件时都要这样添加地址

如果文件上有一把钥匙的模样用不了的话,直接出去找到放工程模板的文件夹右键点击属性

把勾选的只读取消掉就行了。

好了开始了嗷

我们先点开bsp_led.h文件

前两行和最后一行一定要加上去,这个是防止文件被反复调用的,但凡是头文件都给他加上去,养成习惯。

然后我们看到中间的内容

我们要点亮led是不是要操作gpio口,操作gpio口是不是要操作gpio的寄存器,gpio的寄存器映射是不是放在一个头文件里了啊

所以这里我们先是调用了stm32f10x.h

对了,我们先在main.c和bsp_led.c里把bsp_led.h调入

然后在bsp_led.c里开始编写我们的点灯程序了

我们先初始化结构体,然后在里面添加我们要的参数

为了提高程序的可移植性,所以咱们在bsp_led.h里把这些参数宏定义一下

刚刚在一开始我们就确定了三个我们用得到的东西是吧,就是GPIOE,PE5,APB2

这里呢咱们就来把这三个东西重新宏定义一下

解释如上图。

不清楚定义的东西代表什么吧

没事,跟着下面的流程走

举个例子:咱们选着其中一个,然后右键它,在点一下边上有f12标志的

然后他就会跳转到一个新的页面,这里你就看得到这些代码的意思了

#define LED_G_GPIO_CLK   RCC_APB2Periph_GPIOE  //APB2总线上的GPIOE线的时钟

再看到之前宏定义的那句话,如果我们不把RCC_APB2Periph宏定义为LED_G_GPIO_CLK

且不说移植性更差,写也不怎么好写,而且不太容易认出来这是干什么的吧

回到上面那张图

0x00000040表示着什么呢

取后两位来看是01000000吧,从右往左数第七位输出为1

而在中文操作手册中

从右往左数对应的是IOPE,这样,GPIOE就被我们置1了

另外两个也是类似的道理,这里就不多bb了,省的你们说我话多awa

好了,既然bsp_led.h里的参数都宏定义好了,那我们就回到bsp_led.c里将这些刚刚宏定义好的参数写进结构体里

是不是除了第一句定义初始化结构体其他的几句都不清楚是干啥的awa

还是举个例子嗷

老样子,不懂的就点进去看一下这句是怎么个用法

这样不就可以看到这句话的原型了嘛,然后照着原型的格式写就行了

如果不清楚里面该填啥的话

一般来说函数的周围都会有相应的解释

好了,那现在知道改填啥了吧

RCC_APB2PeriphClockCmd(xxx,xxx);

前面的xxx我们按道理来说应该填RCC_APB2Periph_GPIOE吧

不过我们之前在bsp_led.h里把RCC_APB2Periph_GPIOE宏定义了

所以就写成RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,xxx);

至于后半段xxx该写什么呢

原型里写的是NewState吧,那咱们就去解释那找到他看看解释是什么

好了,这下打开时钟的代码就敲完了

咱们看到下一步

这三步一看注释就很明了了吧

选着咱用的哪个引脚,什么模式输出,速度多少

老样子,举例

咱们进去看看先

哦,这里看得出,其实我们选着的引脚其实就是GPIO_Pin_5

只不过给它重新定义了一下,换了个名字而已

在进GPIO_Pin_5里看看

0x0020是多少呢

咱们拆开来看嗷

0000 0000 0010 0000

而从右往左数的第六位刚刚好就是ODR5

而ODR5置1不久是相当于把这^5位给打开了嘛

另外两行输出模式和输出速度这里就不细说了,不太清楚的话可以根据上面的操作打开来看看相应的解释

先小总结一下

1.咱们首先要配置好三个东西:总线上的时钟,对应的GPIO端口, 相应的引脚

而我们这次点灯(PE5),所对应的也就是:APB2, GPIOE, ^5.

2.在主要函数里其实就只要写四样:

定义初始化结构体,打开时钟,配置好引脚(3项),配置好GPIO口

3.引脚的配置有:选着引脚,选着输出模式,选着输出速度

小结完了

咱们继续讲一下常见的错误

1.记得每一个文件下面都要留几行空行,下面就是不留空行的情景和运行结果

2.在.C文件写的函数一定要在.H文件里声明一下,比如

 

3.编写主要程序时一定要先打开时钟在配置引脚,不然也不能正常运行

4.编写后文件的时候一定要在前两行加上#ifndef __xxxx_x和#define __xxxx_x还有最后一行加上#endif /*__xxxx_x*/

__xxxx_x其实可以随笔写,通常我们会以该头文件的名字来命名.

这几句的作用其实前面已经说了,忘了的看官可以再往前翻。

(这些坑都是我一个个踩出来的awa)

ok,现在我们基本上已经把点灯初始化程序写完了,可以对照一下

  

刚开头你觉得用到的文件好多好麻烦,其实也就只要编写三个文件

现在到了最后一步了

我们在main.c文件里将bsp_led.c文件里的函数LED_GPIO_Config();调了过来后

GPIO_SetBits     拉高引脚输出电平

GPIO_ResetBits     拉低引脚输出电平

当输出GPIO_ SetBits 由于引脚为高电平所以灯灭了

当输出GPIO_ResetBits  由于引脚为低电平所以等就亮了

完成了简单的点灯,我们可以再给它加点料

写一个延时函数,再将其调到熄灯和亮灯下面,那闪烁灯不就成了嘛

对了,写延时函数的参数时记得写成16进制的格式,不然没法用awa

如果有写错了的地方,就劳烦各位看官指出来,谢谢

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值