cw32系列mcu的gtim、atim的每个定时器都带有至少4路独立的捕获 / 比较通道,输入捕获功能可以测量输入信号的脉冲宽度或者频率。当捕获比较通道 chy 上信号发生跳变(上升沿或下降沿)时,硬件自动将当前计数寄存器 gtimx_cnt 的值存放到对应通道的比较捕获寄存器 gtimx_ccry 中,完成一次捕获。通过连续几次捕获即可完成信号脉冲宽度或者频率的测量。
功能框图如下图所示:
各个通道上触发捕获的条件由比较捕获控制寄存器 gtimx_cmmr 决定。
当发生一次捕获时,通道 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 时,输入捕获信号来自片内其它外设,如下表所示:
这种配置下,可以在芯片内部实现外部输入的互联,例如将 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输入信号的脉宽和周期进行测量。
来源:武汉芯源半导体
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理
facebook:如何以3D动画的形式将一段音频转化为演奏时的肢体动作
基于PCI Express的EtherCAT总线运动控制卡XPCIE1032
数字万用表|IGBT模块的检测方法
越来越多的电机制造商使用激光焊锡技术
可携式产品电磁干扰滤波解决方案详细过程
CW32定时器操作讲解——输入捕获
《使命召唤》大逃杀模式 华硕X570主板助你逃出生天
重金属镉快速检测仪的应用领域有哪些
褪去黑科技光环 人工智能将还要多久才能真正落地
政府与半导体间的“美国往事”
工业互联网标识解析体系的发展趋势
秒充不是梦,便携式设备快速充电设计方案
基于rfPIC12F675芯片实现环形天线的设计
华硕服务器及工作站主板于SPEC标准评测获最佳成绩
智慧畜牧解决方案应用
sql语句多个条件怎么连接
Exelis为“Gorgon Stare计划”提供五个额外的红外传感系统
LG将在4K和8K智能电视上采用最新webOS 6.0系统
小新Pro 13推最新BIOS,新功能可实现智能动态分配
小米VR眼镜评测:东西不错但支持的设备太少