以串口接口为例介绍关于BSP底层架构开发的迭代过程

以串口接口为例介绍关于BSP底层架构开发的迭代过程

架构概述

单片机开发有四个阶段:

阶段一:单一单片机的功能实现阶段

此阶段你开始熟悉STM32F1系列的单片机,并利用其完成相应的功能,比如点了个灯,通过串口发了个”STM32F103 Hello World“,你完成了第一个工程,将其命名为STM32F103_Hello.

此阶段不考虑单片机的移植性,只管实现功能,你可以在一个main函数写上几千行的代码,当你觉得一个main函数的代码太长不好维护时,即开始进入阶段二:

阶段二:单一单片机的模块化实现阶段

此阶段你已经会使用STM32F1系列单片机的各种不同外设,并打算将外设代码进行模块化。

此阶段不考虑单片机的移植性,但需要考虑代码的复用性,你将main函数的几千行代码拆分成一个个的模块,模块间的调用完全随性而为,低内聚,高耦合的代码随处可见,改动一个模块会影响太多其他模块,当你觉得需要对模块进行解耦,以实现标准化模块间的复用时,你就开始进入阶段三:

阶段三:同一厂商不同系列单片机的应用层模块复用实现阶段

此阶段你实现了代码模块化,会通过接口间的数据实现松散耦合调用

此阶段你可以通过调用以前写好的应用层模块,来满足更换同一厂商的不同单片机时,只需改动少量代码的需求,然而对于大量硬件传感器等外设,不可能做到模块复用,因为传感器的模块太过依赖于底层接口的实现,你要初始化它的引脚,就得调用它的时钟使能接口方法,调用它的gpio库初始化方法,要点个灯,就得调用它的gpio拉高拉低方法,而这些接口在同一厂商的不通系列单片机中,居然都会不一致。于是你不能忍,决定自己开发一个接口更加标准化的库。

阶段四:不用厂商不同系列单片机的分层架构实现阶段

此阶段你完成了BSP-SYSTEM-HARDWARE-APP四层架构,各个层次分工明确。BSP负责外设驱动初始化,配置,调用引脚电平拉高拉低等,SYSTEM负责系统精确延时,及时间片的轮询处理,HARDWARE负责调用BSP的统一接口,实现各个传感器或硬件的初始化及数据收发,APP包含各种通信协议处理及控制逻辑处理,不同单片机通过加入不同的BSP,而SYSTEM-HARDWARE-APP都可以做到不变。

类似的,我们的BSP底层架构开发也经历了若干版本。

初代BSP

最初的版本只限于单个单片机使用,底层和应用层完全没有隔离,经常可见在main函数里操作GPIO库函数的情况,这种架构模式的好处是开发简单,不用考虑复杂的移植性,因此耦合度过高,同厂商不同内核的单片机移植,都会改动大量代码。

初版的串口驱动接口是这个样的:

void USART_driverInit(USART_TypeDef* USARTx, uint32_t baudRate, uint8_t preemptionPriority, uint8_t subPriority);

void USART_sendByte(USART_TypeDef* USARTx, uint8_t byte);
void USART_sendMsg(USART_TypeDef* USARTx, uint8_t *sendBuf, uint32_t len);

void USART1_dmaTxIsr(void);
void USART2_dmaTxIsr(void);
void USART3_dmaTxIsr(void);
void UART4_dmaTxIsr(void);

void USART1_recvIsr(void);
void USART2_recvIsr(void);
void USART3_recvIsr(void);
void UART4_RecvIsr(void);

假设某个应用层要引用它,就必须得包含USART_TypeDef*这个定义的文件,如果不同的厂商串口结构定义不是这个怎么办。

在迭代中我们想到用USART_t给USART_TypeDef*取别名

typedef USART_TypeDef* USART_t;

随着gpio口和dma操作的增加,这种取别名的方式,也不能解决问题,有些结构体内部的成员名都不相同。

于是,我们对BSP架构进行了升级,使其可以兼容更多单片机甚至国产化的单片机。

二代BSP:

方法是建立BSP-SYSTEM-HARDWARE-APP四层架构。

其中不同系列的单片机使用不同BSP框架,保留相同命令的接口,SYSTEM-HARDWARE-APP如果需要调用这个接口,只需要引用XXX系列单片机目录下的BSP头文件。

这个版本的串口驱动接口是这个样的:

typedef USART_TypeDef* USART_Type_t;
typedef struct USART_Struct* USART_t;
typedef struct USART_Struct
{
   
	USART_Type_t usart;
	uint32_t baudRate;  
	uint8_t priority;
	uint8_t subPriority;
	uint16_t parity;
	uint16_t stopBits;
	uint16_t wordLength;
	uint32_t RS485Delay;
	USART_Config_t config; 
	USART_Transport_t *send;
	USART_Transport_t *receive;
	uint32_t timeout;
	uint32_t linkCount;
	bool isRS485Connected;
	void (*USART_TypeInit)(USART_t USART);
	void (*USART_SendByte)(USART_t USART, uint8_t byte);
	void (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值