APB-timer设计代码分析

发布时间:2024年01月05日

目录

APB-timer源码如下:

寄存器信息:

输入输出端口:

寄存器等:

主要代码如下:

1、获取读写操作信息:

2、对相应寄存器进行写操作:

3、读操作:

4、组成字并输出:

5、生成和处理中断的逻辑:

6、递减计数功能何时被使能:

7、中断生成逻辑:

标准阅读::


APB-timer是一个32位的下行计数器(递减计数器),主要功能如下:

本篇内容参考了这篇文章,请阅读

APB-timer源码如下:

寄存器信息:

首先是寄存器信息,RELOAD寄存器和Current VALUE寄存器和一个各个位对应不同控制信号的CTRL控制寄存器,一个中断寄存器。

输入输出端口:

寄存器等:

主要代码如下:

1、获取读写操作信息:

首先获取读写操作信息,如果是写,要知道写的是CTRL(控制),CUR VAL,RELOAD,INTERRUPT哪个寄存器,四个寄存器描述如下:

2、对相应寄存器进行写操作:

对相应的寄存器(CTRL,RELOAD,CURVAL)进行写操作,注意cur_val寄存器除了要响应写操作,当计数器正常计数时,也需要随时钟更新值,这部分逻辑也在这里。

3、读操作:
  • 接下来是对指定的寄存器进行读操作,读操作还可以读取PID,CID等只读寄存器,如果地址无效,默认读出0。
  • 第一部分是组合逻辑,在得到读出的寄存器数据后要通过触发器进行同步输出,即第二部分的always块
  • 注意在第一部分,并没有获取CUR VAL的值,这是因为只有CUR VAL的值会随时钟周期改变,为了在读CUR VAL寄存器时输出的值具有时效性,不能在这里读取

4、组成字并输出:

上一部分是获取了寄存器的读取值的低8位,然后接下来要组成字并输出,(不是很理解为什么对RELOAD寄存器值的读取要分到两部分做??——后面再看)

5、生成和处理中断的逻辑:

首先是处理EXTIN端口的输入,先用双触发器消除亚稳态,然后允许接收EXTIN的条件是PSEL | reg_ctrl[1] | reg_ctrl[2],就是说片选通,将EXTIN作为clk,将EXTIN作为enable三个条件满足一个双触发器就可以接收EXTIN。

6、递减计数功能何时被使能:

然后是考虑计数器的递减计数功能何时被使能,首先如果对CURVAL寄存器写操作,则直接把current value修改为写入值;如果CTRL[0]=1 enable,再考虑EXTIN的作用,如果EXTIN作为enable(CTRL[1]=1),则需要EXTIN为高,如果EXTIN作为时钟(CTRL[2]=1),则需要检测到EXTIN要进行低到高翻转,这种情况下,就可以让计数器递减计数,递减到0时自动reload;否则计数器不计数。

7、中断生成逻辑:

  • 中断生成逻辑,当计数器可以计数(dec_ctrl),中断使能(CTRL[3]),cur_value=0时,需要assert interrupt。
  • 如果外界要将INTCLR寄存器写1,就需要清除中断信号
  • 无论是生成还是清除,都需要更新INT寄存器

源码读完了,此时应该再注意一下时钟的使用,对CTRL和RELOAD寄存器的写入用的时钟是PCLKG,然后对寄存器读使用的时钟也是PCLKG。除此之外都用的是PCLK,好处是当没有提供PCLK信号,也就是计数器没法工作时,仍然可以配置寄存器和读取寄存器信息,将计数器的功能与配置寄存器的操作解耦,使可以先配置寄存器,然后提供PCLK信号控制计数器。

标准阅读::

  • 1、TIMERINT是timer的中断输出信号,当计数到0时,如果使能了中断功能,该端口就会拉高到被INTCLR清除
  • 2、允许配置寄存器,使用EXTIN的上升沿翻转使能计数
  • 3、如果使用2的功能,则需要保证EXTIN的翻转频率比PCLK的频率的一半还低,因为EXTIN需要用双触发器采样,触发器时钟是PCLK,如果EXTIN变的更快,会无法采样到
    ?
文章来源:https://blog.csdn.net/weixin_49816194/article/details/135334775
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。