打印
[STM8]

STM8S输入捕获问题

[复制链接]
7533|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
e_newbie|  楼主 | 2014-11-24 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8S, TI, ce, pc, ck
STM8S103F3 + COSMIC 内部8M时钟   TIM2 CH1(PC5脚)测量脉冲时间,TIM2初始化代码如下:
//输入捕获定时器
void Timer2Open(void)
{
        CLK->PCKENR1 |= CLK_PCKENR1_TIM2;        //时钟打开
       
  TIM2->PSCR = 3;   //2^3=8分频   计数周期为1us
       
        TIM2->ARRH=0XFF;        //必须先设置ARR的高字节
        TIM2->ARRL=0XFF;//再设置低字节
  
  TIM2->CNTRH = 0;
  TIM2->CNTRL = 0;
       
        TIM2->CCER1=0;
                                         
  TIM2->CCMR1 = 1;   // 连接到TIM2_CH1引脚,无滤波,无分频  
// 注:CC1S仅在通道关闭时(TIM1_CCER1寄存器的CC1E=0)才是可写的.   
  
  TIM2->CCER1 = TIM2_CCER1_CC1P|TIM2_CCER1_CC1E;  // 下降沿有效  捕获使能   
                  
  TIM2->SR1 = 0;    // 清除捕获标志  
  TIM2->SR2 = 0;    // 清除重复捕获标志
  TIM2->IER = TIM2_IER_CC1IE|TIM2_IER_UIE ; // 捕获中断使能
  TIM2->CR1 = TIM2_CR1_ARPE|TIM2_CR1_CEN ;   //使能计数
}

溢出中断能进入,但进入不了输入捕获中断
在溢出中断中使查看TIM2->SR1寄存器的值是0X0D,很怪异
不知道各位有没有遇到这种情况???
沙发
mgarm| | 2014-11-24 16:23 | 只看该作者
代码看不出问题,PC5是映射后才是TIM2_CH1,确认一下选项字节配置好这个引脚。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
e_newbie + 1 说到点上了,谢谢
板凳
mmuuss586| | 2014-11-24 22:32 | 只看该作者
可能硬件配置IO配置错,捕获程序配置错;
楼主再好好查下程序;

使用特权

评论回复
地板
哎呦!| | 2015-4-8 13:10 | 只看该作者
问题解决没?

使用特权

评论回复
5
fcw| | 2015-9-21 14:42 | 只看该作者
楼主问题解决了吗

使用特权

评论回复
6
stm8s105c6| | 2015-10-14 16:33 | 只看该作者
楼主,如果说我不用选项字节修改的话,自己设置TIM_CH2通道作为输入捕获通道的话,应该怎么设置,与TIM_CH1通道设置有什么不同吗?涉及的寄存器太多,无法消化

使用特权

评论回复
7
夜晚小树林| | 2015-12-18 20:36 | 只看该作者
选项字节很简单的,我之前也遇到跟你一样的问题,但是解决了。用其他通道都行呀,都是一样的。

使用特权

评论回复
8
huangcunxiake| | 2016-1-6 15:22 | 只看该作者
[tr][/tr]
刚好有这个资料
  • 第一部:
  • 内部时钟 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //16M
  • 第二步:
  • 配置IO口 我用的是STM8S103k3t6
  • GPIO_Init(GPIOB , GPIO_PIN_0 , GPIO_MODE_IN_PU_NO_IT);//TIM1_CH1 PB0端口
  • 第三步:TIM1初始化,
  • 注意:
  • tim1 分频是16000000/1600 =10000
  • 那计数一下的时间是!1/10000 S
  • 向上计数 0到20000 的时间是2S
  • void TIME1_INIT(void)
  • {
  • TIM1_DeInit();
  • TIM1_TimeBaseInit(1600, TIM1_COUNTERMODE_UP, 20000, 0);
  • TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);
  • TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);
  • TIM1_ClearFlag(TIM1_FLAG_CC1);
  • TIM1_Cmd(ENABLE);
  • }
  • 第四步: TIM4用来产生溢出中断用的!
  • void TIME4_INIT(void)
  • {
  • TIM4_TimeBaseInit(TIM4_PRESCALER_32 ,250);
  • TIM4_ARRPreloadConfig(ENABLE);
  • TIM4_PrescalerConfig(TIM4_PRESCALER_32,TIM4_PSCRELOADMODE_IMMEDIATE);
  • TIM4_SetAutoreload(250);
  • TIM4_Cmd(ENABLE);
  • TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);
  • }
  • 第五步: TIM1的中断程序 连续进入两次中断,两次计数的值 乘 第三步中计数一下的时间 就是脉宽
  • // if(TIM1_GetFlagStatus(TIM1_FLAG_CC1))
  • if(TIM1_GetITStatus(TIM1_FLAG_CC1) != RESET)
  • {
  • switch(temp)
  • {
  • case 0: ICValue1=TIM1_GetCapture1();
  • temp=1;
  • break;
  • case 1: ICValue2=TIM1_GetCapture1();
  • temp=2;
  • break;
  • default:
  • TIM1_CCxCmd(TIM1_CHANNEL_1, DISABLE);
  • TIM1_ITConfig(TIM1_IT_CC1, DISABLE);
  • temp=3;
  • break;
  • }
  • TIM1_ClearITPendingBit(TIM1_IT_CC1);
  • TIM1_ClearFlag(TIM1_FLAG_CC1);
  • }
  • 第六步:
  • TIM4的中断程序
  • if(temp==3)
  • {
  • temp=0;
  • if(ICValue2>ICValue1)
  • {
  • disvalue=ICValue2-ICValue1;
  • }
  • else if(ICValue2<ICValue1)
  • {
  • //disvalue=0xffff+ICValue2-ICValue1;
  • disvalue=20000+ICValue2-ICValue1; //防止计数到末端的时候 重新计数
  • }
  • val[i0++] = disvalue;
  • if(i0>10) i0=0;
  • display();
  • TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);
  • TIM1_ITConfig(TIM1_IT_CC1, ENABLE);
  • }
  • else
  • {
  • display();
  • }
  • TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

[color=rgb(51, 102, 153) !important]复制代码











使用特权

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

本版积分规则

5

主题

20

帖子

2

粉丝