定时器和GPIO中断

2019-07-20 21:38发布

在使用超声波传感器的时候,发现一个问题,超声波模块能用,示波器所显示的高电平时间长度和测试距离能够对应的上,最后使用的时候用定时器来对数据进行计时则发现所计数的时间不对。具体代码如下以下是GPIO的初始化
[mw_shl_code=c,true]static void HLSer_GPIO_Config(void)
{
        GPIO_InitTypeDef   InitStructure;
        RCC_AHB1PeriphClockCmd(HLSer_Trig_GPIO_Clk | HLSer_Echo_GPIO_Clk,ENABLE);
        InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;         
        InitStructure.GPIO_OType = GPIO_OType_PP;
        InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       
        InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
        InitStructure.GPIO_Pin   = HLSer_Trig_GPIO_Pin;
        GPIO_Init(HLSer_Trig_GPIO_Port,&InitStructure);      
        InitStructure.GPIO_Pin   = HLSer_Echo_GPIO_Pin;
        InitStructure.GPIO_Mode  = GPIO_Mode_IN;
        InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(HLSer_Echo_GPIO_Port,&InitStructure);      
}[/mw_shl_code]



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Sunwaz
1楼-- · 2019-07-21 01:01
问题解决。。在跳出while的时候  关闭定时器,清零定时器,但是中间会多出500us的多余时间,将这个多余时间减掉就好了。。。不用再中断里面关闭定时器。关闭不了。
Sunwaz
2楼-- · 2019-07-21 06:29
以下是中断的初始化
[mw_shl_code=applescript,true] static void ULSer_EXTI_Config(void)
{
         EXTI_InitTypeDef EXTI_InitStructure;
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
         SYSCFG_EXTILineConfig(HLSer_EXTI_PortSource,
                               HLSer_EXTI_PinSource);
         EXTI_InitStructure.EXTI_Line      = HLSer_EXTI_Line;         
         EXTI_InitStructure.EXTI_LineCmd   = ENABLE;                  
         EXTI_InitStructure.EXTI_Mode      = EXTI_Mode_Interrupt;      
         EXTI_InitStructure.EXTI_Trigger   = EXTI_Trigger_Falling;      
         EXTI_Init(&EXTI_InitStructure);
}[/mw_shl_code]
[mw_shl_code=c,true]static void HLSer_NVIC_Config(void)
{
         NVIC_InitTypeDef NVIC_InitStructure;
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
         NVIC_InitStructure.NVIC_IRQChannel                   = HLSer_EXTI_IRQ;
         NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
         NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 2;
         NVIC_Init(&NVIC_InitStructure);
}[/mw_shl_code]
Sunwaz
3楼-- · 2019-07-21 11:28
 精彩回答 2  元偷偷看……
Sunwaz
4楼-- · 2019-07-21 13:06
中断函数
[mw_shl_code=c,true]void HLSer_EXTI_IRQHandler(void)
{
        if(EXTI_GetITStatus(HLSer_EXTI_Line) != RESET)
        {
                        TIM_Cmd(TIM6,DISABLE);                                 
                        HLSer_User.Count = TIM_GetCounter(TIM6);              
                        TIM_SetCounter(TIM6,0);                                
                        Interrupt_Flag.HLSer_Flag = SET;                     
                        //TIM_Cmd(TIM6,ENABLE);                                 
                }
                EXTI_ClearITPendingBit(HLSer_EXTI_Line);       
}[/mw_shl_code]

Sunwaz
5楼-- · 2019-07-21 15:58
[mw_shl_code=c,true]float HLSer_GetValue(void)
{
        HLSer_Trig_Out = 1;           
        Delay_us(20);                          
        HLSer_Trig_Out = 0;
        //ULSer_EXTI_Cmd(ENABLE);
        while(HLSer_Echo_In != SET);
        TIM_SetCounter(TIM6,0);
        TIM_Cmd(TIM6,ENABLE);
        while(Interrupt_Flag.HLSer_Flag != SET);   
        Interrupt_Flag.HLSer_Flag = RESET;               
        HLSer_User.length = (HLSer_User.Count) *3.4/ 100;
        //ULSer_EXTI_Cmd(DISABLE);
        return HLSer_User.length;
}[/mw_shl_code]
Sunwaz
6楼-- · 2019-07-21 18:38
以上是比较重要的代码段,经过我自己的分析。不应该出错。。只有在判断下降沿河上升沿的时候 会出现计数时间和时间时间不同步的情况,但是计数只会少而不会多

一周热门 更多>