目录
APB-timer是一个32位的下行计数器(递减计数器),主要功能如下:
本篇内容参考了这篇文章,请阅读
首先是寄存器信息,RELOAD寄存器和Current VALUE寄存器和一个各个位对应不同控制信号的CTRL控制寄存器,一个中断寄存器。
首先获取读写操作信息,如果是写,要知道写的是CTRL(控制),CUR VAL,RELOAD,INTERRUPT哪个寄存器,四个寄存器描述如下:
对相应的寄存器(CTRL,RELOAD,CURVAL)进行写操作,注意cur_val寄存器除了要响应写操作,当计数器正常计数时,也需要随时钟更新值,这部分逻辑也在这里。
上一部分是获取了寄存器的读取值的低8位,然后接下来要组成字并输出,(不是很理解为什么对RELOAD寄存器值的读取要分到两部分做??——后面再看)
首先是处理EXTIN端口的输入,先用双触发器消除亚稳态,然后允许接收EXTIN的条件是PSEL | reg_ctrl[1] | reg_ctrl[2],就是说片选通,将EXTIN作为clk,将EXTIN作为enable三个条件满足一个双触发器就可以接收EXTIN。
然后是考虑计数器的递减计数功能何时被使能,首先如果对CURVAL寄存器写操作,则直接把current value修改为写入值;如果CTRL[0]=1 enable,再考虑EXTIN的作用,如果EXTIN作为enable(CTRL[1]=1),则需要EXTIN为高,如果EXTIN作为时钟(CTRL[2]=1),则需要检测到EXTIN要进行低到高翻转,这种情况下,就可以让计数器递减计数,递减到0时自动reload;否则计数器不计数。
源码读完了,此时应该再注意一下时钟的使用,对CTRL和RELOAD寄存器的写入用的时钟是PCLKG,然后对寄存器读使用的时钟也是PCLKG。除此之外都用的是PCLK,好处是当没有提供PCLK信号,也就是计数器没法工作时,仍然可以配置寄存器和读取寄存器信息,将计数器的功能与配置寄存器的操作解耦,使可以先配置寄存器,然后提供PCLK信号控制计数器。