TIMER

TIMER为多功能定时器,可对不同信号计数,达到特定功能

外设特性

  1. 2个独立的16位计数器通道

  2. 每个计数器都支持计时,计数,捕获三种模式

  3. 通道独立的计数溢出中断与捕获中断服务函数入口(共四个中断服务函数入口)

  4. 每个通道都支持捕获值dma传输

  5. 支持脉冲捕获

功能描述及使用

  1. 定时器不同模式,是定时器的计数器对不同信号的计数

  2. 定时器满足下列条件之一,计数器的计数值将归零

  • 计数达到设定的溢出值

  • 捕获模式下,外部信号满足设定的边沿触发条件

  • 向TIMER_CTL.RESTART写1

工作时钟

../../_images/kiwi-timer-clk.jpg
  • 两通道独立的时钟控制,由CMU模块寄存器TIMER0CLK和TIMER1CLK控制。

  • 当通道时钟使能,且CMU的CLKEN0寄存器的TIMER比特置位、RMU的RSTEN0寄存器的TIEMR比特置位,才可以对通道寄存器读写。

  • 注意时钟源选择时,选择的时钟是否打开,参看时钟控制模块 XX

计时模式(timer mode)

../../_images/kiwi-timer-mode-timer.png

计时模式时计数器对TIMER通道的工作时钟经行计数,当计数值达到设定的溢出值,产生pending,由于时钟频率固定,故可达到定时的效果。通过设定计数溢出值,可计算产生pending的时间间隔。计时时间计算公式:

../../_images/kiwi-timer-formula-timer.jpg
  • T_ms: 定时间隔,单位ms

  • Timer_clk: TIEMR通道的工作时钟,单位赫兹(Hz),寄存器CMU_TIMERnCLK中设定

  • peidiv: TIMER通道计数分频值,范围0-31,寄存器TIMER_CTL的PERDIVL比特域设定

  • Timer_len: TIMER通道设定的计数溢出值个数,TIEMR_LEN寄存器设定,范围1-65535

计时模式也可由外部信号控制:可只在输入信号为高时计数,或可只在输入信号为低时计数

使用

1. 使能TIMER模块,并配置通道时钟

  • 置位CMU_CLKEN0.TIMER,开启TIMER时钟使能;

  • 置位RMU_RSTEN0.TIMER,释放TIMER模块;

  • 配置CMU_TIMERnCLK寄存器,选择通道工作时钟源,并打开通道工作时钟。

2. 配置TIMER_CTL寄存器,设置通道工作参数

  • TIMER_CTL.MODE 设定通道工作模式,值设为0,意为计时模式;

  • TIMER_CTL.DIRECTION设定计数方式,0表示通道计数从零递增计数到TIMER_LEN的值,产生计数溢出pending;1表示从TIEMR_LEN的值递减计数到0,产生计数溢出pending;

  • TIMER_CTL.EDGE 设定外部信号控制计数器计数方式,根据实际选择,值为0表示一直计数,不受外部信号影响,值为1表示当外部信号为高时计数,值为2时表示当外部信号为低时计数,值为3时表示停止计数;

  • TIMER_CTL.GPIO_SRC 设定外部信号的输入的GPIO引脚号。值为0-28表示信号从GPIO0-GPIO28输入,值为29、30表示timer0和timer1的信号;

  • TIMER_CTL.DEBOUNCE 设定输入信号是否进行消抖延时,单位为通道工作时钟个数,值为0时表示不延时,1到7为2的1到7次方的时钟个数;

  • TIMER_CTL.PREDIVL 设定计数器对时钟计数的分频值,实际分频数为设定数加一;

  • TIMER_CTL.RELOAD_EN 设定计数值溢出后,是否继续重新计数。0表示计数值溢出后,停止;1表示计数值溢出后,继续重新计数;

  • TIMER_CTL其它值在此模式设为0即可;

3. 设置计数溢出值

  • TIMER_LEN.LENGTH 设定计数溢出值,范围1-65535,当计数值达到此值产生溢出pending;

4. 清除PD寄存器

  • 清除TIMER_PD寄存器对应通道的pending,TIMER_PD.TIMER0表示通道0计数溢出pending,TIMER_PD.TIMER1表示通道1计数溢出pending;

5. 配置中断IE

  • 根据使用情况使能TIMER_IE寄存器,TIMER_IE.TIMER0表示通道0溢出中断,TIMER_IE.TIMER1表示通道1溢出中断。中断服务函数分别为timer0_irq_entry()和timer1_irq_entry();

6. 使能通道,开始计数

  • TIMER_CTL.RUN置位,开始计数;

计数模式(counter mode)

../../_images/kiwi-timer-mode-counter.png
  • 计数模式是计数器对外部输入信号的电平边沿进行计数,当计数值达到设定值,产生pending,可对单独对上升沿,下降沿,双边沿计数。

  • 计数模式的输入信号电平变化频率大于通道的工作时钟,对输入信号的计数会出错,此时应该提高通道的工作时钟。

使用

1. 使能TIMER模块,并配置通道时钟

  • 置位CMU_CLKEN0.TIMER,使能TIMER时钟

  • 置位RMU_RSTEN0.TIMER,释放TIMER模块

  • 配置CMU_TIMERnCLK寄存器,选择通道工作时钟源,并打开通道工作时钟。

2. 配置TIMER_CTL寄存器,设置计数器工作参数

  • TIMER_CTL.MODE 设定通道工作模式,值设为1,意为计数模式

  • TIMER_CTL.DIRECTION设定计数方式,0表示通道计数器从零递增计数到TIMER_LEN的值,1表示从TIMER_LEN的值递减计数到0

  • TIMER_CTL.EDGE 设定外部信号控制计数器计数方式,根据实际选择,值为0表示计数外部信号的下降沿,值为1表示计数外部信号的上升沿,值为2时表示计数外部信号的上升沿和下降沿。

  • TIMER_CTL.GPIO_SRC 设定外部信号的输入的GPIO引脚号。值为0-28表示信号从GPIO0-GPIO28输入,值为29、30表示timer0和timer1的信号

  • TIMER_CTL.DEBOUNCE 设定输入信号是否进行消抖延时,单位为通道工作时钟个数,值为0时表示不延时,1到7为2的1到7次方的时钟个数

  • TIMER_CTL.PREDIVL 设定计数器对电平边沿计数的分频值,实际分频数为设定数加一,即实际对电平边沿计数时,当有PREDIVL 设定值个数的电平变化时,VAL计数一次

  • TIMER_CTL.RELOAD_EN 设定计数器计数值溢出后,是否继续重新计数。0表示计数值溢出后,停止;1表示计数值溢出后,继续重新计数

  • TIMER_CTL其它值在此模式设为0即可

3. 设置计数溢出值

  • TIMER_LEN.LENGTH 设定计数溢出值,范围1-65535,当计数值达到此值产生溢出pending

4. 清除PD寄存器

  • 清除TIMER_PD寄存器对应通道的pending,TIMER_PD.TIMER0表示通道0计数溢出pending,TIMER_PD.TIMER1表示通道1计数溢出pending

5. 配置中断IE

  • 根据使用情况使能TIMER_IE寄存器,TIMER_IE.TIMER0表示通道0溢出中断,TIMER_IE.TIMER1表示通道1溢出中断。中断服务函数分别为timer0_irq_entry()和timer1_irq_entry()

6. 使能通道,开始计数

  • TIMER_CTL.RUN置位,开始计数

捕获模式(capture mode)

../../_images/kiwi-timer-mode-capture.png
  • 捕获模式是计数器对定时器通道工作时钟计数,计数的开始和停止由外部信号的边沿控制。

  • 当外部信号产生捕获边沿事件,将产生捕获pending,并将当前计数值放入CAP寄存器中。由于时钟频率固定,故可达到捕获电平边沿之间时间的功能

  • 捕获时间计算公式:

    ../../_images/kiwi-timer-formula-capture.jpg
    • C_ms: 捕获的电平沿之间的时间,单位毫秒ms

    • Timer_clk: TIMER通道的工作时钟,单位赫兹Hz,寄存器CMU_TIMERnCLK中设定

    • perdiv: TIMER通道设定分频值,范围0-31,寄存器TIMER_CTL的PERDIVL比特域设定

    • Timer_cap: TIMER通道捕获的计数值,TIMER_CAP寄存器获取

捕获模式的特殊情况

  • 由于计数器只有16比特,加上32分频,也会较大可能存在电平边沿之间时长超过计数器能表示的最大时间。在这种情况下,必须同时使用捕获pending和定时pending来得到正确的捕获时间。

  • 当捕获模式极性间的计数时间,小于溢出设定值对应时间,溢出值对应的pending将不会触发,因为在捕获时间到达,会清零计数值,从而不溢出’

使用

1. 使能TIMER模块,并配置通道时钟

  • 置位CMU_CLKEN0.TIMER,使能TIMER时钟

  • 置位RMU_RSTEN0.TIMER,释放TIMER模块

  • 配置CMU_TIMERnCLK寄存器,选择通道工作时钟源,并打开通道工作时钟

2. 配置TIMER_CTL寄存器,是定计数器工作模式

  • TIMER_CTL.MODE 设定通道工作模式,值设为2,意为捕获模式

  • TIMER_CTL.DIRECTION设定计数方式,0表示通道计数器从零递增计数到TIMER_LEN的值,1表示从TIMER_LEN的值递减计数到0。推荐使用递增计数,否者递减计数需要用TIMER_LEN的值减去捕获值才是真正的捕获计数值

  • TIMER_CTL.EDGE 设定外部信号触发计数器方式,根据实际选择,值为0表示外部信号为上升沿时将计数值放入TIMER_CAP中,产生捕获pending并归零重新计数;值为1表示外部信号为下降沿时将计数值放入TIMER_CAP中,产生捕获pending并归零重新计数;值为2表示外部信号为上升沿和下降沿沿时将计数值放入TIMER_CAP中,产生捕获pending并归零重新计数。值为3表示上升沿/下降沿开始计数,下降沿/上升沿时将值放入TIMER_CAP中,产生捕获pending并停止计数,并使TIMER_CTL.CAP_POL比特有效

  • TIMER_CTL.CAP_POL 当TIMER_CTL.EDGE为3,此比特有效,用于指定开始计数沿。当值为0,表示上升沿开始计数,下降沿停止计数,并将计数值放入TIMER_CAP中,产生捕获pending。当值为1,表示下降沿开始计数,上升沿停止计数,并将计数值放入TIMER_CAP中,产生捕获pending

  • TIMER_CTL.GPIO_SRC 设定外部信号的输入的GPIO引脚号。值为0-28表示信号从GPIO0-GPIO28输入,值为29、30表示timer0和timer1的信号

  • TIMER_CTL.PREDIVL 设定计数器对时钟计数的分频值,实际分频数为设定数加一

  • TIMER_CTL.DEBOUNCE 设定输入信号是否进行消抖延时,单位为通道工作时钟个数,值为0时表示不延时,1到7为2的1到7次方的时钟个数

  • TIMER_CTL.CAP_FMT 设定捕获寄存器最高位是否表示极性,值为0表示最高位不表示极性,值为1表示最高位表示极性

  • TIMER_CTL.CAP_START 设定第一次捕获模式的开始,值为0表示使能RUN后立刻开始第一次的捕获计数,值为1表示使能RUN后,需等到第一捕获时间到达,才开始第一次捕获计数

  • TIMER_CTL.RELOAD_EN和 TIMER_CTL.CAP_SINGLE 设定计数器计数值溢出后,是否继续重新计数。RELOAD_EN为0同时CAP_SINGLE为0表示计数值溢出后,停止;RELOAD_EN为0同时CAP_SINGLE为1表示满足捕获条件,停止,RELOAD_EN为1同时CAP_SINGLE为0表示计数值溢出后,继续重新计数

  • TIMER_CTL其它值在此模式设为0即可

3. 设置计数溢出值

  • TIMER_LEN.LENGTH 设定计数溢出值,范围1-65535。当计数值达到此值产生溢出pending

4. 清除PD寄存器

  • 清除TIMER_PD寄存器对应通道的pending,TIMER_PD.TIMER0表示通道0计数溢出pending,TIMER_PD.TIMER1表示通道1计数溢出pending。TIMER_PD.CAPTURE0表示通道0捕获pending,TIMER_PD.CAPTURE1表示通道1捕获pending

5. 配置中断IE

  • 根据使用情况使能TIMER_IE寄存器,TIMER_IE.TIMER0表示通道0溢出中断,TIMER_IE.TIMER1表示通道1溢出中断。中断服务函数分别为timer0_irq_entry()和提timer1_irq_entry()。TIMER_IE.CAPTURE0表示通道0捕获中断,TIMER_IE.CAPTURE1表示通道1捕获中断,中断服务函数分别为capture0_irq_entry()和capture1_irq_entry()

6. 使能通道,开始计数

  • TIMER_CTL.RUN置位,开始计数

7. 读取 TIMRE_CAP值获取捕获值

  • 当捕获pending到达,读取捕获值,若在捕获pending之前通道溢出pending也置位,捕获值需要再加上TIMER_LEN乘以溢出pending产生次数

捕获模式与计时模式的异同

  • 计数器都是对通道时钟计数

  • 计数值达到LEN寄存器的设定值时都会产生pending,并计数值归零再计数

  • 计时模式的计数器是在信号为某电平时才计数工作时钟。捕获模式是有电平沿才开始对时钟计数,直至电平沿又发生指定变化时,将电平沿发生变化时的计数值放入TIEMR_CAP寄存器中,同时产生捕获pending,并计数值归零再计数

  • 当信号电平发生变化时,计数模式不会产生pending,而捕获模式会产生捕获Pending

暂停功能

  • 当TIMER_CTL.PAUSE置位,计数器暂停计数。TIMER_CTL.PAUSE复位,接着暂停的计数值计数

  • 注意,当为捕获模式时,计数器会暂停计数,但外部信号发生电平变化,且变化是捕获事件,则会产生捕获pending

重计数功能

  • 当向写TIMER_CTL.RESTART比特写1,计数器会清零,重新计数。

注意

  • 当TIMER正在工作,即通道TIMER_CTL.RUN比特置位时,不要修改 CTL,LEN寄存器的值,否则修改不但不会生效,计数还会产生错误,只有当计数停下,即TIMER_CTL.RUN复位,才可修改他们的值

API说明

定时器的控制参数并非都可以再API中配置,API不可配置将使用固定值

  • 计数方向都使用自增计数

  • 捕获寄存器的最高位表示极性

简介

enum timer_source_clk_t

TIMER通道时钟源

  • TIMER_Clock_SYSCLK: 系统时钟

  • TIMER_Clock_OSCPMU: 32kHz

  • TIMER_Clock_OSCAUDIO: 49.152MHz

  • TIMER_Clock_OSCCORE: corepll时钟

  • TIMER_Clock_EXTCLK: 外部输入时钟

enum timer_mode_t

TIMER通道工作模式

  • TIMER_Timer_Single_Mode: 单次计时模式

  • TIMER_Timer_Circular_Mode: 循环计时模式

  • TIMER_Counter_Single_Mode: 单次计数模式

  • TIMER_Counter_Circular_Mode: 循环计数模式

  • TIMER_Capture_Single_Mode: 单次捕获模式

  • TIMER_Capture_Circular_Mode: 循环捕获模式

说明

  1. 单次模式是指,计数溢出pending,或达到捕获pending后,停止计数;

  2. 循环模式是指,计数溢出pending,或达到捕获pending后,计数值归零,重新计数,如此往复,直至软件复位TIEMR_CTL.RUN,及调用函数timer_abort(chx)

  3. 计时,计数,捕获模式详细看功能 功能描述及使用

enum timer_trigger_t

TIMER模式外部信号触发

计数模式和捕获模式时可选择

  • TIMER_Rise_Edge: 上升沿

  • TIMER_Fall_Edge: 下降沿

  • TIMER_Both_Edge: 双边沿

  • TIMER_Rise_Fall: 双边沿之 上升沿到下降沿,只有捕获模式有效

  • TIMER_Fall_Rise: 双边沿之 下降沿到上升沿,只有捕获模式有效

计时模式时选择

  • TIMER_Free_Run: 不受触发信号影响计时

  • TIMER_High_Level: 触发信号高时计时

  • TIMER_Low_Level: 触发信号低时计时

说明

  1. IMER_Rise_Fall和TIMER_Fall_Rise只有捕获模式有效

  2. 在计数模式,事件可选TIMER_Rise_Edge、TIMER_Fall_Edge、TIMER_Both_Edge即上升沿、下降沿、双边沿触发一次计数。

  3. 在捕获模式,可选TIMER_Rise_Edge,TIMER_Fall_Edge、TIMER_Both_Edge、TIMER_Rise_Fall、TIMER_Fall_Rise即,上升沿、下降沿、双边沿触发捕获,TIMER_Rise_Fall表示捕获上升沿到下降沿、TIMER_Fall_Rise表示捕获下降沿到上升沿。

  4. 在计时模式,可选TIMER_Free_Run、TIMER_High_Level、TIMER_Low_Level 即不受信号控制一直计数,高电平计数,下降沿计数。

enum timer_debounce_t

输入信号消抖时间

  • TIMER_Debounce_0CYCLE:

  • TIMER_Debounce_2CYCLE:

  • TIMER_Debounce_4CYCLE:

  • TIMER_Debounce_8CYCLE:

  • TIMER_Debounce_16CYCLE:

  • TIMER_Debounce_32CYCLE:

  • TIMER_Debounce_64CYCLE:

  • TIMER_Debounce_128CYCLE:

说明

  1. 消抖的时间单位为通道工作时钟频率

  2. 当电平变化小于消抖时间,消抖时间内电平的变化将被忽略

enum timer_it_type_t

中断类型

  • TIMER_Overflow_IT:

  • TIMER_Capture_IT:

说明

  1. TIMER_Overflow_IT指三种模式下,计数器计数值达到设定计数值产生的中断

  2. TIMER_Capture_IT 指捕获模式下,外部输入信号满足触发条件产生的中断

  3. 无论中断是否使能,都不影响pending的产生,只影响中断服务函数的进入

  4. 通过判断TIMER_Capture_IT的pending是否置位,判断捕获事件是否发生

  5. 同一通道的TIMER_Overflow_IT中断服务函数timerX_irq_entry(),TIMER_Capture_IT为另一中断服务函数captureX_irq_entry()。不同通道的服务函数不为同一个。

  6. 在捕获模式中,若捕获事件之间的时间小于设定溢出值对应的时间,将不会触发溢出pending,因为在捕获事件时就将计数值清零

enum timer_capture_start_t

捕获模式第一次启动计数方式

  • TIMER_Capture_Start_Software: 调用timer_start()捕获计数开始

  • TIMER_Capture_Start_Event: 调用timer_start()后,第一个触发事件后捕获计数开始

说明

  1. 只在捕获模式有效,指定捕获模式第一次开始的时机。

enum timer_init_parameter_t

定时器通道初始化参数

  • mode: TIMER工作模式,参数timer_mode_t

  • trigger_pin: 触发信号输入脚,范围0-31,其中29 timer0_run,30 timer1_run,31 dbio_o[0]

  • trigger_pin_debounce: 触发信号输入脚debounce时间,参数timer_debounce_t

  • trigger_type: 触发信号方式,参数timer_trigger_t

  • pridiv: 触发信号分频,参数1-32

  • counter: 计数溢出值1-0xffff

说明

  1. counter指定计数器计数到设定值,产生溢出pending,在三种模式都有效

  2. pridiv指定计数器计数分频,即当计数事件次数达到分频设定值,计数值才加一

enum timer_state_t

TIMER运行状态

  • TIMER_State_Inited: 初始状态,timer_init()或timer_abort()函数进入该状态

  • TIMER_State_Reset: 复位状态,timer_deinit()函数进入该函数

  • TIMER_State_Running: 运行状态,timer_start(),timer_restart()或timer_resume()函数进入该状态

  • TIMER_State_Paused: 暂停状态,dma_pause()函数进入该状态

说明

  1. TIMER通道运行状态由四种状态组成,每个状态由特定函数进入,在指定状态只能调用指定函数,否则调用无效,甚至使搬运出错。影响状态函数共6个,各状态下状态函数调用说明

../../_images/kiwi-timer-api-state.jpg ../../_images/kiwi-timer-api-state-t.png
void timer_clock_set(uint32_t chx, timer_source_clk_t source_clk)

TIMER通道时钟设置

参数
  • chx – TIMER通道号,参数范围0-1

  • source_clk – source_clk可选时钟源,参数选timer_source_clk_t

返回

void timer_init(uint32_t chx, timer_init_parameter_t *timer_init_param)

根据timer_init_parameter_t 参数初始化通道

参数
  • chx – TIMER通道号,参数范围0-1

  • timer_init_param – dma_init_parameter_t结构体指针

返回

Note

调用该函数后,TIEMR通道状态进入初始态TIMER_State_Inited

void timer_deinit(uint32_t chx)

TIMER通道去初始化

参数
  • chx – TIMER通道号,参数范围0-1

返回

Note

调用该函数后,TIMER通道状态进入复位态TIMER_State_Reset

void timer_start(uint32_t chx)

TIMNER通道开始运行

参数
  • chx – TIMER通道号,参数范围0-1

返回

Note

调用该函数后,TIMER通道状态进入运行态TIMER_State_Running

void timer_restart(uint32_t chx)

TIMER通道重新开始计数

参数
  • chx – TIMER通道号,参数范围0-1

返回

Note

调用该函数后,状态不变,计数值清零

void timer_pause(uint32_t chx)

TIMER通道停止运行

参数
  • chx – TIMER通道号,参数范围0-1

返回

Note

调用该函数后,TIMER通道状态进入暂停态TIMER_State_Paused

Note

捕获模式下暂停,当捕获事件到达,仍会产生捕获pending,但捕获值为暂停时的值

void timer_resume(uint32_t chx)

TIMER通道恢复运行,恢复由timer_pause()暂停的通道

参数
  • chx – TIMER通道号,参数范围0-1

返回

Note

调用该函数后,TIMER通道状态进入运行态TIMER_State_Running

void timer_abort(uint32_t chx)

TIMER通道运行终止

参数
  • chx – TIMER通道号,参数范围0-1

返回

Note

调用该函数后,TIMER通道状态进入初始态TIMER_State_Inited

timer_state_t timer_get_state(uint32_t chx)

获取TIMER通道状态

参数
  • chx – TIMER通道号,参数范围0-1

返回

通道当前状态

Retval

timer_state_t

Note

详细参看 timer_state_t 说明

void timer_set_counter(uint32_t chx, uint32_t counter)

设置TIMER通道计数溢出值

参数
  • chx – TIMER通道号,参数范围0-1

  • counter – 计数溢出值,范围0xffff

返回

uint32_t timer_get_counter(uint32_t chx)

获取TIMER通道设置计数溢出值

参数
  • chx – TIMER通道号,参数范围0-1

返回

计数溢出值

Retval

uint32_t

uint32_t timer_get_capture(uint32_t chx)

获取TIMER通道当前捕获值

参数
  • chx – TIMER通道号,参数范围0-1

返回

当前补捕获值

Retval

uint32_t

Note

在通道对应的捕获pending即寄存器PD.CaptureX比特置位时更新

void timer_capture_set_start_type(uint32_t chx, timer_capture_start_t start_type)

设置TIMER通道捕获模式开始方式

参数
  • chx – TIMER通道号,参数范围0-1

  • tart_type

    开始捕获方式,参数timer_capture_start_t

    • TIMER_Capture_Start_Software: 当timer_start调用,捕获计数开始

    • TIMER_Capture_Start_Event: 当timer_start调用后,等到第一个捕获事件达到开始计数

返回

Note

只有捕获模式有效

void timer_irq_enable(uint32_t chx, timer_it_type_t it_type)

TIMER通道中断使能

参数
  • chx – TIMER通道号,参数范围0-1

  • it_type

    中断类型

    • TIMER_Overflow_IT: 计数值溢出中断

    • TIMER_Capture_IT: 捕获模式事件发生中断

返回

Note

中断使能只影响中断服务函数进入,不影响pending的产生

void timer_irq_disable(uint32_t chx, timer_it_type_t it_type)

TIMER通道中断失能

参数
  • chx – TIMER通道号,参数范围0-1

  • it_type

    中断类型

    • TIMER_Overflow_IT: 计数值溢出中断

    • TIMER_Capture_IT: 捕获模式事件发生中断

返回

Note

中断失能只影响中断服务函数进入,不影响pending的产生

soc_set_t timer_irq_get_flag(uint32_t chx, timer_it_type_t it_type)

获取TIMER通道中断pending状态

参数
  • chx – TIMER通道号,参数范围0-1

  • it_type

    中断类型

    • TIMER_Overflow_IT: 计数值溢出中断

    • TIMER_Capture_IT: 捕获模式事件发生中断

返回

中断状态

返回值
  • Set – 对应中断pending置位

  • Reset – 对用中断pending未置位

void timer_irq_clear_flag(uint32_t chx, timer_it_type_t it_type)

TIMER通道中断pending状态清除

参数
  • chx – TIMER通道号,参数范围0-1

  • it_type

    中断类型

    • TIMER_Overflow_IT: 计数值溢出中断

    • TIMER_Capture_IT: 捕获模式事件发生中断

返回

void timer_capture_dma_enable(uint32_t chx)

TIMER通道捕获模式DMA请求使能,指定DMA的请求源

参数
  • chx – TIMER通道号,参数范围0-1

返回

使用

中断方式

  1. 调用函数timer_get_state(chx)确定timer通道是否在运行,若在运行,调用timer_abort(chx)停止通道或更换通道;

  2. 调用timer_clock_set(chx,source_clk)设置通道工作时钟

  3. 调用timer_deinit(chx)去初始化,主要为了清除上一次通道为清除的pending和关闭中断。再调用timer_init(chx,param_addr)初始化通道

  4. 调用函数timer_irq_enable(chx,intype)使能中断

  5. 调用函数timer_start(chx)启动计数

  6. 中断服务函数中,调用timer_irq_get_flag(chx,it_type)确定对应通道中断的产生

  7. 若对应中断置位,调用函数timer_irq_chear_flag(chx,it_type),清除pending,否则中断服务函数退出后会立刻再次进入。

../../_images/kiwi-timer-api-use.jpg

寄存器定义

CLk

../../_images/kiwi-reg-timer-clk.png

IE

../../_images/kiwi-reg-timer-ie.png

PD

../../_images/kiwi-reg-timer-pd.png

CTL

../../_images/kiwi-reg-timer-ctl-1.png ../../_images/kiwi-reg-timer-ctl-2.png

LEN

../../_images/kiwi-reg-timer-len.png

VAL

../../_images/kiwi-reg-timer-val.png

CAP

../../_images/kiwi-reg-timer-cap.png