[资料分享] MPLAB® Harmony之学习篇(六) -- 认识Harmony静态和动态驱动

橙色凯   2016-11-30 13:23 楼主
本文转自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静态驱动程序:

  • 打开MHCMPLABHarmony & Application Configuration中展开Harmony Framework Configuration - Drivers - USART选项
  • UseUSART Drive之前的选择框中打勾
  • DriverImplementation下拉窗口中选择Static
  • Numberof USART Driver Instances对话框中填入需要的USART 实例的数量根据Numberof USART Driver Instances对话框中的数量会产生USARTDriver Instance NN = 012)。
  • 展开USARTDriver Instance NN = 012),根据应用的需要对每个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.hsystem_definitions.hsystem_init.csystem_tasks.c)添加用于配置USART驱动程序的数据结构(对象)。另外,MHC将相应的USART驱动程序源文件添加到项目中。








大家可能或注意到,所生成的静态驱动文件和动态驱动文件在项目中的位置不同。这是因为Harmony安装目录下只有动态驱动的代码,静态驱动代码是通过模板文件生成的。所以静态驱动代码存放在项目文件夹的app目录下,而动态驱动代码存放在framework目录下。





综上,静态驱动的优点主要是直观,容易理解;而动态驱动则更省程序空间,且易于维护。

希望通过以上介绍,大家对MPLAB Harmony下的静态驱动和动态驱动有个初步的认识,能够根据自己应用的需要,配置调用不同类型的驱动。




回复评论 (3)

这篇有点高难,出现了句柄。我记得学过WINDOWS编程,那里主要是句柄转来转去,没想到在这里也看到了,我想消化消化再看后边的。我见句柄,就象足球的恐韩症一样。
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2016-12-1 20:56
用过两次Harmony,配置过程与freescale(nxp)的codewarrir很类似。Harmony做得很细致,调节项目很多,生成的代码质量也不错一贯体现pic的品质。个人对生产代码的布局和内容比较感兴趣,简单看过之后感觉有一个我喜欢的一个我不喜欢的:喜欢的,Harmony文件生成的内容看着比较舒服,比较少有机器生成的感觉,codewarrir这家伙的代码生成出来乱七八糟(虽然质量同样很高),机器的痕迹太重,所以人就看着不舒服。不喜欢的,harmony文件布局有点莫名其妙的,感觉想弄一个很细致的分层/布局,但是往往让人反而不知道去哪里找,虽然mplabx有代码引导功能,可是文件的粒度比函数和变量大很多,辨识度也高很多,总不能为了找个文件先搜索一个函数出来再引导到声明/实现文件去吧。 另外吐槽一下mplabx下的pickit3的仿真速度,太慢了!真的太慢了!便宜货也不至于这样难用吧,要知道arm圈里开发板的仿真器都兴送了。 本帖最后由 freebsder 于 2016-12-6 21:33 编辑
默认摸鱼,再摸鱼。2022、9、28
点赞  2016-12-6 21:31
harmony现在用1.09版本的,感觉BUG比以前少了很多,但是偶尔还是会出现问题,以前用外设库和第三方操作系统如ucos-III时感觉兼容性不是很好,很多外设库甚至不如用寄存器操作方便。另外建议IDE中加入git 和 VIM 的支持。
点赞  2016-12-16 15:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复