在KEIL中建立STM32F4工程中我们经常采用的是一种多C多H文件的形式,这样写的好处是可以把项目拆分成各个模块,便于编写和调试,也就是说每个模块可以单独运行和调试。还有一个好处是整个项目看起来具有具有条理,很容易根据每个文件的名字判断该模块的作用,如果将整个项目都写入main函数里看起来非常臃肿。如图一个工程分成了按键模块,外部中断,延时模块:7 R D8 b; m% \+ a8 |$ H + h" L4 s: t: g3 Z& q .h和.c文件有特定的格式如下图LED灯的.h和.c文件为例: + H+ I. i& L0 Z: p7 K 0 D$ e2 ?& ]" g5 j! i8 `* D : i# f* o i" ]4 A% N/ m0 n5 { .h文件包含函数、数据、类型的声明还有宏定义,需要用到: #ifndef __文件名_H #define __文件名_H 函数声明/ ^# a0 J% ?' ~& W) h #endif7 @" K! Y1 C1 V# k7 ^ 这样的结构,这是为了避免头文件被重复包含,如果头文件被重复包含可能会导致程序在编译、链接过程时崩溃。而.c文件中需要包含.h文件并写出在.h文件中定义的函数的作用。 另外还有一个值得关注的地方在#include后面,include是编译预处理命令,就是将Include后面的文件里面内容复制粘贴到include当前位置.以前我们在学习C语言的时候,用的是尖括号<>,表示在标准库中寻找文件。而在工程中我们用的是单引号 ‘’,表示在当前目录中寻找文件。( g% |; D8 G: F0 C' z \ 还有就是关于全局变量的宏定义,全局变量是作用域从定义处开始到整个文件起作用,而局部变量只在当前文件的函数里起作用。那么对于多C多H文件而言想要将参数传递,比如说在温度传感器.c文件里初始化函数里需要算出温度的值,那么在main函数里需要用到这个参数,就需要用extern声明全局变量,在main函数里面定义这个参数。声明全局变量不等于定义,声明是不分配存储空间的。 最后要注意的是STM32F4的库函数中关于各个功能初始化函数都是通过结构体来完成的,比如说GPIO口的初始化中,GPIO口的结构体里面包含四个成员变量,包含模式,频率等。用结构体的一个原因就是结构体的可扩展性强,可以很方便的添加其他的成员变量,用起来很灵活。6 I% J8 K. v4 } J2 S7 s " ~ F& l( i8 f o: c |
STM32固件库分享,超全系列整理
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32F4中文用户手册
基于STM32F407的FreeRTOS阶段性的总结(13)
STM32F400、STM32F402 Cortex-M4超值单片机
基于STM32F407的FreeRTOS获取各任务运行时间及占用情况(4)
基于STM32F407的FreeRTOS任务的挂起与恢复(3)
基于STM32F407的FreeRTOS任务的创建与删除经验分享(2)
基于STM32F407的FreeRTOS环境搭建经验分享(1)