创建配置表以初始化外围设备

如前一篇文章所述,可以使用指针数组对微控制器外围设备进行存储器映射。该方法允许将外围设备视为通道的集合,这些通道可以通过循环中的索引进行配置。通过采用这种通用方法进行内存映射,需要一种技术来精确控制放入寄存器的内容。配置表是用于此确切目的的有用工具。

配置表的确切含义是:它是用于配置外围设备的通道和值的集合。定义配置表的最有用方法是创建一个typedef结构,该结构包含设置每个通道所需的所有必需字段。首先检查感兴趣的外围寄存器。例如,检查计时器外围设备可能会导致确定应包含在配置表中的必要字段是通道,周期和控制字段。然后,可以通过清单1中所示的结构来定义表元素。

清单1:配置表定义

 

Tmr_ConfigType定义了设置单个定时器外设所需的所有数据。由于大多数微控制器包含多个定时器,因此将创建一个Tmr_ConfigType数组,该数组的每个索引代表一个通道(单个定时器模块)。在定义配置表之前,首先定义表的通道类型很有用。该通道将用于访问属于该通道的数组中的索引,进而允许应用程序代码操纵该特定计时器。

 

清单2:计时器通道定义

 

在清单2中,使用typedef枚举创建通道名称。由于枚举从0开始(无论如何以C开头),TIMER1可用于访问包含有关TIMER1信息的数组的索引0。然后,NUM_TIMERS保留可用计时器数的值。可以在驱动程序初始化中使用它来循环和配置每个通道(最多NUM_TIMERS个)。一旦定义了通道类型,就可以在配置表中填写将用于配置计时器的值。清单3显示了一个基于Tmr_ConfigType结构的示例配置表。由于配置数据在运行时不会更改,因此将配置表定义为const。列出每个通道以及一个周期和一个控制寄存器值。

 

清单3:2个计时器的配置表示例

 

如果在实际项目中使用清单3,则周期值将对应于发生中断或其他有用系统事件之前所需的计时器的滴答数。控制寄存器属性将代表需要设置的其他寄存器。除了控制中断优先级之外,还可能包括为每个计时器启用和禁用中断。根据制造商支持的功能,配置表中包括的项目可能因外围设备而异。

 

此时,检查每个清单中的代码将很有用。定义之一有误。在清单1中,TmrChannel被定义为uint8。但是,在配置表中,我们使用Tmr_ChannelType填充了此结构变量。创建此枚举后,应将清单1修改为清单4中的代码。

 

清单4:更新的配置表定义

 

下一篇文章将通过详细研究计时器的行为,以配置表和指针数组的概念为基础。随后的文章将显示如何完成驱动程序。将探讨计时器的初始化功能是什么样的,以及如何使用配置表来初始化寄存器。

发表评论

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

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