OpenEdv-开源电子网

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

为什么我把TIM5改成TIM4就没反应了?(战舰STM32F103ZET6)

[复制链接]

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-4-6
在线时间
22 小时
发表于 2017-10-19 01:02:43 | 显示全部楼层 |阅读模式
20金钱
#include "capture.h"
/**********超声波引脚及定时器5初始化(中断函数)**************/

/**PA0,通过输入捕获,获取输入信号的脉冲宽度(高电平持续时间)****/

void CAPTURE_Init(void)
{
GPIO_InitTypeDef GPIO_IniStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

/****************电机引脚初始化**************/       
         //(ECHO回响信号输入脚)
         GPIO_IniStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
         GPIO_IniStructure.GPIO_Pin = GPIO_Pin_5;
         GPIO_Init(GPIOC,&GPIO_IniStructure);
         
       
         //(Trig)输入触发信号脚,持续给10us以上高电平
         GPIO_IniStructure.GPIO_Pin= GPIO_Pin_4;
         GPIO_IniStructure.GPIO_Mode = GPIO_Mode_Out_PP;
         GPIO_IniStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOC,&GPIO_IniStructure);
         GPIO_ResetBits(GPIOC,GPIO_Pin_4);
         GPIO_ResetBits(GPIOC,GPIO_Pin_5);
/************到这**************/


/****************定时器5初始化*****************/
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitStructure.TIM_Period =5000;//自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler =0;//预分频值
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//T5,向上计数一次1us,总的计数溢出时间65536us
TIM_Cmd(TIM5,ENABLE);//使能定时器,开始工作

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//输入通道选择
TIM_ICInitStructure.TIM_ICFilter = 0;//固定采样频率采样一次,不起到消除杂波的作用
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//通道上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//CC1通道被配置为输入, IC1映射在TI1上
TIM_ICInitStructure.TIM_ICPrescaler= TIM_ICPSC_DIV1;//一次上升沿(下降沿)即触发捕获
TIM_PrescalerConfig(TIM5,719,TIM_PSCReloadMode_Immediate);//?????72MHz/(719+1)=100000
TIM_ARRPreloadConfig(TIM5, DISABLE);//??
TIM_ICInit(TIM5,&TIM_ICInitStructure);

TIM_ITConfig(TIM5,TIM_IT_CC1|TIM_IT_Update,ENABLE);//中触发类型:更新(溢出)、捕获/比较
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);//开中断,设置中断触发类型



}



//2个全局变量
u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值

//定时器5中断服务程序
/***********************************************************************
IC通道初始化设置为上升沿触发捕获,设置捕获值为0,设置计数器值也为0 ,IC通道极性选择为下降沿
下一次下降沿触发捕获,将计数器的值赋给捕获值。
但要注意一个问题:单次高电平持续时间可能超过一次溢出时间,所以要考虑定时器溢出次数!!
中断函数作用:模拟一个软件8位寄存器,低6位存储溢出次数。
  bit7         bit6                 bit5-0
  捕获标志     捕获高电平标志       捕获高电平后定时器溢出次数
************************************************************************/         
//定时器5中断服务程序         
void TIM5_IRQHandler(void)
{

        if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
        { //最大测量范围4m对应Echo输入23.53ms的高电平,单次TIM溢出需要65.536ms
                if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
                 
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//强制标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM5CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {       
                        if(TIM5CH1_CAPTURE_STA&0X40)//前一次捕获了上升沿,此次捕获到一个下降沿                
                        {                                 
                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //清空
                                TIM5CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM5,0);//定时器从0开始重新计数
                                TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                   
        }

    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

}


#include "ultrasonic.h"
#include "delay.h"
#include "capture.h"
#include "math.h"

/***********此为超声波算法****************/
#define module_interval 25

//extern u8  TIM5CH1_CAPTURE_STA;
//extern u16        TIM4CH1_CAPTURE_VAL;
int overcount=0;

int Get_distance(void)
{
  int distance=0,sum_distance=0;
  u16 TIM=0;
  u8 i=0;

  while(i!=5)
  {
      GPIO_SetBits(GPIOC,GPIO_Pin_4);
      delay_us(20);
      GPIO_ResetBits(GPIOC,GPIO_Pin_4);

      TIM_Cmd(TIM5, ENABLE);

      while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) && overcount==0);
      TIM5->CNT=0;
      while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) && overcount==0);
      TIM_Cmd(TIM5, DISABLE);
      i++;
      if(overcount!=0)
      {
            overcount=0;
            return 0.0;
      }
      TIM=TIM_GetCounter(TIM5);
      distance=(int)sqrt((TIM/10.0*17)*(TIM/10.0*17)-module_interval*module_interval/4.0)+12.0; //12.0?????//?????????????
      sum_distance=sum_distance+distance;
  }
  distance=sum_distance/5;
return distance;
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-4-6
在线时间
22 小时
 楼主| 发表于 2017-10-19 01:06:25 | 显示全部楼层
因为我的定时器5用来PWM驱动小车了,而上面的代码我是在网上找到的(单独使用可以用),放一起就不行了。
我认为是定时器的问题(共用定时器5)  ,我把定时器5改成定时器4就不行了。
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-4-6
在线时间
22 小时
 楼主| 发表于 2017-10-19 01:07:04 | 显示全部楼层
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-10-19 08:59:38 | 显示全部楼层

我全部定时器都用光了,都可以在一个工程里使用,是不是哪里配置出问题了,比如TIM4捕获管脚IO初始化不对,TIM5漏掉什么关键性配置等等,仔细检查一下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-4-6
在线时间
22 小时
 楼主| 发表于 2017-10-19 10:40:42 | 显示全部楼层
八度空间 发表于 2017-10-19 08:59
我全部定时器都用光了,都可以在一个工程里使用,是不是哪里配置出问题了,比如TIM4捕获管脚IO初始化不对 ...

但是我的两个程序单独使用TIM5都可以,一起就不行了。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-10-19 16:26:04 | 显示全部楼层
何氏mcu 发表于 2017-10-19 10:40
但是我的两个程序单独使用TIM5都可以,一起就不行了。

你怎么初始化的
MDK环境还是IAR环境
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-4-6
在线时间
22 小时
 楼主| 发表于 2017-10-19 17:54:50 | 显示全部楼层
八度空间 发表于 2017-10-19 16:26
你怎么初始化的
MDK环境还是IAR环境

keil v5
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-4-6
在线时间
22 小时
 楼主| 发表于 2017-10-19 17:56:22 | 显示全部楼层
源文件在这

超声波移植.zip

7.14 MB, 下载次数: 502

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 03:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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