本文用于记录学习过程,如果有错误的地方还请各位看官指出来,谢谢啦
切本文适用于纯小白和刚入门的同学,所以讲的比较繁琐,希望各位看官见谅
跳过工程模板的创建,自己在网上找或者问别人要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
如果有写错了的地方,就劳烦各位看官指出来,谢谢