日常废话
北京可太冷了,说好要写一段废话,发生了不少事情,好与丧的都有,丧的占大多数。话不能多说,自己消化就好,多说就泄露了天机。
底层寄存器配置与定时器配置函数的引入
在使用ARM Cortex-A9的中断系统时,阅读到了一段配置定时器的程序,其中包含的一行程序引起了我的注意。
XTmrCtr_SetOptions(&TMRInst, 0, XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION);//第三个变量选择了模式选项对寄存器进行了配置
这行程序是对定时器的 Control/Status 寄存器XTC_TCSR_OFFSET进行配置,一般来说配置寄存器是通过修改寄存器的某1bit的值 0,1 来对这一位代表的功能进行设置,或者直接写入一个字节8bit的数来直接将一个寄存器配置完成。
但是这行程序是使用了一个封装更好,更易读的方式对寄存器进行配置的,使用了Xilinx提供的XTmrCtr_SetOptions()函数对定时器进行模式配置。可以看到函数的第三个变量通过选择option的形式,选择了定时器的不同功能,也就是设置了定时器控制寄存器的不同位的功能,以一个更易读的方式配置了定时器的工作方式,使得程序更易读。下面对此函数的底层进行分析,来看看它是如何工作的。
首先此函数有3个变量,首先要理解这三个变量的含义。
/*****************************************************************************
* @param InstancePtr is a pointer to the XTmrCtr instance.
* @param TmrCtrNumber is the timer counter of the device to operate on.
* Each device may contain multiple timer counters. The timer
* number is a zero based number with a range of
* 0 - (XTC_DEVICE_TIMER_COUNT - 1).
* @param Options contains the desired options to be set or cleared.
* Setting the option to '1' enables the option, clearing the to
* '0' disables the option. The options are bit masks such that
* multiple options may be set or cleared. The options are
* described in xtmrctr.h.
******************************************************************************/
void XTmrCtr_SetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber, u32 Options)
Xilinx的函数不仅提供了文档,而且在每个函数都详细备注了函数的功能与变量的意义,这点很棒,就不需要详细解释了,大致含义是InstancePtr是定时器实例,TmrCtrNumber是在有多个定时器的时候指示是第几个定时器,Options是用来设置选项的,当选择了一个选项,该bit就会被置1,未被选择的就被置0.
定时器配置函数的实现文件xtmrctr_options.c
要理解函数是如何工作的,就需要查看这个配置函数实现的文件xtmrctr_options.c,将这个文件的代码贴到最后以便查阅。
文件提供了两个函数接口,一个是配置定时器的控制寄存器函数XTmrCtr_SetOptions,另一个是获得寄存器当前状态的XTmrCtr_GetOptions,两个函数实现的功能类似,只需要看懂一个就能理解另一个。
函数实现如图下,实现核心配置功能的代码是for循环后面。
*****************