[STM8]

tim1输入捕获中断进不去

[复制链接]
345|13
手机看帖
扫描二维码
随时随地手机跟帖
zhuhuis|  楼主 | 2021-12-1 22:34 | 显示全部楼层 |阅读模式
#include"iostm8s003f3.h"
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
void delay(u16 Count);


void main()
{
  asm("sim");
   delay(10);
  //Preamble_IF=0;
// recstep=0;
// N_preamble=0;
   PB_CR1|=0x20;
   PB_CR2|=0x20;
   PB_DDR_DDR5 = 1;
   PB_ODR_ODR5=0;

  CLK_CKDIVR=0x00;
   TIM1_PSCRH = 0x00;
  TIM1_PSCRL = 0x00;
  TIM1_CCER1 &= 0xee;//禁止输入捕获1,2

TIM1_ARRH=0xbb;
TIM1_ARRL=0x80; //3ms
  TIM1_CCMR1 |=  0x01;// ch1到ti1fp1
  TIM1_CCER1 &= 0xFD;//ch1 上升沿触发
  TIM1_CCMR2 |=  0x02;// ch2选择 ti1fp2上
  TIM1_CCER1 |= 0x20;//ch2 下降沿触发 ic2
  TIM1_SMCR |= 0x50;//选源触发源和触发方式 复位
  TIM1_SMCR |=0x04;
  TIM1_IER|= 0x06;
  TIM1_SR1&=0xF9;
  TIM1_SR2&=0xFD;
  TIM1_CCER1|=0x11;
    TIM1_CR1 |= 0x05;

  asm("sim");
  while(1)
  {
  };
}
#pragma vector=0x0E
__interrupt void TIM1_CAP_COM_IRQHandler(void)
{
  u16 High,Cycle;
  //High=0;
// Cycle=0;
   PB_ODR_ODR5=1;
  if ((TIM1_SR1_CC1IF==1)&&(TIM1_SR1_CC2IF==1))
  {
    TIM1_SR1_CC1IF=0;
    TIM1_SR1_CC2IF=0;
    TIM1_SR2_CC1OF=0;
    TIM1_SR2_CC2OF=0;
    High=(u16)TIM1_CCR2H<<8;
         High|=TIM1_CCR2L;
         Cycle=(u16)TIM1_CCR1H<<8;
        Cycle|=TIM1_CCR1L;
        if(((High>3824)&&(High<4176))&&((Cycle-High)>3824)&&((Cycle-High)<4176))
        {
          PB_ODR_ODR5=1;
        }
        else
        {
            PB_ODR_ODR5=0;
        }
}
}
void delay(u16 Count)
{
  u8 i,j;
  while (Count--)
  {
    for(i=0;i<50;i++)
    for(j=0;j<20;j++);
  }
}

   
     


void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* Infinite loop */
  while (1)
  {
  }
}


试过很多遍,没有查到问题,请帮忙看一下,TIM1_CH1捕获上升沿和下降沿,TIM1_SR2=0x06, CC1OF和CC2OF一直为1

使用特权

评论回复
pengf| | 2021-12-1 22:36 | 显示全部楼层
参考下别人的代码,这个好简单加油

使用特权

评论回复
xxrs| | 2021-12-1 22:40 | 显示全部楼层
我给你发一个你参考下

使用特权

评论回复
huangchui| | 2021-12-1 22:43 | 显示全部楼层
void input_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始
化定时器
TIM_ICInitTypeDef TIM5_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 开启定时器 5 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  //使能 TIM5 时钟
TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1); //清除中断和捕获标志位
TIM_TimeBaseInitStructure.TIM_Period = 0xffff; //设定计数器自动重装值
TIM_TimeBaseInitStructure.TIM_Prescaler = 71; //以 1Mhz 的频率计数 一次即是 1us
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //设置时钟分
割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
模式
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//根据 TIM_TimeBaseInitStruct 中指
定的参数初始化 TIMx 的时间基数单位
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1
//中断分组初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;  //打开 TIM5 的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  //抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM5,ENABLE); //使能或者失能 TIMx 外设
TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1, ENABLE );  //使能或者失能指定的TIM
中断
}

使用特权

评论回复
yufe| | 2021-12-1 22:46 | 显示全部楼层
void TIM5_IRQHandler() //定时器 5 输入捕获中断函数
{
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
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); //获得 TIMx 输入捕获 1 的值
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获
}
else
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获
}
}
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}

使用特权

评论回复
yszong| | 2021-12-1 22:48 | 显示全部楼层
用的定时器5 你试试

使用特权

评论回复
llljh| | 2021-12-1 22:52 | 显示全部楼层
原来你就是高手中的高高手。

使用特权

评论回复
huangchui| | 2021-12-1 22:53 | 显示全部楼层
别的中断能进去吗

使用特权

评论回复
yszong| | 2021-12-1 22:55 | 显示全部楼层
中断允许开启了吗

使用特权

评论回复
llljh| | 2021-12-1 22:57 | 显示全部楼层
中断向量有没有问题

使用特权

评论回复
xxrs| | 2021-12-1 22:59 | 显示全部楼层
看看寄存器配置代码

使用特权

评论回复
huangchui| | 2021-12-1 23:00 | 显示全部楼层
把while(1)上面那条的sim改成rim就好了

使用特权

评论回复
zhanghqi| | 2021-12-1 23:02 | 显示全部楼层
在 stm8里面 有关开、关中断的两条指令,似乎有点容易让人弄混。

SIM==>Set Interrupt Mask = Disable Interrupt

RIM==>Reset Interrupt Mask = Enable Interrupt

使用特权

评论回复
zhuhuis|  楼主 | 2021-12-1 23:04 | 显示全部楼层

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

728

主题

8464

帖子

6

粉丝