打印
[G32A]

极海G32A1465汽车通用MCU评估板测试03:定时器学习调试(CFGTMR)

[复制链接]
29|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 聪聪哥哥 于 2025-1-14 18:35 编辑

今天和大家分享一下,极海G32A开发板的可配置的定时器(CFGTMR)的相关知识。定时器是cpu的一个不可或缺的外部定时器,由于定时器的功能比较多,真正学会定时器的运用还是需要花费一定的时间、精力的。记得当初自己刚刚接触定时器的时候,学到32定时器的时候,对自己的打击非常大,当时都想要放弃了,主要是这一部分的知识复杂太多了,不过在经过一段时间的,比之前要方便很多了,之前的基本的使用标准库学习,出现了问题也不知道该如何解决,这里和大家分享一下,极海定时器的学习经历。
简介:CFGTMR 模块是一种用于控制电机和电源管理应用的定时器模块,具有 2-8通道,它支持输入捕获、输出比较和 PWM 信号的生成。CFGTMR 模块的时间参考是一个可以用作有符号或无符号的 16位计数器。
1>基本特征:
时基单元:计数器:16 位计数器,可以向上计数,中心对齐计数-可以自由运行,也可以具有初始值和最终值
     预分频器:支持 1、2、4、8、16、32、64 或 128 分频
2>时钟源选择:
1:源时钟可以作为外部时钟;2:固定频率时钟或者 CFGTMR 的输入时钟固定频率时钟;3:除了 CFGTMR输入时钟外的片上时钟源外部输入
3>输入捕获模式
捕获
上升沿
下降沿
上升沿和下降沿
部分通道可选择输入滤波器输入捕获模式测试
4>输出比较模式
输出信号可以在匹配时被设置、清除或切换
5>每个通道可配置为输入捕获、输出比较或边沿对齐 PWM 模式,所有通道都可配置为中心对齐 PWM 模式
6>每对通道可以组合生成 PWM 信号,并独立控制 PWM 信号的两个边沿
7>互补通道具有死区时间插入功能
8>软件控制 PWM 输出
9>可配置每个通道的极性
10>CFGTMR 通道操作方式
作为具有相等输出的成对通道
作为具有互补输出的成对通道
作为具有独立输出的独立通道
11>生成匹配触发器
12>中断可以由每个通道单独产生
13>产生中断
计数器溢出时
检测到故障情况时
发生寄存器重新加载点时
14>对写入缓冲 CFGTMR 寄存器进行同步加载操作
15>对于全局故障控制,不能超过4个故障输入
16>关键寄存器写入保护功能
17>可重新加载计数功能
全周期寄存器重新加载容量半周期寄存器重新加载容量
18> 具有模拟 PWM 周期或 PWM 占空比的精细边缘控制的抖动能力
19>可直接读取输入引脚状态
20> 可将 CFGTMR 通道配置为生成触发脉冲信号,而不是PWM 信号
能够与之前 TPM 版本兼容
22>正交解码器,具有输入滤波器、相对位置计数、位置计数中断或外部事件位置计数捕获
23>支持对脉冲和周期宽度测量的双边沿捕获功能
二:结构框图如下所示:

三:时钟信号图:

四:软件编写流程如下:
1:使能定时器时钟。2:初始化定时器,配置ARR,PSC。3:开启定时器中断,配置NVIC。4:使能定时器。5: 编写中断服务函数。
五:软件代码如下所示:
    /* Initialize CFGTMR */
    CFGTMR_Init(CFGTMR0_INSTANCE, &g_cfgtmr0InitConfig, &cfgtmr0State);
    /* Initialize counter */
    CFGTMR_InitCounter(CFGTMR0_INSTANCE, &g_cfgtmr0TimerParamConfig);   
    /* Start Counter */
    CFGTMR_StartCounter(CFGTMR0_INSTANCE);
/*!
* [url=home.php?mod=space&uid=247401]@brief[/url] Starts the CFGTMR counter.
*
* @param ins: CFGTMR instance number
*
* @retval Status code.
*/
STATUS_T CFGTMR_StartCounter(uint32_t ins)
{
    CFGTMR_INSTANCE_VALIDITY(ins);
    CFGTMR_T *cfgtmrBaseAddress = g_cfgtmrBaseAddress[ins];
    const CFGTMR_STATE_T *cfgtmrStatus = g_cfgtmrStatusPtr[ins];
    STATUS_T returnStatus = STATUS_SUCCESS;
    /* Check the clock source is available for CFGTMR counter */
    if(cfgtmrStatus->cfgtmrClkSrcFreq > 0U)
    {
        /* Enable counter clock */
        CFGTMR_HW_ConfigClockSource(cfgtmrBaseAddress, cfgtmrStatus->cfgtmrClkSrc);
    }
    else
    {
        returnStatus = STATUS_ERROR;
    }
    return returnStatus;
}


在定时器中断中增加对GPIO口的中断处理部分
/*!
* [url=home.php?mod=space&uid=247401]@brief[/url]   CFGTMR0 Counter overflow and Reload IRQ handler.
*
* @param   None
*
* @retval  None
*/
void CFGTMR0_Ovf_Reload_IRQHandler(void)
{
    static uint32_t cnt = 0;

    if (CFGTMR_ReadStatusFlags(CFGTMR0_INSTANCE) & CFGTMR_TIME_OVERFLOW_FLAG)
    {
        if (++cnt == 200U)
        {
//            printf("CFGTMR timer 1000ms!\r\n");
            LED_Toggle(LED_GREEN);
            cnt = 0;
        }
    }
    CFGTMR_ClearStatusFlags(CFGTMR0_INSTANCE, (uint32_t)CFGTMR_TIME_OVERFLOW_FLAG);
}
实现现象:使用定时器2完成板载绿色 LED闪烁的情况。


使用特权

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

本版积分规则

47

主题

117

帖子

0

粉丝