打印
[STM8]

STM8S103输入捕获的调试寄存器

[复制链接]
2845|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llljh|  楼主 | 2021-11-20 23:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM8S 输入捕获程序 ,为什么调试时查看的TIM1_CCMR1寄存器,显示的是输出设置的寄存器:OC1IE,OC1M,OC1FE,CC1S,而不是输入设置的寄存器:IC1F,IC1PSC,CC1S,是程序有问题?还是在哪个地方调出来?

使用特权

评论回复
沙发
pengf| | 2021-11-20 23:28 | 只看该作者
定时器输出吧。捕获的当然需要定时器配置了。

使用特权

评论回复
板凳
juventus9554| | 2021-11-20 23:30 | 只看该作者
看CCR1,CCR2寄存器

使用特权

评论回复
地板
llljh|  楼主 | 2021-11-20 23:33 | 只看该作者
TIM1_CCER1 &= (~0x11);        // 捕获/比较使能寄存器,关闭IC1 IC2  
/******************************************************************************************************************************
     7[cc2np]   6[cc2ne]    5 [cc2p]  4 [cc2e]        3[cc1np]           2[cc1ne]             1[cc1p]              0[cc1e]
                                                  1:OC1N低电平有效    1:开启OC1N            1极性                1使能
                                                                                          输出    输入       输出          输入
                                                                                        0:高  0:上升沿   0:禁止    0:捕获禁止  
********************************************************************************************************************************/
   
    TIM1_CCMR1 |= 0x01 ;       //  捕获/比较模式寄存器,CC1到 TI1FP1,禁止预装载,捕获后直接存入寄存器
    TIM1_CCER1 &= (~0x02);     // IC1 上升沿触发
/*************************************************************************************************
     7        6_5_4[oc1m]         3[oc1pe]                2           1_0[cc1s]
    保留     输出比较模式     输出比较1预装载使能       保留        捕获/比较1选择
                              0:禁止TIMX_CCR1预装载          00:CC1输出  01:CC1输入,IC1-TI1FP1  
                                                              10:CC1输入,IC1-TI2FP1 11:保留
*************************************************************************************************/   
   
    TIM1_CCMR2 |= 0x02;        // 捕获/比较模式寄存器, CC2到 TI1FP2
    TIM1_CCER1 |= 0x20;        // IC2 下降沿触发
/*************************************************************************************************
     7        6_5_4[oc2m]         3[oc2pe]                2           1_0[cc2s]
    保留     输出比较模式     输出比较1预装载使能       保留        捕获/比较1选择
                              0:禁止TIMX_CCR1预装载          00:CC2输出  01:CC2输入,IC2-TI2FP2  
                                                              10:CC2输入,IC2-TI1FP2 11:保留
*************************************************************************************************/
   
//    TIM1_CCER1 |= 0x11;        // CC2上升沿触发 CC1下降沿触发 并 CC1 CC2 使能
   
    TIM1_SMCR |= 0x54;         //触发从模式寄存器,滤波后的定时器输入 TI1FP1  复位模式
/*************************************************************************************************************
     7[msm]           6_5_4[ts]         3               2_1_0[sms]
    主从模式          触发选择         保留      时钟/触发/从模式选择
    0:无作用                                    000:关闭时钟/触发控制器,CEN=1时,预分频器由内部时钟驱动
    1:出发时间延迟                              100:触发复位,选中的触发输入上升沿重新初始计数,产生更新信号
                                                 101:门控模式,高同100
                                                 110:上升沿计数,但不复位
                                                 111:外部时钟模式1,上升沿驱动计数器
                                                 其他:保留
**************************************************************************************************************/     

    // 清除标志位
    TIM1_SR1 &= 0xE0;          //状态寄存器1, 清除 CCiIF  UIF标志
/***************************************************************************************************************
      7[BIF]                   6[TIF]          5[COMIF]              4[CC4IF]     3[CC3IF]      2[CC2IF]   
    1:刹车输入有上升沿    1:中断等待响应    1:com中断等待响应      同cc1IF
   
      1[CC1IF]                                              0[UIF]
    输出时:1:TIMX_CNT与TIMX_CCR1相等                   1:更新时间等待响应
    输入时:1:计数器值已经拷贝到TIM1_CCR1
***************************************************************************************************************/   
   
    TIM1_SR2 &= 0xE0;          //状态寄存器2, 清除 CCiOF 标志
/*****************************************************************************************************
      7_6_5         4[CC4OF]          3[CC3OF]            2[CC2OF]     1[CC1OF]                 0   
      保留          同cc1OF                                         1:捕获到TIM1_CCR1时,     保留
                                                                    CC1IF,已经为1   
******************************************************************************************************/     

    // 使能                    
    TIM1_IER |= 0x06;          //中断使能寄存器, 允许捕获中断   
/*****************************************************************************************************
   7[BIE]           6[TIE]          5[COMIE]             4[CC4IE]            3[CC3IE]      2[CC2IE]   
  1:允许刹车    1:使能触发中断    1:允许com中断   1:允许捕获比较中断
   
      1[CC1IE]                      0[UIE]
                                1:允许更新中断
*****************************************************************************************************/

    TIM1_CCER1 |= 0x11;        // CC2上升沿触发 CC1下降沿触发 并 CC1 CC2 使能   
   
    TIM1_CR1 |= 0x01;          //控制寄存器, 使能定时器1
/*****************************************************************************************************
   7[ARPE]                         6_5[CMS]          4[DIR]             3[OPM]     
  1:TIM1_ARR由预装载缓冲器缓冲   中央对齐模式      1:向上计数    1:发生更新时间时,计数器停止
  0:无缓冲  
   2[URS]         1[UDIS]                     0[CEN]
更新请求源     1:不产生更新事件          1:允许计数
*****************************************************************************************************/   
}

使用特权

评论回复
5
llljh|  楼主 | 2021-11-20 23:35 | 只看该作者
上面是配置程序

使用特权

评论回复
6
午夜粪车| | 2021-11-20 23:37 | 只看该作者
硬件仿真时寄存器状况呢

使用特权

评论回复
7
llljh|  楼主 | 2021-11-20 23:39 | 只看该作者
进入了捕获服务程序中的CC1IF,CC2IF看不到置1.

使用特权

评论回复
8
llljh|  楼主 | 2021-11-20 23:41 | 只看该作者

使用特权

评论回复
9
llljh|  楼主 | 2021-11-20 23:43 | 只看该作者
TIM1_CCMR1下面不是输入捕获的寄存器,而是配置为输出的情况。

使用特权

评论回复
10
chuxh| | 2021-11-20 23:47 | 只看该作者
/*硬件连接*/

// PB0<----PC4

/****************************************************************************************

*开发环境:IAR for stm8 v6.5.3

*硬件平台:STM8L-DISCOVERY

*功能说明:本例程,通过CC0输出32.768KHz的方波,提供给TIM2的捕获输入引脚PB0测量

*作    者:茗风

****************************************************************************************/

#include"iostm8l152c6.h"

#include"stdint.h"

uint16_t tim2_ccr1=0,tim2_ccr2=0;

uint8_t  f_finish=0;

/******************************************************************************************************

*  名    称:void CLOCK_Init(void)

*  功    能:通过PC4输出选择的时钟

*  入口参数:无

*  出口参数:无

*  说    明:PC4输出32.768KHz的方波,提供给TIM2的捕获引脚PB0测量

*  范    例:无

******************************************************************************************************/

void CLOCK_Init(void)

{

   PC_CR1_C14  =1;//推挽输出

   PC_CR2_C24  =1;//高速输出

   PC_DDR_DDR4 =1;//PC4输出

   

   CLK_CCOR_CCODIV=0x00;//选择分频值

   

   /*

  *0x00 CCO divided by 1

  *0x01 CCO divided by 2

  *0x02 CCO divided by 4

  *0x03 CCO divided by 8

  *0x04 CCO divided by 16

  *0x05 CCO divided by 32

  *0x06 CCO divided by 64

  *0x07 CCO divided by 64

  */     

   CLK_CCOR_CCOSEL =0x08;//选择输出时钟,这里选择外部32.768KHz的时钟做测试

   /*

  *0x01 HSI clock output clock source

  *0x02 LSI clock output clock source

  *0x04 HSE clock output clock source

  *0x08 LSE clock output clock source

  */   

}

/******************************************************************************************************

*  名    称:void TIMER2_Init(void)

*  功    能:STM8定时器2捕获功能初始化

*  入口参数:无

*  出口参数:无

*  说    明:PB0为捕获输入引脚,使用通道0

*  范    例:无

******************************************************************************************************/

void TIMER2_Init(void)

{

  PB_DDR_DDR0 =0;//输入

  PB_CR1_C10  =0;//浮空输入

//  PB_CR1_C10  =1;//上拉输入

  PB_CR2_C20  =0;//禁止外部中断功能

  

  CLK_PCKENR1_PCKEN10=1;//打开定时器2时钟

  

//------设置TIM2时钟分频值------

  TIM2_PSCR_PSC=0;//分频值  2M/2^0=2M/1=2000000Hz

  

//-重装值,TIM2从0计数到此值,发生溢出-

//  TIM2_ARRH=0;

//  TIM2_ARRL=100;

  

  //----AUTO_RELOAD 预装载使能----

  TIM2_CR1_ARPE =0;//不通过预装载寄存器

  

  TIM2_CR1_URS=1;//仅当计数器溢出时才发生中断请求

  

  TIM2_CR1_UDIS=1;//禁止更新事件//计数器溢出属于更新事件

  

  TIM2_CR1_DIR=0;//向上计数

  

//  TIM2_CCER1_CC1E=0;//清零使能位,为了配置寄存器

//  TIM2_CCER1_CC2E=0;//清零使能位,为了配置寄存器

  

  TIM2_CCMR1=0;

//  TIM2_CCMR1=0x00; //IC1F=0000  输入信号不分频

  TIM2_CCMR1 |=0x01;//CC1S=01 IC1 is mapped on TI1FP1

  /*00: CC1 channel is configured as output

    01: CC1 channel is configured as input, IC1 is mapped on TI1FP1

    10: CC1 channel is configured as input, IC1 is mapped on TI2FP1

    11: Reserved                                                    */

  

  TIM2_CCMR2=0;

//  TIM2_CCMR2=0x00;//IC1PSC=0 输入信号不分频   

  TIM2_CCMR2 |=0x02;//  TIM2_CCMR2_CC2S=0x2

/*  00: CC2 channel is configured as output

    01: CC2 channel is configured as input, IC2 is mapped on TI2FP2

    10: CC2 channel is configured as input, IC2 is mapped on TI1FP2

    11:CC2 channel is configured as input, IC2 is mapped on TRC    */


  

  TIM2_CCER1_CC1P=0;//上升沿时发生捕获

  TIM2_CCER1_CC2P=1;//下降沿时发生捕获

  

  TIM2_SMCR=0x54;//

//  TIM2_SMCR_TS=0x05;//101 iput 1(TI1FP1) 头文件有错误

//  TIM2_SMCR_SMS=0x04;//复位触发模式

  

  TIM2_CCER1_CC1E=1;//使能捕获功能

  TIM2_CCER1_CC2E=1;//使能捕获功能

  

  TIM2_IER_CC1IE=1;//开启捕获中断

  TIM2_IER_CC2IE=1;//开启捕获中断

  TIM2_CR1_CEN=1;//开启计数

}

void main(void)

{

  static  float  tmp=0;

  CLOCK_Init();

  TIMER2_Init();

  asm("rim");               //enable interrupts

  while(1)

  {

    if(f_finish==0x01)

    {

      //1000000us/2000000=0.5us

      //测量到的周期为 0.5us*59=29.5us

      //测量到的周期为 1000000us/29.5us=33.898KHz

      //实际CCO输出的频率为32.768KHz

      tmp=1000/((float)tim2_ccr1*0.5);//tmp的值为测量到的频率

      f_finish=0;

      asm("nop");

    }

//    asm("wfi");

  }

}

#pragma vector=TIM2_CAPCOM_CC1IF_vector

__interrupt void TIM2_CAPCOM_CC1IF_ISR (void)

{

   if(TIM2_SR1_CC1IF)

   {

     tim2_ccr1=TIM2_CCR1H;

     tim2_ccr1<<=8;

     tim2_ccr1+=TIM2_CCR1L;

     TIM2_SR1_CC1IF=0;//清除中断标志位

     f_finish=1;

     //tim2_ccr1得到的时间为整个周期的时间

   }

   else if(TIM2_SR1_CC2IF)

   {

     tim2_ccr2=TIM2_CCR2H;

     tim2_ccr2<<=8;

     tim2_ccr2+=TIM2_CCR2L;

     TIM2_SR1_CC2IF=0;//清除中断标志位

     //tim2_ccr2得到的时间为高电平持续时间

   }

}

使用特权

评论回复
11
stly| | 2021-11-20 23:47 | 只看该作者

单步运行有时候看到的寄存器状态不是真实状态

使用特权

评论回复
12
dingy| | 2021-11-20 23:49 | 只看该作者
解决问题了吗

使用特权

评论回复
13
llljh|  楼主 | 2021-11-20 23:52 | 只看该作者
这种寄存器能读出来?

使用特权

评论回复
14
wenfen| | 2021-11-20 23:54 | 只看该作者
看的我头晕啊

使用特权

评论回复
15
llljh|  楼主 | 2021-11-20 23:56 | 只看该作者

唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
16
qyt| | 2021-11-24 09:40 | 只看该作者
找原子的的程序移植一下

使用特权

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

本版积分规则

855

主题

11301

帖子

6

粉丝