编程代码前遵循结构设计,大体分为三部分,底层驱动,硬件抽象层,系统任务调用层,程序设计按照这部分来进行设计。
底层驱动
底层驱动是对应相应的MCU而制定的,与MCU的库函数,开发环境搭建有关,底层驱动是将项目所需要的功能进行一系列的初始化,并将基础的功能封装成一个个函数供顶层任务层调用。以STM32为例,底层驱动设计框架如下图所示。
初始化配置表
配置表的设置需要根据项目的需求而添加,例如系统初始化WiFi模块时需要配置IP地址,RTC时间初始化需要给定一个具体时间等,这些可以通过写一个初始化配置表,在初始化驱动的时候将里面的值传进驱动的代码中。例如
//网络配置表
struct Network_status Dev_Network_status = {
.u8gateway = "192.168.1.1",
.u8DevIP_addr = "192.168.1.101",
.u8Target_host_addr = "192.168.1.100",
.u32port = 9090,
.u8net_mask = "255.255.255.0",
};
//RTC时间配置表
struct RTC_Timer Dev_RTC_Timer_config = {
.u32Year = 2016,
.u32Month = 7,
.u32Day = 15,
.u32Hour = 23,
.u32Minute = 45,
.u32Second = 30,
.u32DayOfWeek = RTC_SATURDAY,
.u32TimeScale = RTC_CLOCK_24,
};
硬件抽象层
硬件抽象层将任务与底层驱动区分开来,将硬件驱动功能抽象化
对GPIO抽象化
在底层,GPIO模块子程序中将GPIO管脚配置的函数赋值给probe结构体,然后调用硬件抽象层获取函数,使得硬件抽象层获得驱动信息。
底层GPIO.c部分代码。
static void Dev_GPIO_Set_Value(const uint8_t Lock_number,