本文转自Microchip麦田论坛——作者:炮灰哥
通过本文希望大家了解MPLAB® Harmony框架下的动态驱动和静态驱动的差异以及如何利用MHC配置驱动。
本文讨论以下内容:
- Harmony中的静态驱动和动态驱动的差异
- 如何用MHC来配置驱动
Harmony框架如下图所示,PLIB中的接口直接访问外设的寄存器,而上层应用程序则是通过驱动程序来调用PLIB,间接访问外设。
Harmony框架下有两种类型的驱动,静态驱动和动态驱动。下面我向大家来介绍一下这两种驱动程序的差异以及如何利用MHC配置驱动。
静态驱动和动态驱动的差异:
1. 静态驱动,每个驱动针对一个外设,包含一份代码以及相关的数据;
动态驱动,可以同时管理多个外设,且只有一份代码(节省Flash空间)。
2. 静态驱动可以支持一个或多个用户(client),Harmony暂时只实现了单用户(client)的静态驱动;
动态驱动可以支持多个用户(clients)。
3. 静态驱动API和传统的函数类似,直接访问;
动态驱动的API需要通过句柄指针(handle)来访问。
Handle就是一个指针,指向动态驱动的数据结构体,其中包含了动态驱动所管理的外设的相关信息。
下图形象的诠释了,用户(client),驱动,和外设之间的关系。而对于动态驱动来说handle则是联系 这三者的关键,就如同下图中的钥匙。
4. 静态驱动API调用示例:
USART0: DRV_USART0_WriteByte(tx_byte),
USART1: DRV_USART1_WriteByte(tx_byte)
动态驱动API调用示例:
USART0:DRV_USART_WriteByte(myUSARTHandle0,tx_byte),
USART1:DRV_USART_WriteByte(myUSARTHandle1,tx_byte)
请注意,动态驱动的句柄是通过open函数来获得的,如:
myUSARTHandle0 = DRV_USART_Open(APP_USART_DRIVER_INDEX, (DRV_IO_INTENT_READWRITE | DRV_IO_INTENT_NONBLOCKING));
用MHC来配置驱动(以USART驱动为例):
下面将用PIC32MZ EF starter kit来实现USART2应用示例,分别基于静态驱动和动态驱动。
1. 使用MPLAB Harmony配置器(MHC)配置USART静态驱动程序:
- 打开MHC,在MPLABHarmony & Application Configuration中展开Harmony Framework Configuration - Drivers - USART选项。
- 在“UseUSART Drive?”之前的选择框中打勾。
- 在“DriverImplementation”下拉窗口中选择“Static”。
- 在“Numberof USART Driver Instances”对话框中填入需要的USART 实例的数量,根据“Numberof USART Driver Instances” 对话框中的数量,会产生“USARTDriver Instance N”(N = 0,1,2…)。
- 展开“USARTDriver Instance N”(N = 0,1,2…),根据应用的需要,对每个USART实例的静态驱动程序进行配置。
配置完成后,在MHC中点击“Generate Code”按钮创建USART静态驱动程序,这将生成USART静态驱动程序源文件,并添加到项目中。MHC生成drv_usart_static.c文件,文件中为每个USART实例创建了UART静态驱动程序,其中包括USART实例的初始化函数,以及其他函数。
2. 使用MPLAB Harmony配置器(MHC)配置USART动态驱动程序:
- 打开MHC,在MPLAB Harmony & ApplicationConfiguration中展开Harmony Framework Configuration - Drivers - USART选项。
- 在“Use USART Drive?”之前的选择框中打勾。
- 在“Driver Implementation”下拉窗口中选择“Dynamic”。
- 在“Number of USART Driver Instances”对话框中填入需要的USART实例的数量,根据“Number of USART Driver Instances” 对话框中的数量,会产生“USART Driver Instance N”(N = 0,1,2…)。
- 展开“USART Driver Instance N”(N = 0,1,2…),根据应用的需要,对每个USART实例的动态驱动程序进行配置。
- 在“Number of USART Driver Clients”对话框中指定使用 USART实例的USART动态驱动程序客户端对象的数量。
- 不同于USART静态驱动程序,USART动态驱动程序提供了逐个字节、读/写,以及缓冲区队列三种不同的数据传输模型,以及支持DMA传输的选项。
配置完成后,在MHC中点击“Generate”按钮来创建USART动态驱动程序。根据对驱动程序配置的方式,MHC修改Harmony系统的源文件(system_config.h,system_definitions.h,system_init.c,system_tasks.c)添加用于配置USART驱动程序的数据结构(对象)。另外,MHC将相应的USART驱动程序源文件添加到项目中。
大家可能或注意到,所生成的静态驱动文件和动态驱动文件在项目中的位置不同。这是因为Harmony安装目录下只有动态驱动的代码,静态驱动代码是通过模板文件生成的。所以静态驱动代码存放在项目文件夹的app目录下,而动态驱动代码存放在framework目录下。
综上,静态驱动的优点主要是直观,容易理解;而动态驱动则更省程序空间,且易于维护。
希望通过以上介绍,大家对MPLAB Harmony下的静态驱动和动态驱动有个初步的认识,能够根据自己应用的需要,配置调用不同类型的驱动。