你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8L153R8T6定时器采用外部时钟计数始终是4分频,不知道原因

[复制链接]
zxdsccd 提问时间:2018-4-24 23:06 /
本帖最后由 zxdsccd 于 2018-4-27 01:42 编辑

最近在学习STM8L的单片机,其他功能都搞定了,就定时器一直搞不定,采用内部时钟计数和PWM输出都正常,但采用外部时钟计数时,计数值老是外部频率的1/4,一直找不到原因程序如下
#pragma vector = TIM3_OVR_UIF_vector
__interrupt void EXIT_TIM3_OVR(void)     //中断服务函数  
            {  
             TIM3_SR1_UIF=0;//清除中断标志
            PG_ODR^=0x01;//输出电频翻转
            }

#pragma vector = TIM5_OVR_UIF_vector
__interrupt void EXIT_TIM5_OVR(void)     //中断服务函数  
            {  
             TIM5_SR1_UIF=0;//清除中断标志
            PG_ODR^=0x01;//输出电频翻转
            }
void port_init(void)                 {      
      PC_DDR=0x00;//引脚全为输入,带32k管脚和I2C,PC2双人控制,
     PC3 ON/OFF,PC4记忆,PC7设置        
     PC_CR1=0xff;//输入上拉        
     PC_CR2=0x08;//PC3电平中断允许,ON/OFF               
     PD_ODR=0x00;//数据输出寄存器,对应输出端口电平        
     PD_DDR=0x80;//PD7位电机驱动,其他引脚全为输入,PD4,PD5为COM4,COM5,其他引脚悬空      
     PD_CR1=0xff;//推挽输出,输入上拉        
     PD_CR2=0x00;//禁止外部中断               
     PE_ODR=0x00;//数据输出寄存器,对应输出端口电平      
     PE_DDR=0x40;//PE6为输出驱动电磁阀,其他引脚全为输入      
     PE_CR1=0x7f;//推挽输出,输入上拉,PE7浮空        
     PE_CR2=0x00;//输出模式最大2MHZ               
     PF_DDR=0x00;//输引脚全为输入,PD4,PD5为COM4,COM5,其他引脚悬空      
     PF_CR1=0xff;//输入上拉        
     PF_CR2=0x00;//禁止外部中断               
     PG_ODR=0x00;//输出脚输出低电平      
     PG_DDR=0x07;//1.2引脚为稳压开关,其他引脚全为输入,        
    PG_CR1=0xf7;//输入上拉 PG3浮空输入TIM3_ETR      
    PG_CR2=0x00;//禁止外部中断              
  }
void TIM3_Init(void)
         {
        CLK_PCKENR1_PCKEN11=1;//开启定时器3外设时钟
        SYSCFG_RMPCR2=0x40;//TIM3_ETR重映射到PG3
        TIM3_CR1   = 0x84; // 允许自动重载,禁止更新中断,允许溢出中断
        TIM3_ARRH  = 0x00;// 自动重载寄存器
        TIM3_ARRL  = 0xff;// 计数达到该值即重头开始计数,(更新)255
        TIM3_ETR   = 0x60;//外部时钟使能,下降沿或低电平触发,不分频,无滤波
        TIM3_IER_UIE   = 1; // 允许更新中断
        TIM3_EGR_UG = 1;//更新设置
       }
void TIM5_Init(void)
        {
        CLK_PCKENR3_PCKEN31=1;//开启定时器5外设时钟
        TIM5_CR1   = 0x84; // 允许自动重载,禁止更新中断,允许溢出中断
        TIM5_ARRH  = 0x13;// 自动重载寄存器5000
        TIM5_ARRL  = 0x88;// 计数达到该值即重头开始计数,(更新)
        TIM5_ETR   = 0x60;//外部时钟使能,下降沿或低电平触发,不分频,无滤波
        TIM5_IER_UIE   = 1; // 允许更新中断
         TIM5_EGR_UG = 1;//更新设置
        }
void CLOCK_Init(unsigned char i)
      {   
     if(i==1)//高频运行         
          {         
          CLK_ICKCR|=0x04;//开启内部低速时钟         
         CLK_CRTCR=0x10;//RTC时钟,采用外部低速时钟,不分频           
         CLK_SWR=0x04;//选择外部高速晶振为主时钟            
         CLK_SWCR|=0x02;//切换时钟源         
         CLK_CKDIVR=0x00; //12MHZ不分频         
         }   
else  //低频运行         
        {        
         CLK_ICKCR|=0x04;//开启内部低速时钟         
        CLK_CRTCR=0x10;//RTC时钟,采用外部低速时钟,不分频           
        CLK_SWR=0x08;//选择外部低速振荡器为主时钟              
        CLK_SWCR|=0x02;//切换时钟源         
        CLK_CKDIVR=0x00; //32k不分频        
        }
}

void main(void)
          {
           asm("sim");
           CLOCK_Init(1);//高频运行,外部晶振12MHZ
           port_init();//端口设置
           TIM5_Init();//初始化tim5
           asm("rim");//开全局中断
           //TIM3_CR1_CEN= 1;
           TIM5_CR1_CEN= 1;
           while(1);
        }


按上面的程序运行,在TIM5_ETR脚输入3.2MHZ的时钟,理论上PG0的输出频率应该是,3200000/5000/2=320HZ,但是用示波器测量PG0的输出频率为80HZ,差了四倍。如果换用内部时钟输出脉冲频率和理论值完全一样,找不到问题出在哪。

手册上有这么一段,提到了需要是系统时钟的1/4;手册如下:
Bit 4 TIM3TRIGLSE_REMAP: TIM3 trigger controlled by LSE
TIM3 trigger controlled by the LSE oscillator.
0: TIM3_TRIG mapped as defined in the TIM3TRIG_REMAP1 bit
1: TIM3_TRIG mapped on OSC32_IN (LSE oscillator input)
Note: When the TIM2TRIGLSE_REMAP or TIM3TRIGLSE_REMAP are set, the ETR prescaler of
the corresponding timer must be set to have a ratio of at least 4 with respect to the selected
system clock.
LSE needs to be properly switched on as defined in the CLK configuration registers.
Bit 3 TIM2TRIGLSE_REMAP: TIM2 trigger controlled by LSE
TIM2 trigger controlled by the LSE oscillator.
0: TIM2_TRIG mapped as defined in the TIM2TRIG_REMAP bit
1: TIM2_TRIG mapped on OSC32_IN (LSE oscillator input)
Note: When the TIM2TRIGLSE_REMAP or TIM3TRIGLSE_REMAP are set, the ETR prescaler of
the corresponding timer must be set to have a ratio of at least 4 with respect to the selected
system clock.
LSE needs to be properly switched on as defined in the CLK configuration registers.


但是我这两位设置的都是0,应该不受这个限制,有那个大神对这个比较了解的,望回复,折腾我两天了,还没搞定。



收藏 评论4 发布时间:2018-4-24 23:06

举报

4个回答
wenyangzeng 回答时间:2018-4-25 07:20:42
TIM3和TIM5中断都操作同一个IO口PG0。如何得到正确的测试结果?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

zxdsccd 回答时间:2018-4-27 01:26:16
程序排版比较乱,重排了一下,楼上的估计没仔细看程序,两个定时器没有同时开的,只开了一个,另一个注释掉了,两个都写上取是方便两个定时器切换试验用的
kim66 回答时间:2018-8-5 14:35:21
我今天也碰到这个问题,最后在STM8的库函数里看到这句
  1.   /* Generate an update event to reload the Prescaler value immediately */
  2.   TIM3->EGR = TIM3_EventSource_Update;
复制代码

我加了之后就正常了,我用的是系统时钟,然后分频

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

q125028120 回答时间:2018-8-15 10:13:38
你好,可以请教一下是如何学习的吗
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版