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

[复制链接]
587|0
 楼主| 聪聪哥哥 发表于 2025-1-14 18:32 | 显示全部楼层 |阅读模式
本帖最后由 聪聪哥哥 于 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.png
三:时钟信号图:
2.png
四:软件编写流程如下:
1:使能定时器时钟。2:初始化定时器,配置ARR,PSC。3:开启定时器中断,配置NVIC。4:使能定时器。5: 编写中断服务函数。
五:软件代码如下所示:
  1.     /* Initialize CFGTMR */
  2.     CFGTMR_Init(CFGTMR0_INSTANCE, &g_cfgtmr0InitConfig, &cfgtmr0State);
  3.     /* Initialize counter */
  4.     CFGTMR_InitCounter(CFGTMR0_INSTANCE, &g_cfgtmr0TimerParamConfig);   
  5.     /* Start Counter */
  6.     CFGTMR_StartCounter(CFGTMR0_INSTANCE);
  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] Starts the CFGTMR counter.
  3. *
  4. * @param ins: CFGTMR instance number
  5. *
  6. * @retval Status code.
  7. */
  8. STATUS_T CFGTMR_StartCounter(uint32_t ins)
  9. {
  10.     CFGTMR_INSTANCE_VALIDITY(ins);
  11.     CFGTMR_T *cfgtmrBaseAddress = g_cfgtmrBaseAddress[ins];
  12.     const CFGTMR_STATE_T *cfgtmrStatus = g_cfgtmrStatusPtr[ins];
  13.     STATUS_T returnStatus = STATUS_SUCCESS;
  14.     /* Check the clock source is available for CFGTMR counter */
  15.     if(cfgtmrStatus->cfgtmrClkSrcFreq > 0U)
  16.     {
  17.         /* Enable counter clock */
  18.         CFGTMR_HW_ConfigClockSource(cfgtmrBaseAddress, cfgtmrStatus->cfgtmrClkSrc);
  19.     }
  20.     else
  21.     {
  22.         returnStatus = STATUS_ERROR;
  23.     }
  24.     return returnStatus;
  25. }


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

  11.     if (CFGTMR_ReadStatusFlags(CFGTMR0_INSTANCE) & CFGTMR_TIME_OVERFLOW_FLAG)
  12.     {
  13.         if (++cnt == 200U)
  14.         {
  15. //            printf("CFGTMR timer 1000ms!\r\n");
  16.             LED_Toggle(LED_GREEN);
  17.             cnt = 0;
  18.         }
  19.     }
  20.     CFGTMR_ClearStatusFlags(CFGTMR0_INSTANCE, (uint32_t)CFGTMR_TIME_OVERFLOW_FLAG);
  21. }
实现现象:使用定时器2完成板载绿色 LED闪烁的情况。
WeChat_20250114182813 00_00_00-00_00_30.gif

您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

307

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部