2020-02-11 09:01发布
FSL_TICS_ZJJ 发表于 2014-2-8 17:37 这个帖子的内容可以实现你需要,http://www.amobbs.com/thread-5568613-1-1.html
ln08136207 发表于 2014-2-11 13:04 今天测试了一下,遇到一个问题,使用FTM0的channel0捕获外部脉宽,进入中断后出不来了, 配置如下: FTM_ ...
FSL_TICS_ZJJ 发表于 2014-2-11 13:48 你好,新的问题的话,最好发个帖子出来,这样也便于我到时候结贴。 发问题的时候,最好说明自己用的什么 ...
ln08136207 发表于 2014-2-11 14:10 这个不是新问题,也是在输入捕获脉宽这个问题中遇到的, 使用IAR 6.7环境,FRDM_KE02Z测试板, 使用FTM0 ...
ln08136207 发表于 2014-2-11 16:31 大神们,有没有结果啊
最多设置5个标签!
今天测试了一下,遇到一个问题,使用FTM0的channel0捕获外部脉宽,进入中断后出不来了,
配置如下:
FTM_InputCaptureInit(FTM0,FTM_CHANNEL_CHANNEL0,FTM_INPUTCAPTURE_DUALEDGE_RISINGEDGE);
FTM_ClockSet(FTM0,FTM_CLOCK_SYSTEMCLOCK,FTM_CLOCK_PS_DIV8);
FTM_SetCallback(FTM0, FTM0_Task);
中断服务函数:
void FTM0_Isr(void)
{
//FTM_ClrOverFlowFlag(FTM0);
if(FTM_Callback[0])
{
FTM_Callback[0]();
}
FTM_ClrChanneleventFlag(FTM0,0);
}
/*************清除中断标志位**********/
void FTM_ClrChanneleventFlag(FTM_Type *pFTM,char Channeln)
{
volatile uint32_t Read_Csc;
Read_Csc = pFTM->CONTROLS[Channeln].CnSC;
pFTM->CONTROLS[Channeln].CnSC &= ~FTM_CnSC_CHF_MASK;
}
问题是,无法清除 FTMx_CnSC的CHF位
你好,新的问题的话,最好发个帖子出来,这样也便于我到时候结贴。
发问题的时候,最好说明自己用的什么芯片,什么平台,
如果可以请再发个问题贴,然后我会帮您测试的!
这个不是新问题,也是在输入捕获脉宽这个问题中遇到的,
使用IAR 6.7环境,FRDM_KE02Z测试板, 使用FTM0的Channel0作为输入通道。
问题1:当FTM0_channel0(PTA0)没有有输入信号时,程序会10ms进一次输入捕获中断
问题2:当有信号输入时,程序读取下降沿时的寄存器值会被污染掉。
下面是部分程序:
/***********初始化FTM0*******************/
FTM_InputCaptureInit(FTM0,FTM_CHANNEL_CHANNEL0,FTM_INPUTCAPTURE_DUALEDGE_BOTHEDGE);
FTM_ClockSet(FTM0,FTM_CLOCK_SYSTEMCLOCK,FTM_CLOCK_PS_DIV8);
FTM_SetCallback(FTM0, FTM0_Task);
GPIO_PinInit(GPIO_PTH2,GPIO_PinOutput);
/*************中断服务函数*****************/
void FTM0_Isr(void)
{
if(FTM_Callback[0])
{
FTM_Callback[0]();
}
FTM_ClrChanneleventFlag(FTM0,0);
}
/**************其他子函数*****************/
void FTM0_Task(void)
{
char Port_Data;
Port_Data = (char)(GPIO_Read(GPIOA)&0x1); //判断是上升沿还是下降沿
switch(Port_Data)
{
case 0:
Read_ChannelValue(FTM0,0,0); //读取下降沿时计数器的值,并计算脉宽(下降沿时的值-上升沿时的值)
break;
case 1:
Read_ChannelValue(FTM0,1,0); //读取上升沿时计数器的值。
break;
}
GPIO_PinToggle(GPIO_PTH2);
}
void Read_ChannelValue(FTM_Type *pFTM,char edge,char Ftm_Channel)
{
static uint32_t Rising_Edge;
static uint32_t Falling_Edge;
static char flag;
ASSERT((FTM0 == pFTM)&&(Ftm_Channel<2)&&(edge<2));
switch(edge)
{
case 0:
Falling_Edge = pFTM->CONTROLS[Ftm_Channel].CnV; //读取此时计数器时的值
if(flag)
{
/**********计算脉宽******************/
if(Falling_Edge > Rising_Edge)
Pluse_Width = Falling_Edge - Rising_Edge;
else
Pluse_Width = Falling_Edge +(65535 - Rising_Edge);
flag = 0;
}
break;
case 1:
Rising_Edge = pFTM->CONTROLS[Ftm_Channel].CnV;
flag = 1;
break;
}
}
好的,问题收到,我待会看一下并测试一下,会尽快回复您!
请耐心等待!
怎么没有看到你清TOF标志呢?
你可以使用溢出中断,然后在中断中清掉TOF,和CHF两个标志位。
如果不清掉TOF,标志会一直在,就出不了中断了。
一周热门 更多>