0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32定时器操作讲解——输入捕获

jf_pJlTbmA9 来源:武汉芯源半导体 作者:武汉芯源半导体 2023-09-27 16:06 次阅读

CW32系列MCU的GTIM、ATIM的每个定时器都带有至少4路独立的捕获 / 比较通道,输入捕获功能可以测量输入信号的脉冲宽度或者频率。当捕获比较通道 CHy 上信号发生跳变(上升沿或下降沿)时,硬件自动将当前计数寄存器 GTIMx_CNT 的值存放到对应通道的比较捕获寄存器 GTIMx_CCRy 中,完成一次捕获。通过连续几次捕获即可完成信号脉冲宽度或者频率的测量。

功能框图如下图所示:

wKgZomUDzUaAV_qQAABYvDx4qpM254.png

各个通道上触发捕获的条件由比较捕获控制寄存器 GTIMx_CMMR 决定。

wKgaomUDzUeAAbnrAAClCxzLx7U763.png

当发生一次捕获时,通道 CHy 比较捕获中断标志 GTIMx_ISR.CCy 被硬件置位,如果允许中断 ( 设置中断使能寄 存器 GTIMx_IER.CCy 为 1),CPU 将响应中断服务程序。退出中断服务程序之前,应设置中断标志清除寄存器 GTIMx_ICR.CCy 为 0 以清除该标志。

输入捕获来源

GTIM 的输入捕获来源可以是外部 GTIMx_CHy 引脚,也可以是片内其它外设,通过通用定时器输入捕获来源配置寄存器 SYSCTRL_GTIMxCAP 进行配置。当 SYSCTRL_GTIMxCAP.CHy 为 0x00 时,输入捕获信号的外部输入端口由 GPIO 复用功能寄存器 (GPIOx_AFRH 和 GPIOx_AFRL) 进行配置。当 SYSCTRL_GTIMxCAP.CHy 为 0x01 ~ 0x07 时,输入捕获信号来自片内其它外设,如下表所示:

wKgZomUDzUmAXMGQAAG5XAd63dQ385.png

这种配置下,可以在芯片内部实现外部输入的互联,例如将 UART 的 RXD 信号作为输入捕获来源,可以实现对 UART 波特率的自动检测。

实例演示:利用GTIM的输入捕获功能,测量PWM信号的周期和脉宽

1.初始化系统时钟

void RCC_Configuration(void)

{

__RCC_GTIM1_CLK_ENABLE();

__RCC_GPIOA_CLK_ENABLE();

RCC_HSI_Enable(RCC_HSIOSC_DIV6);

// 系统时钟设置为HSI,6分频,8MHz, PCLK、HCLK不分频, PCLK=HCLK=SysClk=8MHz

}

2.初始化GPIO

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

GPIO_InitStruct.IT = GPIO_IT_NONE;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pins = GPIO_PIN_6 | GPIO_PIN_7;

GPIO_Init(CW_GPIOA, GPIO_InitStruct);

PA06_AFx_GTIM1CH1();//设置PA06复用为GTIM1_CH1, 上升沿触发捕获

PA07_AFx_GTIM1CH2();//设置PA07复用为GTIM1_CH2,下降沿触发捕获。

}

3.配置中断服务程序

void NVIC_Configuration(void)

{

__disable_irq();

NVIC_EnableIRQ(GTIM1_IRQn);

__enable_irq();

}

4.GTIM1中断服务程序:通道1的输入捕获中断获取计数值VALUE1,通道2的输入捕获中断获取计数值VALUE2,通道1的第2次输入捕获中断获取计数值VALUE3。则信号脉宽=VALUE2-VALUE1,信号周期=VALUE3-VALUE1。注意如果待测量信号的脉宽和周期较长,在计算时需要考虑定时器的溢出问题,详见定时器溢出中断处理内容。

void GTIM1_IRQHandler(void)

{

GTIM1_IRQHandlerCallBack();

}

void GTIM1_IRQHandlerCallBack(void)

{

static uint8_t stage = 0;

static uint32_t cnt = 0;

if (GTIM_GetITStatus(CW_GTIM1, GTIM_IT_OV))

{

GTIM_ClearITPendingBit(CW_GTIM1, GTIM_IT_OV);

if (stage == 1)

{

cnt++;

}

}

if (GTIM_GetITStatus(CW_GTIM1, GTIM_IT_CC1))

{

if (stage == 0)

{

PWMPeriod = GTIM_GetCapture1(CW_GTIM1);

stage = 1;

}

else if (stage == 1)

{

PWMPeriod = GTIM_GetCapture1(CW_GTIM1) + cnt * 65536 - PWMPeriod;

stage = 0;

cnt = 0;

}

GTIM_ClearITPendingBit(CW_GTIM1, GTIM_IT_CC1);

}

if (GTIM_GetITStatus(CW_GTIM1, GTIM_IT_CC2))

{

if (stage == 1)

{

PWMWidth = GTIM_GetCapture2(CW_GTIM1) + cnt * 65536 - PWMPeriod;

}

GTIM_ClearITPendingBit(CW_GTIM1, GTIM_IT_CC2);

}

}

5.主程序:使用GTIM1的CH1和CH2两个通道对PWM输入信号进行测量,在捕获中断服务程序中完成信号的周期和脉宽计算。

static uint32_t PWMPeriod = 0;

static uint32_t PWMWidth = 0;

int32_t main(void)

{

RCC_Configuration();//System Clocks Configuration

GPIO_Configuration();//GPIO Configuration

NVIC_Configuration();//NVIC Configuration

GTIM_InitTypeDef GTIM_InitStruct = {0};

GTIM_ICInitTypeDef GTIM_ICInitStruct = {0};

GTIM_InitStruct.Mode = GTIM_MODE_TIME; /*!< GTIM的模式选择。*/

GTIM_InitStruct.OneShotMode = GTIM_COUNT_CONTINUE;

/*!< GTIM的单次/连续计数模式选择。*/

GTIM_InitStruct.Prescaler = GTIM_PRESCALER_DIV1; /*!< GTIM的预分频系数。*/

GTIM_InitStruct.ReloadValue = 0xFFFF; /*!< GTIM的重载值。*/

GTIM_InitStruct.ToggleOutState = DISABLE;

GTIM_TimeBaseInit(CW_GTIM1, GTIM_InitStruct); //GTIM的基础参数初始化

GTIM_ICInitStruct.CHx = GTIM_CHANNEL1;// GTIM 输入捕获的配置参数

GTIM_ICInitStruct.ICFilter = GTIM_CHx_FILTER_NONE;

GTIM_ICInitStruct.ICInvert = GTIM_CHx_INVERT_ON;

GTIM_ICInitStruct.ICPolarity = GTIM_ICPolarity_Rising;

GTIM_ICInit(CW_GTIM1, GTIM_ICInitStruct);//输入捕获功能初始化

GTIM_ICInitStruct.CHx = GTIM_CHANNEL2;

GTIM_ICInitStruct.ICPolarity = GTIM_ICPolarity_Falling;

GTIM_ICInit(CW_GTIM1, GTIM_ICInitStruct);

GTIM_ITConfig(CW_GTIM1, GTIM_IT_CC1 | GTIM_IT_CC2 | GTIM_IT_OV, ENABLE);

GTIM_Cmd(CW_GTIM1, ENABLE);

while (1)

{

}

}

6.演示说明:

将同一个PWM输入信号引入到PA06和PA07上,运行程序,使用GTIM1的CH1和CH2两个通道对PWM输入信号的脉宽和周期进行测量。

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5363

    浏览量

    121033
  • 定时器
    +关注

    关注

    23

    文章

    3255

    浏览量

    115262
收藏 人收藏

    评论

    相关推荐

    高级定时器PWM输入模式的配置方法

    我们将向大家介绍高级定时器的另一个常见应用——PWM输入模式。在本节课中,我们将先围绕输入捕获模式展开,并重点描述PWM输入模式和涉及的寄存
    的头像 发表于 11-08 16:48 2762次阅读
    高级<b class='flag-5'>定时器</b>PWM<b class='flag-5'>输入</b>模式的配置方法

    定时器的工作方式介绍

    定时器是计算机和嵌入式系统中常见的一种硬件模块,用于实现定时和计数功能。定时器的工作方式通常由一组寄存来控制,这些寄存定义了
    的头像 发表于 07-12 10:29 1104次阅读

    武汉芯源半导体CW32F030K8T7在即热式热水的应用介绍

    捕获/比较通道和3对互补PWM输出,死区时间和灵活的同步功能;四组16位通用定时器;三组16位基本定时器;窗口看门狗定时器;独立看门狗定时器
    发表于 06-06 14:17

    【项目展示】基于CW32的遥控循迹小车

    CW32循迹小车.zip_免费高速下载|百度网盘-分享无限制  一、概述 CW32循迹、遥控小车具有循迹和遥控两种功能,小车的硬件模块由CW32F030C8T6小蓝板、智能小车控制底板、BT04-E
    的头像 发表于 05-31 17:33 1401次阅读
    【项目展示】基于<b class='flag-5'>CW32</b>的遥控循迹小车

    CW32数字电压电流表软件教程-实验四:数码管动态显示

    显示不同的值需要用到CW32定时器功能,在定时器的中断服务程序里面执行显示刷新的动作。有关CW32定时器和中断的相关知识请查看链接:【
    的头像 发表于 05-31 15:23 591次阅读
    <b class='flag-5'>CW32</b>数字电压电流表软件教程-实验四:数码管动态显示

    CW32使用DMA单通道、定时器触发ADC实现了多路AD采集

    本测试样例基于CW32F030C8T6MCU,使用DMA单通道、定时器触发ADC实现了12路AD采集。
    的头像 发表于 05-24 09:29 893次阅读
    <b class='flag-5'>CW32</b>使用DMA单通道、<b class='flag-5'>定时器</b>触发ADC实现了多路AD采集

    STM32的GPIO引脚能同时用作外部中断和定时器输入捕获吗?

    今天突然在项目中想到一种用法,将GPIO的某一个引脚,同时配置外部中断(在中断中做一些逻辑)和复用为定时器输入捕获引脚。 查看GPIO的原理框图,感觉可行。找个机会试试这种用法,于是乎发此贴先与各位讨论一下,说不定哪位童鞋已经
    发表于 05-09 08:22

    如何实现一个软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间
    的头像 发表于 04-29 11:00 733次阅读

    CW32量产烧录工具

    本节主要介绍CW32微控制的烧录CW-Writer,以及与之配合的软件CW-Programmer的使用方法。烧录
    的头像 发表于 04-25 15:22 1491次阅读
    <b class='flag-5'>CW32</b>量产烧录工具

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 2107次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    断电延时定时器指令TOF

    TOF指令用于允许输入端断开后的单一间隔定时。当定时器输入端IN为ON时,TOF的状态位为ON,其常开触点闭合,常闭触点断开,但是定时器
    的头像 发表于 04-01 11:40 3255次阅读
    断电延时<b class='flag-5'>定时器</b>指令TOF

    ​PLC保持型通电延时定时器TONR

    TONR指令用于积累许多时间间隔。当定时器输入端IN为ON时,定时器开始计时,当定时器的当前值大于等于设定值时,定时器被置位,其常开触点闭
    发表于 03-31 09:13 1206次阅读
    ​PLC保持型通电延时<b class='flag-5'>定时器</b>TONR

    如果STM32定时器外接了正交编码,该剩余通道是否能做PWM输出呢?

    其实,对于STM32芯片,编码输入信号就是定时器的计数时钟源之一。定时器外接了编码输入,若还有剩余通道的话,剩余通道依然可以实现输入
    的头像 发表于 03-21 09:06 1971次阅读
    如果STM32<b class='flag-5'>定时器</b>外接了正交编码<b class='flag-5'>器</b>,该剩余通道是否能做PWM输出呢?

    使用555定时器的可调双定时器电路

    定时器 IC 555 是最通用和最常用的 IC 之一,因为它的应用范围更广,如 PWM放大器、延迟定时器、开关电路、占空比选择、时钟脉冲发生等。这也可用于各种应用,如精确
    的头像 发表于 02-25 15:16 2393次阅读
    使用555<b class='flag-5'>定时器</b>的可调双<b class='flag-5'>定时器</b>电路

    国产嵌入式教学实验箱操作教程:2-13 定时器控制实验

    独立32位计数及自动重装32位计数,可以产生周期中断DMA事件及外部事件。定时器/计数还可以用于捕获外部
    发表于 02-21 14:09