OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3873|回复: 9

定时器和GPIO中断

[复制链接]

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
发表于 2016-6-18 17:02:07 | 显示全部楼层 |阅读模式
5金钱
在使用超声波传感器的时候,发现一个问题,超声波模块能用,示波器所显示的高电平时间长度和测试距离能够对应的上,最后使用的时候用定时器来对数据进行计时则发现所计数的时间不对。具体代码如下以下是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]



最佳答案

查看完整内容[请看2#楼]

问题解决。。在跳出while的时候 关闭定时器,清零定时器,但是中间会多出500us的多余时间,将这个多余时间减掉就好了。。。不用再中断里面关闭定时器。关闭不了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-18 17:02:08 | 显示全部楼层
问题解决。。在跳出while的时候  关闭定时器,清零定时器,但是中间会多出500us的多余时间,将这个多余时间减掉就好了。。。不用再中断里面关闭定时器。关闭不了。
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-18 17:03:59 | 显示全部楼层
以下是中断的初始化
[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]
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-18 17:05:52 | 显示全部楼层
定时器初始化
[mw_shl_code=c,true]static void TIM6_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  RCC_APB1PeriphClockCmd(TIM6_CLK, ENABLE);
  TIM_TimeBaseStructure.TIM_Period = 4999-1;      
  TIM_TimeBaseStructure.TIM_Prescaler = 180-1;       
        TIM_TimeBaseInit(TIM6_Port, &TIM_TimeBaseStructure);
        //TIM_ClearFlag(TIM6_Port, TIM_FLAG_Update);
        //TIM_ITConfig(TIM6_Port,TIM_IT_Update,ENABLE);
        //TIM_Cmd(TIM6_Port, ENABLE);       
}[/mw_shl_code]
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-18 17:07:04 | 显示全部楼层
中断函数
[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]

回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-18 17:07:55 | 显示全部楼层
[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]
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-18 17:09:23 | 显示全部楼层
以上是比较重要的代码段,经过我自己的分析。不应该出错。。只有在判断下降沿河上升沿的时候 会出现计数时间和时间时间不同步的情况,但是计数只会少而不会多
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-18 17:15:21 | 显示全部楼层
示波器的波形  大概时间是200us   keil5计数了0x153次 也就是339次,TIM6设置的是  没计数一次为2us 也就是678us   这中间的差距太大了  请问一下 我是哪儿设置不对了么?

示波器波形

示波器波形
QQ截图20160618171248.jpg
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-6-18 20:14:03 | 显示全部楼层
帮顶
回复

使用道具 举报

9

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-5-14
在线时间
14 小时
 楼主| 发表于 2016-6-20 11:35:39 | 显示全部楼层

通过设置断点 和 示波器分析。。。。发现问题的所在。。。就是  在等待高电平的时候,,就进入到中断了,这样。就使得定时器被提前打开,计数值就变多了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 13:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表