打印
[STM8]

STM8严重时钟问题

[复制链接]
3068|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
11yichengming|  楼主 | 2015-7-8 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 11yichengming 于 2015-7-8 09:32 编辑

/* MAIN.C file
function : TIM1定时器周期中断实现LED1周期为2S的亮灭;TIM2用PWM波实现同样的功能;
      TIM1 10ms定时器周期中断;
      TIM2_CH3 PD2 输出周期为1Hz的PWM;
problem  :
      (1) 使用默认的内部2M时钟,实现同样的功能上频率不一样;

      (2) 单独测试TIM1和TIM2实现的功能是按预期设定来的;
*/


#include<stm8s003f3p.h>
_Bool PD2 @PD_ODR:2;
_Bool PC7 @PC_ODR:7;
#define LED1 PD2
#define LED2 PC7

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 = 49/256; //2M系统时钟经预分频f=fck/(PSCR+1) TIM1 为16位分频器
TIM1_PSCRL = 49%256; //f=2M/(49+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;
}
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=2M/64=0.125MHZ
TIM2_PSCR = 0X05;
//初始化自动装载寄存器,决定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_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;
}
}

来自 2楼
11yichengming|  楼主 | 2015-7-8 10:31 | 只看该作者
mmuuss586 发表于 2015-7-8 09:57
同一个时钟源,2个定时器输出,差别应该很小的;
差别大,基本程序问题;

试过了,看了STM8S的时钟树,对这个问题怎么也想不明白,但是规律是出来了,就是TIM2的Fmaster时钟是TIM1的Fmaster时钟的两倍,当然前提是不能超过16M(使用内部高速RC振荡器)。

使用特权

评论回复
板凳
mmuuss586| | 2015-7-8 09:55 | 只看该作者
那你实际测试,差多少呢?
有没有什么规律;

使用特权

评论回复
地板
mmuuss586| | 2015-7-8 09:57 | 只看该作者
同一个时钟源,2个定时器输出,差别应该很小的;
差别大,基本程序问题;

所以看下有没什么规律,差多少倍;
多换几个频率点测试看看;

使用特权

评论回复
5
amanda_s| | 2015-7-8 17:48 | 只看该作者
楼主的问题是什么?单独配置TIM1,TIM2都可以正常工作。但同时工作就有问题?实际频率和设置的不一样?

使用特权

评论回复
6
lefeng| | 2015-7-8 19:10 | 只看该作者
差多少,有什么规律

使用特权

评论回复
7
11yichengming|  楼主 | 2015-7-9 19:45 | 只看该作者
lefeng 发表于 2015-7-8 19:10
差多少,有什么规律

blog点csdn点net斜杠freeape斜杠article斜杠details斜杠46802003   我在博客中具体讲解了,而且做了实验。

使用特权

评论回复
8
11yichengming|  楼主 | 2015-7-9 19:51 | 只看该作者
amanda_s 发表于 2015-7-8 17:48
楼主的问题是什么?单独配置TIM1,TIM2都可以正常工作。但同时工作就有问题?实际频率和设置的不一样? ...

TIM1 和TIM2配置时钟即CLK_CKDIVR = 0X08; 或CLK_CKDIVR |= 0X08;然后单独测试,是都可以的,但是如果整合的话就有问题了,我在博客里详细的讲了下,  blog点csdn点net斜杠freeape斜杠article斜杠details斜杠46802003

使用特权

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

本版积分规则

2

主题

14

帖子

0

粉丝