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

使用配置表初始化MCU的寄存器有很多优点。最普遍的是,配置表将外围模块显示为一个通道,并明确定义了其整个配置值。只需看一下配置表,工程师就可以知道将定时器设置为一毫秒的时间间隔,而不必查阅数据表即可了解“ PR1 = 0x15U;”的含义。正在设置。这篇文章将基于以前的计时器文章来演示如何为计时器模块设置配置表。

 

除了可能在应用程序之间变化的任何有用的可配置值之外,任何外围设备配置表都应包括一个通道。对于定时器模块,除了具有优先级的定时器中断设置外,可以包括的值包括定时器周期,控制寄存器值,启用和禁用定时器。设置配置表的第一步是创建一个定义计时器模块通道的枚举。在此示例中,MCU将包含五个单独且不同的计时器模块。清单1中提供了示例枚举。

 

清单1:计时器通道枚举

 

创建配置表的第二步是定义一个结构,该结构不仅包括计时器通道,还包括将由该表配置的计时器模块的功能。尽管大多数微控制器将具有相似的功能,但从一家芯片制造商到下一家芯片制造商,它们可能会略有不同。使用示例计时器功能,清单2中定义了一个结构,该结构演示了配置中要包括的功能。

 

清单2:计时器配置结构

 

最后,剩下的唯一步骤是填充将用于初始化外围设备的实际配置。该表是Tmr_ConfigType结构的数组。数组的每个元素定义单个计时器通道的配置。配置表包含设置定时器外设所需的所有基本信息。计时器的示例配置表可以在代码清单3中找到。

 

清单3:计时器配置表

 

在此示例中,仅TIMER3启用了中断,目的是使其成为主要系统计时器。在这种情况下,定时器周期被掩码定义,该值是定时器周期寄存器为达到所需周期所需的值。虽然这需要了解寄存器应该是什么的知识,但另一种方法是将其定义为所需的间隔,并让驱动程序根据选定的时钟选项来计算周期寄存器。

 

虽然使用配置表确实会增加代码的闪存使用量,并会增加寄存器初始化的开销,但能够查看表并立即知道如何配置设备的优点大大超过了缺点。

 

此时,可以将配置表传递给Tmr_Init函数以设置外设。但是,从最后一篇文章中查看驱动程序代码可以发现,驱动程序当前未处理中断优先级和启用/禁用中断。启用/禁用中断的代码非常简单,可以在代码清单4中找到。

 

清单4:定时器中断设置

 

在此示例中,仅检查中断允许位以查看其启用还是禁用。指针数组包含控制中断的寄存器。 iecpins数组仅用于切换与特定计时器中断相对应的适当位。代码清单4将在上一篇文章的Tmr_Init中的for循环中插入。唯一缺少的部分是中断优先级的设置。读者可以自己练习将其添加到这些技术中,以选择自己的MCU。

 

读者可能会觉得设置配置表和读取它们的初始化函数效率低下,并且开销太大。初始化函数包含循环代码,该代码为设置外设提供了时间开销。这样做的好处是该代码通常只运行一次,这使得运行琐碎的投诉可能需要更长的时间。拥有易于阅读且非常明确的关于外围设备设置方式的代码的优势大大超过了启动性能,如果使用现代微控制器,这是无关紧要的。当将此事实与易于重用代码的能力结合在一起时,使用指针数组和配置表为开发人员提供了必不可少的工具,使其可以在开发环境中进行竞争,而开发环境通常会浪费时间和金钱。

发表评论

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

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