指针数组–计时器驱动程序第1部分

指针数组是将外围设备寄存器映射到驱动程序的有用工具。使用指针数组有很多优点,例如简化的初始化以及生成可促进代码重用的配置表的能力。定时器模块是每个嵌入式应用程序中使用的基本外围设备之一。定时器用于跟踪时间,生成PWM信号等等。在本文中,将针对一个常见的16位微控制器检查使用指针数组映射计时器外设的技术,同时要记住,所使用的技术可以应用于任何类型的微控制器。

 

在为任何外设编写驱动程序之前,第一步是对数据表进行详细检查。对于本示例,数据手册揭示了五个不同的定时器通道,每个通道由三个寄存器控制。为了配置和操作定时器通道,需要配置定时器,周期和控制寄存器。在这种情况下,控制寄存器分为多个功能,例如启动/停止定时器,时钟选择和时钟预分频器。定时器周期寄存器确定定时器在哪个计数到期,然后定时器寄存器才是实际进行计数的寄存器。一旦配备了这些重要信息,就很容易设置指针数组。让我们研究一下如何为计时器驱动程序完成此操作。清单1演示了如何使用指针数组映射计时器寄存器(计数的寄存器)。

 

清单1:定时器寄存器指针数组

 

该声明声明了一个名为tmrreg的数组,该数组具有指向易失性uint16的常量指针。请注意,声明是从右到左读取的。为了正确地将指针数组声明为常量,同时仍允许编译器知道所指向的值可能在不进行软件更改的情况下发生更改,这一点至关重要。这也确保了指向我们寄存器的实际指针是恒定的,并且不能在应用程序中更改。计时器模块中的每种寄存器类型都将以相同的形式设置其指针数组。在这种情况下,TMR1,TMR2等是由编译器定义为寄存器的存储器位置的掩码。其他寄存器类型将使用其自己的掩码定义。指针数组的显着优势是允许开发人员创建一个循环,通过该循环可以设置每个通道寄存器。例如,在初始化期间,如果开发人员想要清除计时器寄存器,则可以使用清单2中的代码。

 

清单2:清除5个定时器上的定时器寄存器

 

在这种情况下,索引i上的指针将被取消引用,并且指向的寄存器将设置为0。最初,这看起来像是很多额外的工作,却没有什么好处。毕竟,开发人员可能希望以不同的方式设置每个计时器。这是指针数组最大的作用所在!通过以这种方式将寄存器设置到外设,可以开发出配置表作为初始化的一部分。配置表将包含有关每个计时器以及应如何配置的信息。在下一篇文章中将讨论创建配置表的详细信息。目前,必须了解计时器初始化代码的外观。初始化功能将被设置为清除定时器寄存器,设置周期和控制寄存器以及配置表中存储的数据。代替单独访问每个寄存器并创建特定于应用程序的初始化功能,而是使用通用代码,这些代码可以在清单3中找到。在初始化期间,代码循环遍历配置表并根据该表设置每个寄存器。

 

清单3:计时器初始化

 

指针数组包含指针。这要求取消引用每个位置,以便访问外设寄存器。除此之外,初始化功能无非就是从表中读取配置值并将其填充到寄存器中。该代码不仅紧凑,而且非常易于阅读。为了查看每个计时器的配置方式,工程师只需查看配置表即可!无需修改驱动程序,这使得此代码可轻松在其他应用程序中重用。下次将探索创建配置表并扩展初始化功能以包括中断和中断优先级的设置。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.