大前提:C语言基础扎实且熟悉单片机编程(或者会自己查资料解决基础问题)
小前提:该功能较为复杂不封装函数难以促成简洁的代码
第一步:寻找自己要实现的功能的所有子功能的介绍及实现办法
举个例子:
当我们目标功能是A,查该功能的资料得知在这款单片机(模块)要实现这个功能需要同时实现功能B和C,然而还得知做B功能前要先实现C功能。接着说我们去看这两个功能怎么实现,又发现功能B需要功能D作为前提。当然过程中会有一些“干扰项”如功能D是功能E、F的必要条件。这时候我们就要明确我们目标了。以上信息我们就知道要实现功能A,除了A外同时还需要B、C、D(三个子功能)的功能实现逻辑。而这个逻辑可以说是算法,一步算法我们封装一个子函数(不代表一个子功能就一个子涵)——子函数就是在这个功能A函数里面需要引用到的小功能函数。
所以这一步,如果对各功能不熟悉,则要根据分析法思路一步一步找相关功能质料,直到最低层的那个功能。主要了解它的实现需要做什么操作(如硬件连接、通信规则)。这样一来我们就确定了函数的程序框架如下(入口参数暂时不设置,且假设函数不返回值):
针对例子下面是f.h文件封装结构
#ifndef __f_f
#define __f_f
#include
#define write_cmd 0xA0 //如果命令或地址之类的数据太繁杂,
#define read_cmd 0xA1 //为了一眼认出来。最好在头文件处做宏定义
... ...
void f_A(...); //函数声明
void f_D(...);
void f_C(...);
void f_B(...);
#endif
针对例子下面是f.c文件封装结构
#include
#include
/*定义函数D*/
void f_D(...)
{
... ....;
}
/*定义函数C*/
void f_C(...)
{
... ...;
}
/*定义函数B*/
void f_B(...)
{
... ...;
f_D(...){... ....;} //调用函数D
... ...;
}
/*定义函数A*/
void f_A(...)
{
... ...;
f_C(...); //调用函数C
f_B(...); //调用函数B
... ...;
}
用到该功能函数的时候即用到ABCD这几个函数时,必须#include
第二步:寻找到需要用到的寄存器
无论什么功能,说它复杂都源于它的控制涉及的寄存器多(或者说它要控制的位数多),即使是操控单片机外设以为的一些硬件(如存储块)。所以我们先要找到相关的控制寄存器、状态寄存器、数据寄存器这三类基本寄存器(当然未必所有功能都涉及三类,而且不一定一类就是只一个寄存器。注意:寄存器不是单片机的“专利”,一些外部硬件也可能有,需要通过一些通信协议去操控它)。
怎么找?废话不多说,就在数据手册(这就是个人的信息搜寻能力了)。找到了,顺着看下去就知道寄存器怎么用,细到每一个位的功能。
第三步:尝试配置寄存器
这一步是为了避免急于求成而犯错影响效率。
首先,先把功能预设好具体事件,然后尝试把每一个寄存器用到的每一个位进行尝试配置看看自己是否真的掌握了。
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
①草稿上画寄存器示意图如上;
②根据自己需要配置的寄存器,查对应手册位置按要求一一填满寄存器的值
③如果②步骤要求先确定其他寄存器则先去确定或者假设确定
④根据功能需要,寻找下一个需要配置的寄存器,然后重复①②③步骤直到 配置完所有要配的寄存器。
如果以上过程顺利通过则进行下一步,否则还得继续学习。
第四步:回到第二部把函数封装结构的所有函数的入口参数确定个数以及类型。及每个函数内部需要配置寄存器的过程用C语言表达好。(C语言配置寄存器的方法一般就是找出寄存器地址然后在这个地址赋值,而且如果是一块常规芯片官方应该会有自己封装的地址映射代码,比如用寄存器的英文缩写代表其二进制表示的地址。官方没有给地址映射的话那只能自己写咯,可以参考别的芯片底层代码)。
言归正传,怎么确定函数的入口参数个数及类型呢。首先你要看这个功能函数里面需要操作多少个寄存器(包括子函数),如果五个寄存器那至少得五个入口参数(如果操作寄存器的位数多而且分散的话,就得用结构体设置多个参数来设置寄存器用到的每一位,然后在函数入口参数里取结构体地址就行。然后在函数内部再把结构体了各个参数调出来赋值到寄存器)。至于参数类型,除了结构体和字符串外,一般看这个参数有多少个bit,转成二进制最多8位的就是char型以此类推。
本人b站有本博文视频讲解https://space.bilibili.com/83738746
请大佬批评指点