完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在学习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,应该不受这个限制,有那个大神对这个比较了解的,望回复,折腾我两天了,还没搞定。 |
|
相关推荐
1个回答
|
|
STM8L153R8T6定时器采用外部时钟计数始终是4分频的原因可能是由于定时器的输入时钟频率与定时器的计数器分辨率之间的不匹配。在STM8L系列单片机中,定时器的计数器分辨率通常为16位,这意味着它可以计数的最大值为65535。当外部时钟频率较高时,计数器可能无法在每个时钟周期内更新其值,从而导致计数值是实际频率的1/4。
为了解决这个问题,你可以尝试以下方法: 1. 调整外部时钟频率:降低外部时钟频率,使其与定时器的计数器分辨率相匹配。这样可以确保定时器能够准确地计数每个时钟周期。 2. 使用预分频器:在定时器配置中使用预分频器,可以降低输入时钟频率,从而减少计数误差。例如,如果你的外部时钟频率为1MHz,可以使用预分频器将其降低到250kHz,这样计数误差将减少到1/4。 3. 修改定时器配置:检查你的定时器配置代码,确保你正确设置了定时器的工作模式、时钟源和分频器。以下是一些可能需要检查的配置: - 确保定时器工作在外部时钟模式。 - 检查定时器的时钟源是否正确设置为外部时钟。 - 检查定时器的分频器设置,确保它与你的外部时钟频率相匹配。 4. 优化中断服务函数:在你的中断服务函数中,确保你正确地清除了中断标志,并在每次中断中更新了定时器的计数值。 5. 检查硬件连接:确保外部时钟信号的硬件连接正确,没有受到干扰或损坏。 通过以上方法,你应该能够解决STM8L153R8T6定时器采用外部时钟计数始终是4分频的问题。如果问题仍然存在,请仔细检查你的代码和硬件连接,或者寻求STM8L系列单片机的技术支持。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1804 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1097 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
736 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1686 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
748浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
582浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 20:15 , Processed in 0.886988 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号