STM8S---TIM2产生PWM与TIM1定时器周期中断的时钟问题

原创 2015年07月08日 12:48:57

1 问题

  在下面的测试程序中,如果将Init_CLK()函数中的 CLK_CKDIVR |= 0x08;去掉’|‘,则TIM1的功能实现跟预设定相同(10ms中断一次),但是TIM2的PWM频率就变高了;如果加上,则TIM2的功能实现跟预设定相同(产生1Hz的PWM),但是TIM1的周期就变长了;
  尝试了很多测试,均无效(买的开发板和另一块gs自画板测试也都一样)。

2 尝试

  因为STM8S默认使用内部16M高速RC振荡器,且8分频,则系统启动主时钟为2M。即CLK_CKDIVR = 0X18;,如果再去赋值CLK_CKDIVR |= 0X08; 则主时钟还是不变即0X18,但是如果赋值为CLK_CKDIVR = 0X08;,则主时钟就会改变,变为8M。但是TIM1和TIM2的Fmaster时钟应该是一样的,这样的赋值应该会对TIM1和TIM2都会产生影响,但是两个赋值不同,实现功能的配置正确,而总只有一个能按预设定工作,这到底是怎么回事呢?
  发现设置为CLK_CKDIVR = 0X08时(8M),TIM1能按预设定工作,而TIM2的工作频率却明显快了,像是快了一倍,带着这个发现,我就将现在的TIM2的Fmaster时钟频率当做为TIM1的一倍,即16M,再去重新配置TIM2的寄存器,再编译、下载进单片机,居然和TIM1实现的功能相同了。这又到底是怎么回事呢?难道TIM2的Fmaster时钟总是TIM1的Fmaster时钟的一倍吗?又去尝试几种不同的CLK_CKDIVR(当然则TIM1的Fmaster频率不能超过8M)。
  接下来测试了 CLK_CKDIVR = 0X10;(4M), CLK_CKDIVR = 0X18;(2M)均是如此。是不是猜想正确了,还是想不明白是怎么回事。看着STM8S的时钟树怎么也想不明白。

3 测试程序

/* MAIN.C file
function    :   TIM1定时器周期中断实现LED1周期为2S的亮灭;TIM2用PWM波实现同样的功能;
      TIM1 10ms定时器周期中断;
      TIM2_CH3 PD2 输出周期为1Hz的PWM;
problem  :
      (1) 在时钟初始化函数Init_CLK()里,|= 与=的问题,加上‘|’
      与不加,TIM1和TIM2总有其中一个跟预期实现不一样。
 */

#include<stm8s003f3p.h>
_Bool PD2 @PD_ODR:2;
_Bool PC7 @PC_ODR:7;
#define LED1 PD2
#define LED2 PC7
void Init_CLK(void)
{
 //当是'|='时,实际CLK = 2M
 //当是' ='时,实际CLK = 8M
 CLK_CKDIVR = 0X08;
}
void Init_GPIO(void)
{
 /*LED/PWM 配置为推挽输出*/
 PD_DDR |= 0X04;     //PD2--PWM输出---连接LED1
 PD_CR1 |= 0X04;
 PD_CR2 &= 0XFD;

 PC_DDR |= 0X80;     //PC7---LED2;
 PC_CR1 |= 0X80;
 PC_CR2 &= 0X7F;
}
void Init_TIM1(void)
{
 _asm("sim");
 TIM1_IER = 0x00;
 TIM1_CR1 = 0x00;
 TIM1_EGR |= 0x01;
 TIM1_PSCRH = 199/256; //2M系统时钟经预分频f=fck/(PSCR+1) TIM1 为16位分频器
 TIM1_PSCRL = 199%256; //f=8M/(199+1)=40000Hz,每个计数周期1ms

 TIM1_CNTRH = 0x00;
 TIM1_CNTRL = 0x00;

 TIM1_ARRH = 400/256;  // 自动重载寄存器ARR=400
 TIM1_ARRL = 400%256;  // 每记数400次产生一次中断,即10ms
 TIM1_CR1 |= 0x81;
 TIM1_IER |= 0x01;
}
/*TIM1---8M   TIM2---4M*/
void Init_TIM2(void)
{
 //TIM2_IER = 0x00;      //禁止各种中断
 //TIM2_EGR |= 0X01;     //如果要 新的 预分频值生效,必须产生更新事件

 TIM2_CCMR3 |=  0X60;    //设置定时器2三通道(PD2)输出比较三模式
 TIM2_CCMR3 |= 0X08;     //输出比较3预装载使能

 TIM2_CCER2 |= 0x03;     //通道3使能,低电平有效,配置为输出

 //初始化时钟分频器为1,即计数器的时钟频率为Fmaster=8M/128=0.0625MHZ
 TIM2_PSCR = 0X07;
 //初始化自动装载寄存器,决定PWM 方波的频率,Fpwm=0.0625M/62500=1HZ
 TIM2_ARRH = 62500/256;
 TIM2_ARRL = 62500%256;
 //初始化比较寄存器,决定PWM 方波的占空比:50%
 TIM2_CCR3H = 31250/256;
 TIM2_CCR3L = 31250%256;
 //启动计数;更新中断失能
 TIM2_CR1 = 0x01;
}
main()
{
 Init_CLK();
 Init_GPIO();
 Init_TIM1();
 Init_TIM2();
 LED1 = 1;LED2 = 1;
 _asm("rim");
 while (1);
}
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
 static unsigned int i = 0;

 TIM1_SR1 &=~(0x01);
 ++i;
 if(100 == i){
  LED2 = ~LED2;
  i = 0;
 }
}
版权声明:本文为博主[原创]文章,未经博主允许可以转载,注明博客出处:[http://blog.csdn.net/FreeApe]

STM32普通定时器(TIM2-7)的时钟源

【问题】 STM32F103的APB1最大总线时钟是AHB总线时钟的1/2,最大为36MHz,在用ST的库函数(v2.0)的时候,TIM2(普通定时器)的时钟频率为72MHz,不知道原因何在? 【...
  • hgsdfghdfsd
  • hgsdfghdfsd
  • 2015年09月15日 11:31
  • 2211

STM32普通定时器(TIM2-7)的时钟源疑问

【问题】 STM32F103的APB1最大总线时钟是AHB总线时钟的1/2,最大为36MHz,在用ST的库函数(v2.0)的时候,TIM2(普通定时器)的时钟频率为72MHz,不知道原因何在? ...
  • minyuanxiani
  • minyuanxiani
  • 2014年04月11日 18:44
  • 2763

STM8程序,时钟配置,串口,定时器等

  • 2017年09月14日 23:23
  • 8.69MB
  • 下载

STM8S TIM1时钟分频

  • lan120576664
  • lan120576664
  • 2014年03月30日 23:49
  • 1432

STM8的TIM1定时器简单使用

STM8的TIM1定时器简单使用 STM8的TIM1是16位高级控制定时器,简单的定时溢出中断。功能实现LED1亮500ms,灭500ms,循环往复。 #i nclude ...
  • king110108
  • king110108
  • 2015年04月28日 21:17
  • 7426

STM32学习笔记——高级定时器TIM1更新中断配置

stm32高级定时器TIM1,更新中断初始化配置和普通定时器差别不大,需要注意的是结构TIM_TimeBaseInitTypeDef中TIM_RepetitionCounter配置问题。TIM_Rep...
  • qq_14997473
  • qq_14997473
  • 2015年07月18日 15:47
  • 12867

STM8S定时器基本中断定时

STM8S的定时器分三类; 高级定时器TIM1 通用定时器TIM2,TIM3,TIM5 基本定时器TIM4,TIM6其中除TIM4和TIM6是8位定时器外,其他的定时器都是16位计数的。 ...
  • LHChandsome
  • LHChandsome
  • 2017年09月26日 16:44
  • 793

stm8时钟库函数

  • 2014年03月18日 06:43
  • 175KB
  • 下载

STM8S---定时器产生PWM(TIM2)

说明 代码1 说明 采用STM8S内部时钟(HSI); PWM模式2; 占空比为50%,频率为2Hz(方便测试LED灯); PD2口外接LED灯,PD2口输出PWM波; 系统时钟初始化很重要:CLK_...
  • FreeApe
  • FreeApe
  • 2015年07月06日 18:56
  • 5173

STM32CubeMX:基本定时器

芯片:STM32F103C8T6 应用管脚: 输出:PA0、PA1 TIM3 实现1ms定时功能,系统TIMx_CNT=8MHZ=8000 000HZ,设置TIMx_PSC=800-1,那么T...
  • anchises
  • anchises
  • 2016年08月03日 11:06
  • 4160
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STM8S---TIM2产生PWM与TIM1定时器周期中断的时钟问题
举报原因:
原因补充:

(最多只允许输入30个字)