使用QTMER 脉冲输出功能脉冲数多发问题 大家好,我按手册46.7.5.12章的脉冲输出功能 Pulse-Output Mode,按照例程编写代码,用官方的开发板测试,能够发送脉冲,但是我用逻辑分析仪查看脉冲数有时正确,有时会多发一个,不知是什么问题。 请大家指点谢谢。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 您好, 你有没有找出根本问题所在?我的 RT1020 也有非常类似的情况,但我没有使用 Keil。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 Hi,
你这个波形是使用我分享的例程测测试出来的吗?如果不是,请直接下载我的工程用MCUXpresso IDE测试。
Have a great day, TIC
------------------------------------------------------------------------------- Note: - If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored Please open a new thread and refer to the closed one, if you have a related question at a later point in time. ------------------------------------------------------------------------------- Re: 使用QTMER 脉冲输出功能脉冲数多发问题 您有没有发送后在仿真状态下用软件复位在次发送呢?我用KEIL软件复位后再次执行代码就会发送不正确的脉冲数了,给板卡上电后第一次运行代码才能正常发送正确的脉冲数量。 另外你是否方便用keil做一下测试呢?或者看一下我发您的KEIL例程,用这个例程测试一下。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 Hi, 我使用的是MCUXpreeso IDE,因为我的输出是在GPIO_AD_B1_00, MIMXRT1050中J23-6,所以需要对其进行相关的引脚初始化,对应代码在BOARD_InitPins()函数中。 Have a great day, TIC
------------------------------------------------------------------------------- Note: - If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored Please open a new thread and refer to the closed one, if you have a related question at a later point in time. ------------------------------------------------------------------------------- Re: 使用QTMER 脉冲输出功能脉冲数多发问题 我发现代码下载到板卡每次按下板卡复位按键逻辑分析仪能抓到波形,每次按下后抓的波形和数量都是正确的,但是在keil调试状态用软件上的复位后在运行时用逻辑分析仪抓到的脉冲数量就会多一个,您可以试一下。看看什么原因。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 仿真时不出波形,板卡手动复位能抓到波形,但是波形也不对,脉冲数量也不对。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 板卡IMXRT1050-EVKB Re: 使用QTMER 脉冲输出功能脉冲数多发问题 引脚是J23的6 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 /* * 版权所有 2017-2020 NXP * 保留所有权利。 * * SPDX-License-Identifier:BSD-3-Clause */ /******************************************************************************* * 包括 ******************************************************************************/ #include "fsl_debug_console.h" #include "板.h" #include"bsp_tmr.h" //#include"fsl_qtmr.h" #include"pin_mux.h" #include"clock_config.h" /***************************************************** * 定义 ************************************************************//* 用于主板的 QTMR 实例/通道 */ #define BOARD_QTMR_BASEADDR TMR3 #define BOARD_FIRST_QTMR_CHANNEL KQTMR_0 #define BOARD_SECOND_QQNEL_0 BOARD_SECOND_QQNEL_0 kqtmr_CHANNEL kqtmr_channel_1 #define qtmr_clockCounterOutput kqtmr_clockCounter0O ut put /* 所用 QTMR 实例的中断编号和中断处理程序 */ #define QTMR_IRQ_ID TMR3_IRQn #define QTMR_IRQ_HANDLER TMR3_IRQHandler /* Ipg 时钟源的 QTMR 时钟源分频器,以下两个宏的值应对齐。*/ #define QTMR_PRIMARY_SOURCE (kqtmr_clockdivide_128) #define QTMR_CLOCK_SOURCE_DIVIDER (128U) /* 分频后的源时钟频率。 */ #define QTMR_SOURCE_CLOCK (CLOCK_GetFreq(kCLOCK_IpgClk) / QTMR_CLOCK_SOURCE_DIVIDER) /******************************************************************************* * Prototypes ******************************************************************************/ /******************************************************************************* * Variables ******************************************************************************/ volatile bool qtmrIsrFlag = false; /******************************************************************************* * 代码 ******************************************************************************/ void QTMR_IRQ_HANDLER(void) { /* Clear interrupt flag.*/ QTMR_ClearStatusFlags(BOARD_QTMR_BASEADDR, BOARD_SECOND_QTMR_CHANNEL, kQTMR_CompareFlag); qtmrIsrFlag = true; } /*! * @brief Main function */ int main(void) { uint32_t i = 0; qtmr_config_t qtmrConfig; gpio_pin_config_t gpt_config; gpt_config.direction = kGPIO_DigitalOutput; gpt_config.outputLogic = 0; gpt_config.interruptMode= kGPIO_NoIntmode; /* 主板引脚、时钟、调试控制台初始化 */ board_configmpu (); board_initPins (); board_bootclockRun (); board_bootclockRun (); board_initDebugCon GPIO_PinInit(GPIO1, 16,&gpt_config); QTMR_GetDefaultConfig(&qtmrConfig); /* 初始化输入通道。*/ qtmrConfig.primarySource= QTMR_PRIMARY_SOURCE; QTMR_Init(BOARD_QTMR_BASEADDR,BOARD_SECOND_QTMR_CHANNEL,&qtmrConfig); IpFreq=CLOCK_GetFreq(kCLOCK_IpgClk); //PlsueCh0Init(); PulseChxStream_Init(TMR3,TMR3_IRQn,100000,4,1,0,0x0A67); for(i=0;i<100000000;i++); PulseChxStream_Init(TMR3,TMR3_IRQn,100000,4,1,0,0x0A67); for(i=0;i<100000000;i++); PulseChxStream_Init(TMR3,TMR3_IRQn,100000,4,1,0,0x0A67); for(i=0;i<100000000;i++); PulseChxStream_Init(TMR3,TMR3_IRQn,100000,4,1,0,0x0A67); while (1) { } } 我把您的代码移植到qtmr_timer的例程里替换掉源文件,编译下载到板卡仿真,用逻辑分析仪抓取不到波形 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 您使用的是KEIL吗?我的是KEIL5.27,怎么打不开您的功能文件呢? Re: 使用QTMER 脉冲输出功能脉冲数多发问题 Hi, 我根据你分享的代码,修改SDK库中evkbimxrt1050_qtmr_timer代码来实现Pulse-Output Mode,测试下来功能是正常的。 PWM 输出脚为GPIO_AD_B1_00, MIMXRT1050中J23-6.
附件是我的代码。
Have a great day, TIC
------------------------------------------------------------------------------- Note: - If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored Please open a new thread and refer to the closed one, if you have a related question at a later point in time. ------------------------------------------------------------------------------- Re: 使用QTMER 脉冲输出功能脉冲数多发问题 使用的KEIL5.27开发环境 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 分析仪测量GPIO2的Pin6 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 Hi,
请分享完整的代码工程,我用MIMXRT1050 板子测试一下,看看能否复现问题。
Have a great day, TIC
------------------------------------------------------------------------------- Note: - If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored Please open a new thread and refer to the closed one, if you have a related question at a later point in time. ------------------------------------------------------------------------------- Re: 使用QTMER 脉冲输出功能脉冲数多发问题 我是想用这种方式来控制步进电机做角度控制,如果发送的脉冲数量不正确肯定会影响电机转动角度的精度。 我反复测试,感觉是 QTMER通道0在计数比较后没有及时的关闭输出,造成输出通道多发送了一个脉冲。 感觉还是芯片硬件上的问题,我的程序是严格按照手册的示例来做的。您也可以用1052-EVK实际测试一下。 如果你有代码示例,发我,我来用逻辑分析仪测试。 谢谢! Re: 使用QTMER 脉冲输出功能脉冲数多发问题 您好,这种现象不是有规律的发生,有时会发送数量正确,有时就连续发送多次都错误(总是多发1个)。 还有时会发送一次数量是对的,再发一次数量多一个,这样交替。 但是,每次复位芯片后第一次发送数量是对的,在发送一次就不对了。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 Hi,
你所说的多发现象是每次都会发生吗?还是存在固定的比率或发生次序呢?
Have a great day, TIC
------------------------------------------------------------------------------- Note: - If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored Please open a new thread and refer to the closed one, if you have a related question at a later point in time. ------------------------------------------------------------------------------- Re: 使用QTMER 脉冲输出功能脉冲数多发问题 我将LENGTH=0是想发送完毕后读取CNTR中的数值,LENGTH=1后就会在计数完成后CNTR就被预装载了新值,这样就读不到数值了。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 您好:我将LENGTH=1后计数仍然不正确,有时会多发1个脉冲,反复测试脉冲只会多发不会少发。 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 您好, 感谢您对恩智浦半导体产品的关注并有机会为您服务。 在阅读了您的演示代码后,它与 RM 中的代码基本相同(如图所示)。
我发现下面的代码与注释不一致,请仔细检查。
// 定时器3的输出是该定时器的时钟源。
/* TMR1_CTRL: CM=0,PCS=7,SCS=0,ONCE=1,LENGTH=1,DIR=0,COINIT=0,OUTMODE=7 */
TIMx->CHANNEL[OutChanel].CTRL=OutMode; /* 0x0A47 设置模式 TMR3的定时器1作为通道0的时钟源 */
祝您愉快, TIC
------------------------------------------------------------------------------- 注: - 如果本帖回答了您的问题,请点击"标记正确" 按钮。谢谢!
- 我们会在最后一次发帖后的 7 周内跟踪主题,之后的回复将被忽略 如果您以后有相关问题,请另开新主题并参考已关闭的主题。 ------------------------------------------------------------------------------- Re: 使用QTMER 脉冲输出功能脉冲数多发问题 使用的47.6.5.12 Pulse-Output Mode 使用的这个例程 TIMx->CHANNEL[OutChanel].CTRL&=~TMR_CTRL_CM_MASK; /* 复位计数器 */ TIMx->CHANNEL[TimChanel].CTRL&=~TMR_CTRL_CM_MASK; /* 复位定时器 */ //选择IP_bus_clk / 16作为定时器3的时钟源 /* TMR3_CTRL:CM = 0,PCS = 0x0C,SCS = 0,ONCE = 0,LENGTH = 1,DIR = 0,COINIT = 0,OUTMODE = 3 */ // TMR3->CHANNEL[1].COMP1=CLOCK_GetFreq(kCLOCK_IpgClk)/128/Plusefreq; /* (16 * 37500)/ 60e6 = 0.01秒 */ if(Plusefreq<10000) { TIMx->CHANNEL[TimChanel].CTRL=0x1E23; /* 设置模式 */ TIMx->CHANNEL[TimChanel].COMP1=IpFreq/128/(Plusefreq); } else { TIMx->CHANNEL[TimChanel].CTRL=0x1023; /* 设置模式 */ TIMx->CHANNEL[TimChanel].COMP1=IpFreq/1/(Plusefreq); } /* TMR3_SCTRL:TCF = 0,TCFIE = 0,TOF = 0,TOFIE = 0,IEF = 0,IEFIE = 0,IPS = 0,INPUT = 0, 功能说明 Capture_Mode = 0,MSTR = 0,EEOF = 0,VAL = 0,FORCE = 0,OPS = 0,OEN = 0 */ TIMx->CHANNEL[TimChanel].SCTRL=0x00; TIMx->CHANNEL[TimChanel].LOAD=0x00; /* 重置加载寄存器 */ /* TMR3_CSCTRL: DBG_EN=0,FAULT=0,ALT_LOAD=0,ROC=0,TCI=0,UP=0,OFLAG=0, TCF2EN=0,TCF1EN=0,TCF2=0,TCF1=0,CL2=0,CL1=0 */ TIMx->CHANNEL[TimChanel].CSCTRL=0x00; /* 设置比较器控制寄存器 */ // 定时器3的输出是该定时器的时钟源。 /* TMR1_CTRL: CM=0,PCS=7,SCS=0,ONCE=1,LENGTH=1,DIR=0,COINIT=0,OUTMODE=7 */ TIMx->CHANNEL[OutChanel].CTRL=OutMode; /* 0x0A47 设置模式 TMR3的定时器1作为通道0的时钟源 */ /* TMR1_SCTRL: TCF=0,TCFIE=0,TOF=0,TOFIE=0,IEF=0,IEFIE=0,IPS=0,INPUT=0, Capture_Mode=0,MSTR=0,EEOF=0,VAL=0,FORCE=0,OPS=0,OEN=1 */ TIMx->CHANNEL[OutChanel].SCTRL=0x0001; TIMx->CHANNEL[OutChanel].CNTR=0x00; /* 重置计数器寄存器 */ TIMx->CHANNEL[OutChanel].LOAD=0x00; /* 重置加载寄存器 */ TIMx->CHANNEL[OutChanel].COMP1=PluseData; /* 设置比较1个寄存器 输出的脉冲数*/ // 设置为在最后一个脉冲之后中断 /* TMR1_CSCTRL: DBG_EN=0,FAULT=0,ALT_LOAD=0,ROC=0,TCI=0,UP=0,OFLAG=0, TCF2EN=0,TCF1EN=1,TCF2=0,TCF1=0,CL2=0,CL1=0 */ TIMx->CHANNEL[OutChanel].CSCTRL=0x40; /* 设置比较器控制寄存器 */ // 最后,启动计数器运行 TIMx->CHANNEL[TimChanel].CNTR=0; /* 重置计数器 */ // /*设置中断优先级,*/ // set_IRQn_Priority(IRQn,Group4_PreemptPriority_6, Group4_SubPriority_0); // /*开启中断 */ // EnableIRQ(IRQn); TIMx->CHANNEL[OutChanel].CTRL|=(1<<13); /* 运行计数器 */ TIMx->CHANNEL[TimChanel].CTRL|=(1<<13); /* 运行源时钟计数器 */ 这是我改动的例程 Re: 使用QTMER 脉冲输出功能脉冲数多发问题 示例:47.6.5.12.1 使用两个计数器的脉冲输出//(参见处理器专家 PulseStream bean。)//此示例从 QT1 输出生成六个 10 毫秒脉冲。// 假设芯片工作频率为 60 MHz。// // 为此,使用定时器 3 生成一个周期为 10ms 的时钟。////定时器 1 用于为这些时钟设置门控并计算已生成的脉冲数量。//void PulseStream_Init (void) {//选择 IP_bus_clk/16 作为定时器 3 的时钟源 /* TMR3_CTRL:CM=0,PCS=0x0C,SCS=0,ONCE=0,LENGTH=1,DIR=0,COINIT=0,OUTMODE=3 */ setReg (TMR3_CTRL,0x1823); /* 安装模式 */ /* TMR3_SCTRL:TCF=0,TCFIE=0,TOF=0,TOFIE=0,IEF=0,IEFIE=0,IPS=0,INPUT=0,功能描述 i.MX RT1050 处理器参考手册,修订版 1,03/2018 2726 恩智浦半导体 Capture_Mode=0,MSTR=0,EEOF=0,VAL=0,FORCE=0,OPS=0,OEN=0 */ setReg(TMR3_SCTRL,0x00);setReg(TMR3_LOAD,0x00);/* RESET 负载寄存器 */ setReg(TMR3_COMP1,37500);/*(16 * 37500)/60e6= 0.01 高效密码学标准(SEC) */ /* TMR3_CSCTRL:DBG_EN=0,FAULT=0,ALT_LOAD=0,ROC=0,TCI=0,UP=0,OFLAG=0,TCF2EN=0,TCF1EN=0,TCF2=0,TCF1=0,CL2=0,CL1=0 */ setReg (TMR3_CSCTRL,0x00); /* 安装比较器控制寄存器 *///定时器 3 的输出是该定时器的时钟源。/* TMR1_CTRL:CM=0,PCS=7,SCS=0,ONCE=1,长度 = 1,DIR=0,COINIT=0,OUTMODE=7 */ setReg(tmr1_Ctrl,0x0E67);/* 设置模式 */ /* TMR1_SCTRL:TCF=0,TCFIE=0,TOF=0 0、TOFIE=0、IEF=0、IEFIE=0、IPS=0、INPUT=0、Capture_Mode=0、MSTR=0、EEOF=0、VAL=0、FORCE=0、OPS=0、OEN=1 */ setReg (tmr1_sctrl,0x01);setReg (tmr1_cntr,0xtr,0xtr,0x01) 00); /* RESET 计数器寄存器 */ setReg (tmr1_load,0x00); /* RESET 负载寄存器 */ setReg (tmr1_comp1,0x04); /* 设置比较 1 寄存器 *///设置为最后一个脉冲之后中断 /* TMR1_CSCTRL: DBG_EN=0, FAULT=0, ALT_LOAD=0, ROC=0,TCI=0,UP=0,OFLAG=0,TCF2EN=0,TCF1EN=1,TCF2=0,TCF1=0,CL2=0,CL1=0 */ setReg (tmr1_csctrl,0x40); /* 设置比较器控制寄存器 *///最后,启动运行 setReg (TMR3_CNTR,0) 的计数器;/* RESET 计数器 */ setRegbitGroup (TMR3_CTRL,cm,0x01);/* 运行源时钟计数器 */ setRegbitGroup (TMR1_CTRL, cm,0x01); /* 运行计数器 */ Re: 使用QTMER 脉冲输出功能脉冲数多发问题 我需要发送准确的脉冲数量来控制步进电机转动一定的角度,发送的脉冲数量不能多也不能少,这样才能保证角度准确。 我现在实现了10HZ-500KHZ的频率发送,就是脉冲数有多发现象,打断点调试时感觉是手册例程TMR1关断不及时造成会多发一个,监控CNTR的计数值和比较寄存器的值是一样的,有点头大不知什么问题了,请大家指点一下。感谢
View full article