[STM8] STM8S103输入捕获的调试寄存器

[复制链接]
1627|7
 楼主| lwx741114 发表于 2018-5-23 13:36 | 显示全部楼层 |阅读模式
STM8S 输入捕获程序 ,为什么调试时查看的TIM1_CCMR1寄存器,显示的是输出设置的寄存器:OC1IE,OC1M,OC1FE,CC1S,而不是输入设置的寄存器:IC1F,IC1PSC,CC1S,是程序有问题?还是在哪个地方调出来?
yiyigirl2014 发表于 2018-5-23 17:11 | 显示全部楼层
定时器输出吧。捕获的当然需要定时器配置了。
mmuuss586 发表于 2018-5-23 18:06 | 显示全部楼层
看CCR1,CCR2寄存器
 楼主| lwx741114 发表于 2018-5-23 18:55 | 显示全部楼层
    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:允许计数
*****************************************************************************************************/   
}
 楼主| lwx741114 发表于 2018-5-23 18:56 | 显示全部楼层
上面是配置程序
 楼主| lwx741114 发表于 2018-5-23 19:01 | 显示全部楼层
这个是硬件仿真时寄存器状况,进入了捕获服务程序中的CC1IF,CC2IF看不到置1.
257505b0549361c28b.png
 楼主| lwx741114 发表于 2018-5-23 19:03 | 显示全部楼层
TIM1_CCMR1下面不是输入捕获的寄存器,而是配置为输出的情况。
wahahaheihei 发表于 2018-5-23 21:26 | 显示全部楼层
  1. /*硬件连接*/

  2. // PB0<----PC4

  3. /****************************************************************************************

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

  5. *硬件平台:STM8L-DISCOVERY

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

  7. *作    者:茗风

  8. ****************************************************************************************/

  9. #include"iostm8l152c6.h"

  10. #include"stdint.h"

  11. uint16_t tim2_ccr1=0,tim2_ccr2=0;

  12. uint8_t  f_finish=0;

  13. /******************************************************************************************************

  14. *  名    称:void CLOCK_Init(void)

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

  16. *  入口参数:无

  17. *  出口参数:无

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

  19. *  范    例:无

  20. ******************************************************************************************************/

  21. void CLOCK_Init(void)

  22. {

  23.    PC_CR1_C14  =1;//推挽输出

  24.    PC_CR2_C24  =1;//高速输出

  25.    PC_DDR_DDR4 =1;//PC4输出

  26.    

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

  28.    

  29.    /*

  30.   *0x00 CCO divided by 1

  31.   *0x01 CCO divided by 2

  32.   *0x02 CCO divided by 4

  33.   *0x03 CCO divided by 8

  34.   *0x04 CCO divided by 16

  35.   *0x05 CCO divided by 32

  36.   *0x06 CCO divided by 64

  37.   *0x07 CCO divided by 64

  38.   */     

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

  40.    /*

  41.   *0x01 HSI clock output clock source

  42.   *0x02 LSI clock output clock source

  43.   *0x04 HSE clock output clock source

  44.   *0x08 LSE clock output clock source

  45.   */   

  46. }

  47. /******************************************************************************************************

  48. *  名    称:void TIMER2_Init(void)

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

  50. *  入口参数:无

  51. *  出口参数:无

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

  53. *  范    例:无

  54. ******************************************************************************************************/

  55. void TIMER2_Init(void)

  56. {

  57.   PB_DDR_DDR0 =0;//输入

  58.   PB_CR1_C10  =0;//浮空输入

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

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

  61.   

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

  63.   

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

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

  66.   

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

  68. //  TIM2_ARRH=0;

  69. //  TIM2_ARRL=100;

  70.   

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

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

  73.   

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

  75.   

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

  77.   

  78.   TIM2_CR1_DIR=0;//向上计数

  79.   

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

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

  82.   

  83.   TIM2_CCMR1=0;

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

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

  86.   /*00: CC1 channel is configured as output

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

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

  89.     11: Reserved                                                    */

  90.   

  91.   TIM2_CCMR2=0;

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

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

  94. /*  00: CC2 channel is configured as output

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

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

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


  98.   

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

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

  101.   

  102.   TIM2_SMCR=0x54;//

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

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

  105.   

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

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

  108.   

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

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

  111.   TIM2_CR1_CEN=1;//开启计数

  112. }

  113. void main(void)

  114. {

  115.   static  float  tmp=0;

  116.   CLOCK_Init();

  117.   TIMER2_Init();

  118.   asm("rim");               //enable interrupts

  119.   while(1)

  120.   {

  121.     if(f_finish==0x01)

  122.     {

  123.       //1000000us/2000000=0.5us

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

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

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

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

  128.       f_finish=0;

  129.       asm("nop");

  130.     }

  131. //    asm("wfi");

  132.   }

  133. }

  134. #pragma vector=TIM2_CAPCOM_CC1IF_vector

  135. __interrupt void TIM2_CAPCOM_CC1IF_ISR (void)

  136. {

  137.    if(TIM2_SR1_CC1IF)

  138.    {

  139.      tim2_ccr1=TIM2_CCR1H;

  140.      tim2_ccr1<<=8;

  141.      tim2_ccr1+=TIM2_CCR1L;

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

  143.      f_finish=1;

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

  145.    }

  146.    else if(TIM2_SR1_CC2IF)

  147.    {

  148.      tim2_ccr2=TIM2_CCR2H;

  149.      tim2_ccr2<<=8;

  150.      tim2_ccr2+=TIM2_CCR2L;

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

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

  153.    }

  154. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

63

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部