6定时器同时发50K脉冲,引脚翻转迟钝丢脉冲
我是用TMR3,TMR6,TMR10,TMR11,TMR14,TMR13配置定时器溢出中断(中断中有变量做计数),在中断中反转引脚发脉冲频率50K,并设置脉冲数量1000000个。用TMR2做计数器对其中的一个脉冲引脚计数,TMR2-CNT的数值总会少几个(无规律),但是中断中变量的计数值是正确的和设置的脉冲数一样。这时我用一个定时器发脉冲,然后发现计数器的计数值和发的脉冲数都对,此时感觉是否雅特力的AT32F407VGT7引脚是否反转速度跟不上中断呢?大家测试一下吧!以前是用LPC1768FBD100和STM32还没发现这个情况。 已解决 fuquan19801117 发表于 2021-11-19 08:13已解决
能否说明一下解决方法,或者问题原因呢? 经过几天的测试并未解决,问题还是在。 fuquan19801117 发表于 2021-11-21 13:21
经过几天的测试并未解决,问题还是在。
你好能把测试代码发一下吗 void TmrFeqSet(TMR_Type *TIMx,uint32_t Ferq ,FunctionalState NewState)
{
TMR_TimerBaseInitTypeTMR_TMReBaseStructure;
uint32_t uiTIMxCLK;
uint16_t usPeriod;
uint16_t usPrescaler;
//ÔÝÍ£¶¨Ê±Æ÷
TMR_Cmd(TIMx, DISABLE);
/* APB ¶¨Ê±Æ÷ */
uiTIMxCLK = SystemCoreClock;
//
if (Ferq < 100)
{
usPrescaler = 10000 - 1; /* ·ÖƵ±È = 1000 */
usPeriod =(uiTIMxCLK / 10000) / Ferq- 1; /* ×Ô¶¯ÖØ×°µÄÖµ */
}
else if (Ferq < 5000)
{
usPrescaler = 100 - 1; /* ·ÖƵ±È = 100 */
usPeriod =(uiTIMxCLK / 100) / Ferq- 1; /* ×Ô¶¯ÖØ×°µÄÖµ */
}
else /* ´óÓÚ5KµÄƵÂÊ£¬ÎÞÐè·ÖƵ */
{
usPrescaler = 0; /* ·ÖƵ±È = 1 */
usPeriod = uiTIMxCLK / Ferq - 1; /* ×Ô¶¯ÖØ×°µÄÖµ */
}
//
TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);
TMR_SetCounter(TIMx, 0);
//
TMR_TMReBaseStructure.TMR_Period = usPeriod;
TMR_TMReBaseStructure.TMR_DIV = usPrescaler;
TMR_TMReBaseStructure.TMR_ClockDivision = 0;
TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up | (1<<2);
//
TMR_TimeBaseInit(TIMx, &TMR_TMReBaseStructure);
//
TMR_ARPreloadConfig(TIMx,ENABLE);
/* Prescaler configuration */
TMR_DIVConfig(TIMx, usPrescaler, TMR_DIVReloadMode_Immediate);
/* TMR IT enable */
TMR_INTConfig(TIMx, TMR_INT_Overflow, NewState);
//
TMR_ClearITPendingBit(TIMx, TMR_INT_Overflow);
/* TMR2 enable counter */
TMR_Cmd(TIMx, NewState);
}
中断中翻转引脚为什么占空比差那么多呢?
100K的脉冲频率。 ArterySW 这个简单的定时器中断中翻转引脚,自己写一个每秒中断200K次的程序,没中断1次翻转1次引脚。测测吧!希望官方的自己测测 fuquan19801117 发表于 2021-11-21 15:43
void TmrFeqSet(TMR_Type *TIMx,uint32_t Ferq ,FunctionalState NewState)
{
TMR_TimerBaseInitTypeTM ...
麻烦再贴一下你的中断代码吧,谢谢 void TMR3_GLOBAL_IRQHandler(void)
{
//Y2¶Ë¿ÚÂö³å
if (TMR_GetINTStatus(TIMERx, TMR_INT_Overflow) != RESET)
{
TMR_ClearITPendingBit(TIMERx, TMR_INT_Overflow);
(Tmr3Int])(); //²éÕÒÖ¸ÁîÀàÐÍ
}
} const Axis0 Tmr3Int[]={
MC_DRVACH0, //¾ø¶ÔÏà¶Ô¶¨Î»
}; void MC_DRVACH0(void)
{
if(PluseStr.PluseCont<PluseStr.TolPluse)
{
if(Y0portval)
{
PLC_Y0_OFF;
}
else
{
PLC_Y0_ON;
PluseStr.PluseCont+=1;
}
}
else
{
PLC_Y0_OFF;
停止计数器再此
}
} 本帖最后由 vt2017 于 2021-11-22 11:12 编辑
我这边按照你说的配置测试没有发现你说的问题,5us进一次溢出中断,采10s就是会进1000000次中断,然后用Excel计算每次翻转的时间(附件里面表格的C列),基本上都在5us,表格以及main.c文件都在附件。附件:
本帖最后由 fuquan19801117 于 2021-11-22 11:47 编辑
好的我再看看 请问如果在代码里加入一个高优先级的定时器以0.1ms的频率定时处理其他函数会不会造成上面的现象? 多发几次,有时候是正常的 fuquan19801117 发表于 2021-11-22 12:03
请问如果在代码里加入一个高优先级的定时器以0.1ms的频率定时处理其他函数会不会造成上面的现象? ...
如果是在高优先级中断里调用的函数执行时间较长的话是会有影响的。可以在这个高优先级的中断函数的开始和结束翻转一个IO,看这个中断函数总共耗时是多久。
页:
[1]
2