打印
[CW32F030系列]

CW32F030C8T6基本定时器BTIM详解与应用

[复制链接]
56|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一.基本定时器(BTIM)
1.1概述

CW32x030 内部集成 3 个基本定时器 (BTIM),每个 BTIM 完全独立且功能完全相同,各包含一个 16bit 自动重装 载计数器并由一个可编程预分频器驱动。BTIM 支持定时器模式、计数器模式、触发启动模式和门控模式 4 种工 作模式,支持溢出事件触发中断请求和 DMA 请求。得益于对触发信号的精细处理设计,使得 BTIM 可以由硬件自 动执行触发信号的滤波操作,还能令触发事件产生中断和 DMA 请求。
1.2主要特性

16bit 自动重载向上计数器
可编程预分频器支持 1、2、4、8、…、32768 分频
支持单次计数模式和连续计数模式
对内部 ITR 或外部 ETR 信号的计数功能
内部 ITR 或外部 ETR 信号触发启动计数
由外部 ETR 输入信号控制的门控功能
灵活的外部 ETR 信号滤波处理
溢出事件触发数字输出电平翻转
内部级联 ITR 和外部互联 ETR
计数器溢出触发中断 /DMA 请求
内部 ITR 或外部 ETR 信号触发中断 /DMA 请求
1.3功能框图



1.4 滤波单元

BTIM 支持对外部 BTIM_ETR 引脚输入的信号进行滤波处理。滤波器以一定的采样频率对 ETR 信号进行采样,当 连续采样到 N 个相同电平时信号有效,否则信号无效,以此滤除高频杂波信号。

滤波单元的采样时钟为 PCLK 或 PCLK 的分频,通过高级控制寄存器 BTIMx_ACR 的 ETRFLT 位域可以选择 PCLK 的分频比及采样点个数 N。

注:

        由于硬件是以 PCLK 时钟或 PCLK 时钟的分频对外部 BTIM_ETR 引脚输入的信号进行采样的,因此频率高于 实际采样频率二分之一的输入信号存在被漏采样的可能。

下面举例说明 BTIMx_ACR.ETRFLT 的配置和截止频率的关系。

例:

        当 PCLK 时钟频率为 24MHz 时,设置 BTIMx_ACR.ETRFLT 为 0x05

                                        (即 Fsample = PCLK / 4 且 N = 6)

        则 Fsample = 6MHz,N = 6 连续采样到 6 个有效电平,

                                         需要的时间为: 6×Tsample = 1μs

               因此,0.5MHz 频率以上的输入信号将被滤除。

1.5 极性选择单元

当 BTIM 配置为门控模式时,极性选择单元用来选择外部 BTIM_ETR 引脚输入的信号是高电平有效还是低电平有 效,具体通过基本控制寄存器 BTIMx_BCR 的 POL 位域来选择。

当设置 BTIMx_BCR.POL 为 0 时,ETR 信号为高电平时有效;当设置 BTIMx_BCR.POL 为 1 时,ETR 信号为低电 平时有效。

1.6边沿检测单元

当 BTIM 配置为触发启动模式时,边沿检测单元用来选择外部 BTIM_ETR 引脚输入的信号的边沿触发时机,具体 通过基本控制寄存器 BTIMx_BCR 的 POL 位域来选择。

当设置 BTIMx_BCR.POL 为 0 时,ETR 信号为上升沿时有效;当设置 BTIMx_BCR.POL 为 1 时,ETR 信号为下降 沿时有效。

1.7预分频器

预分频器以 2 的倍数为系数对计数器时钟源 TCLK 分频,最大分频系数为 32768。预分频系数由基本控制寄存器 BTIMx_BCR 的 PRS 位域配置,分频系数配置如下表所示:



在定时器运行过程中允许修改 BTIMx_BCR.PRS,但新的预分频系数不会立即生效,当定时器发生计数溢出或者 运行控制位 BTIMx_BCR.EN 由 0 变为 1 时,新的预分频系数生效。

在运行过程中改变预分频系数示例如下图所示:



1.8计数单元

计数单元的核心组件是一个 16bit 向上计数器 CNT 和一个 16bit 自动重载寄存器 ARR。

在定时器运行过程中允许修改重载寄存器 ARR,且 ARR 的值将立即生效。当计数器 CNT 的值小于 ARR 的值时, 将当前的 ARR 值修改为小于当前 CNT 值后,不会产生 ARR 溢出信号 OV,计数器 CNT 将一直向上计数到 0xFFFF 后,产生 TOP 溢出信号,并从 0x0000 重新开始计数。

计数器可工作在单次计数或连续计数模式下,通过基本控制寄存器 BTIMx_BCR 的 ONESHOT 位域来选择。

1.9单次计数模式

设置 BTIMx_BCR.ONESHOT 为 1,使定时器工作在单次计数模式下。设置 BTIMx_BCR.EN 为 1 使能 BTIMx,计 数器 CNT 在计数时钟 TCLKD 的驱动下累加计数。当计数值到达重载值 ARR 后产生溢出信号 OV(溢出信号 OV 保持一个 PCLK 周期,然后自动清除),OV 信号被清除时,计数器 ARR 溢出标志位 BTIMx_ISR.OV 被硬件置位, 同时计数器停止计数,BTIMx_BCR.EN 被硬件自动复位。

下图是单次计数模式示例:



1.10连续计数模式

设置 BTIMx_BCR.ONESHOT 为 0,使定时器工作在连续计数模式下。设置 BTIMx_BCR.EN 为 1 使能 BTIMx,计 数器 CNT 在计数时钟 TCLKD 的驱动下累加计数。当计数值到达重载值 ARR 后产生溢出信号 OV(溢出信号 OV 保持一个 PCLK 周期,然后自动清除)。当计数值从 ARR 变为 0 时,计数器 ARR 溢出标志位 BTIMx_ISR.OV 被硬 件置位,计数器开始下一个周期的累加计数。

下图是连续计数模式示例:



1.11翻转输出单元

翻转输出单元可通过 ARR 溢出信号 OV 控制外部 BTIMx_TOGP 和 BTIMx_TOPN 引脚输出翻转信号。

当设置 BTIMx_BCR.TOGEN 为 0 时,BTIMx_TOGP 和 BTIMx_TOPN 引脚均输出低电平。

当设置 BTIMx_BCR.TOGEN 为 1 时,BTIMx_TOGP 和 BTIMx_TOPN 引脚输出电平相反的信号(BTIMx_TOGP 默 认电平为高电平);当计数器 ARR 溢出时 (BTIMx_ISR.OV 为 1),BTIMx_TOGP 和 BTIMx_TOPN 引脚输出电平将 翻转。

下图所示为连续计数模式下,BTIMx_TOGP 和 BTIMx_TOPN 引脚电平翻转输出示意图:



BTIM 支持的 TOGP/TOGN 引脚如下表所示,在应用时需要复用对应的 GPIO 引脚。



1.12工作模式

BTIM 支持 4 种工作模式:定时器模式、计数器模式、触发启动模式和门控模式。通过基本控制寄存器 BTIMx_BCR 的 MODE 位域来配置。



1.13定时器模式

定时器模式主要用于产生固定时间间隔的时基信号,在该模式下,计数器时钟源为内部系统时钟 PCLK,经预分 频器分频后得到计数时钟 TCLKD,来驱动计数器 CNT 计数。定时器模式功能框图如下图所示:



设置 BTIMx_BCR.MODE 为 0x00,使 BTIMx 工作于定时器模式。设置 BTIMx_BCR.EN 为 1 使能 BTIMx,计数器 CNT 将在计数时钟 TCLKD 的驱动下累加计数。当计数值到达重载值 ARR 后产生溢出,计数器 ARR 溢出标志位 BTIMx_ISR.OV 被硬件置位,如果允许中断 ( 设置中断使能寄存器 BTIMx_IER.OV 为 1),CPU 将响应中断服务程序。 退出中断服务程序之前,应设置中断标志清除寄存器 BTIMx_ICR.OV 为 0 以清除该标志。 在实际应用中,系统时钟 PCLK 的频率是已知的,通过合理设置预分频器系数 PRS 可以对固定时长的时钟进行计 数,配合对重载值 ARR 的设置及计数器 ARR 溢出中断标志位的使用,可以精确获得某一特定时长,从而达到定 时的目地。

定时时间 T 计算公式:

                                                 T = ( 2PRS / PCLK )×( ARR + 1 )

其中,PCLK 为计数器时钟源,PRS 为预分频系数,ARR 为重载值。

例:

当计数器时钟源 PCLK 的频率为 24MHz 时,要求定时 100ms。

如果设置预分频系数 PRS 为 0x08,计算:

                                                T = 100ms = ( 28 / 24MHz )×( ARR + 1 )

则 ARR = 9374 ( 0x249E )

即需要设置重载值 ARR 为 0x249E。

1.14计数器模式

计数器模式主要用于测定某个事件发生的次数,可选择对内部 ITR 或外部 BTIM_ETR 引脚输入的信号进行计数, 具体通过基本控制寄存器 BTIMx_BCR 的 TRS 位域来选择。

当设置 BTIMx_BCR.TRS 为 1 时,计数源为内部 ITR 信号(具体 ITR 来源请参见表 13-4 ITR 来源配置);当设 置 BTIMx_BCR.TRS 为 0 时,计数源为外部 BTIM_ETR 引脚输入的信号,选择该计数源时,可通过 BTIMx_ACR. ETRFLT 配置滤波器,通过 BTIMx_BCR.POL 选择对 ERT 信号的上升沿或下降沿进行计数。 计数器模式功能框图如下图所示:



设置 BTIMx_BCR.MODE 为 0x01,使 BTIMx 工作于计数器模式。设置 BTIMx_BCR.EN 为 1 使能 BTIMx,计数 器 CNT 对分频后的 TCLKD 信号进行累加计数。当计数值到达重载值 ARR 后产生溢出,计数器 ARR 溢出标志位 BTIMx_ISR.OV 被硬件置位,如果允许中断 ( 设置中断使能寄存器 BTIMx_IER.OV 为 1),CPU 将响应中断服务程序。 退出中断服务程序之前,应设置中断标志清除寄存器 BTIMx_ICR.OV 为 0 以清除该标志。

1.15触发启动模式

设置 BTIMx_BCR.MODE 为 0x02,使 BTIMx 工作于触发启动模式。在该模式下,设置 BTIMx_BCR.EN 为 1 或触 发信号有效时,将启动计数器 CNT 对内部时钟 PCLK 经预分频器分频后的 TCLKD 信号进行计数。

触发信号可选择内部 ITR 信号或外部 BTIM_ETR 引脚输入的信号,具体通过基本控制寄存器 BTIMx_BCR 的 TRS 位域来选择。当设置 BTIMx_BCR.TRS 为 1 时,触发源为内部 ITR 信号(具体 ITR 来源请参见表 13-4 ITR 来源配置); 当设置 BTIMx_BCR.TRS 为 0 时,触发源为外部 BTIM_ETR 引脚输入的信号,选择该触发源时,可通过 BTIMx_ ACR.ETRFLT 配置滤波器,通过 BTIMx_BCR.POL 选择 ERT 信号是上升沿或是下降沿有效。



当检测到有效的触发信号时,将产生以下影响:

1. BTIMx_BCR.EN 被硬件置位;

2. 触发标志位 BTIMx_ISR.TI 被硬件置位;

3. 计数器启动,开始计数。

计数器启动后,计数器从初始值开始向上计数,当计数值到达重载值 ARR 后产生溢出,计数器 ARR 溢出标志位 BTIMx_ISR.OV 被硬件置位,如果允许中断 ( 设置中断使能寄存器 BTIMx_IER.OV 为 1),CPU 将响应中断服务程序。 退出中断服务程序之前,应设置中断标志清除寄存器 BTIMx_ICR.OV 为 0 以清除该标志。 在任意时候设置运行控制位 BTIMx_BCR.EN 为 0 后,计数器立即暂停计数。再次设置运行控制位 BTIMx_BCR.EN 为 1 或者触发信号有效时,计数器按前一次的设置继续计数。









二.案例-基本定时器BTIM1以固定的时间间隔产生中断
主函数
BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;  // 定义基本定时器初始化结构体

int32_t main(void)
{
    /* 系统时钟配置(内部HSI振荡器、BTIM1和GPIOB时钟使能) */
    RCC_Configuration();

    /* NVIC中断控制器配置(使能BTIM1中断) */
    NVIC_Configuration();

    /* GPIO配置(PB9设置为推挽输出模式) */
    GPIO_Configuration();

    /* 基本定时器BTIM1初始化 */
    BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER;  // 定时器模式
    BTIM_TimeBaseInitStruct.BTIM_Period = 49999;          // 自动重装载值(ARR)
    BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV8; // 预分频器(PSC=8)
    BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct); // 应用配置

    /* 使能BTIM1溢出中断 */
    BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);

    /* 启动定时器 */
    BTIM_Cmd(CW_BTIM1, ENABLE);

    while (1)
    {
        /* 中断服务程序中通过PB9输出翻转实现LED闪烁 */
    }
}



时钟配置函数
void RCC_Configuration(void)
{
    /* 启用HSI振荡器并6分频 */
    RCC_HSI_Enable(RCC_HSIOSC_DIV6);

    /* 使能BTIM1和GPIOB外设时钟 */
    __RCC_BTIM_CLK_ENABLE();
    __RCC_GPIOB_CLK_ENABLE();
}


GPIO配置函数
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.IT = GPIO_IT_NONE;            // 无中断触发
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   // 推挽输出模式
    GPIO_InitStruct.Pins = GPIO_PIN_9;            // 配置PB9引脚
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;      // 高输出速度
    GPIO_Init(CW_GPIOB, &GPIO_InitStruct);        // 应用配置
}


NVIC配置函数
void NVIC_Configuration(void)
{
    __disable_irq();                   // 全局中断关闭(配置期间防干扰)
    NVIC_EnableIRQ(BTIM1_IRQn);        // 使能BTIM1中断通道
    __enable_irq();                    // 全局中断开启
}


中断服务函数
void BTIM1_IRQHandler(void)
{
    /* 检查BTIM1溢出中断标志 */
    if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
    {
        BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV); // 清除中断标志
        PB09_TOG();  // PB9电平翻转(宏定义实现GPIOB->ODR ^= GPIO_PIN_9)
    }
}


关键点
BTIM_Period = 49999:定时器计数周期,配合72MHz(HSI 6分频)和8分频后,实际频率为:  f= 72MHz/6/8/(49999+1)= 30Hz
BTIM_PRS_DIV8:预分频值,将时钟源频率降低8倍
GPIO_SPEED_HIGH:适用于快速切换的LED控制场景


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_43260261/article/details/149215001



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

200

帖子

0

粉丝