实际编程方法
实际编程中,应该把对底层硬件操作用构件法封装起来,给出函数名和接口参数,以供实际编程使用。
分析GPIO驱动构件封装方法与驱动构件封装规范,利用构件法控制小灯闪烁。
以KL25GPIO为例,有61个引脚可作为GPIO,分布在A~E五个端口,不可能使用直接地址去操作相关寄存器,那样无法实现软件移植与复用。
应该把对GPIO引脚的操作封装成构件,通过函数调用与传参的方式实现对引脚的干预与状态获取。
设计驱动构件
遵循一定规范,需要进行封装要点分析,即分析应该设计哪些函数以及函数的入口参数是什么。
首先,初始化模块(gpio_init)由于GPIO模块的引脚可以复用为不同的功能,在初始化时要先设置某一个引脚的功能为GPIO。
然后设置引脚是输入或输出,若输出,还需设置其初始状态,这些信息必须通过参数传递进来,初始化功能一般不需要返回值。
同理分析设置引脚状态和获得引脚状态功能函数,以及GPIO引脚状态翻转函数和GPIO引脚内部上拉函数。
底层驱动构件封装规范概要
第一点 每个构件由头文件(.h)和源文件(.c)两个独立文件组成,放在以构件命名的文件夹中,驱动头文件(.h)中仅仅包含了对外接口函数的声明,相当于使用指南。
封装好的GPIO构件存放在放置底层驱动文件夹"05_Driver"下的"gpio"文件夹中,方便拷贝使用。
要求只看头文件即可了解如何使用构件。
第二点 构件设计需要满足几个基本要求:
考虑使用与移植的方便
有统一,规范的编码风格与注释风格
宏使用有限制,构件中不使用全局变量。
使用构件方法
小灯驱动构件函数
小灯初始化 设置小灯状态 翻转小灯状态
使用小灯构件完成对小灯的控制,须知芯片哪个引脚控制,且高电平还是低电平有效。
编程步骤
第一步 在light.h文件中给小灯起名字,并确定与MCU的引脚,进行宏定义。
#define LIGHT_BLUE (PTB_NUM|9)
//蓝色RUN灯使用的端口/引脚
第二步 在light.h文件中对小灯亮暗进行宏定义,方便编程。
#define LIGHT_ON 0 //小灯亮
#define LIGHT_OFF 1 //小灯暗
第三步 在main函数中初始化LED灯的初始状态。
lighr_init(LIGHT_BLUE,LIGHT_OFF) ;
//蓝灯初始化
第四步 在功能函数中控制小灯状态发生变化。
light_control(LIGHT_BLUE,LIGHT_ON);
//蓝灯亮
第五步 设计主函数
工程文件组织框架
一个嵌入式系统工程会包含工程说明文件,程序文件,头文件,与编译调试相关的文件,开发环境生成文件等。
合理组织文件,规范工程组织,提高阅读清晰度,提高可维护性,降低维护难度,提高项目开发效率。
以light工程为例,树形工程结构模版
文档文件夹 CPU文件夹 MCU文件夹 链接文件夹 驱动文件夹 应用构件文件夹 软件构件文件夹 源程序文件夹
无需新建工程,复制light工程后改名即为新工程。
08_Source源程序文件夹包含
总头文件includes.h内含常量,全局变量声明,主函数main调用其他函数的头文件。
主程序文件main.c是应用程序的启动后总入口,main函数即在该文件中实现。在main函数中包含了一个永久循环,在无操作系统环境下对具体事物过程的处理均在该主循环中。
中断编程在isr.c中完成。
芯片复位实现细节
芯片上电复位后,首先从flash的0x0000 0000地址中,取出第一个表项的内容赋给堆栈指针SP,完成堆栈指针初始化。
芯片内部机制将第二个表项的内容赋给程序计数器PC。
程序跳转至"…\03_MCU\starup_MKL25Z4.S"中的Reset_Handler函数执行,关闭总中断然后转至"…\03_MCU\starup_MKL25Z4.S"文件中的Systemlnit()函数,进行芯片部分初始化。
依次关闭看门狗,系统时钟初始化,再回到Reset_Handler中继续剩余部分初始化功能,包括开总中断,将ROM中的初始化数据拷贝到RAM中,清零未初始化BSS数据段,随后进入用户主函数main。