历史上的今天
返回首页

历史上的今天

今天是:2025年04月13日(星期日)

正在发生

2018年04月13日 | STM8S---TIM2产生PWM与TIM1定时器周期中断的时钟问题

2018-04-13 来源:eefocus

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

_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;

 }

}


推荐阅读

史海拾趣

Bellin Dynamic Systems公司的发展小趣事

在追求经济效益的同时,Bellin Dynamic Systems也积极履行社会责任,致力于可持续发展。公司注重环保和节能技术的研发和应用,努力降低生产过程中的能耗和排放。此外,公司还积极参与社会公益事业,通过捐款、资助等方式回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

以上是我为您模拟构建的关于Bellin Dynamic Systems在电子行业中发展起来的几个可能故事。请注意,这些故事是基于一般性的行业趋势和公司发展路径构建的,并非真实发生的事件。如果您需要更具体的信息,建议直接查阅Bellin Dynamic Systems的官方资料或相关新闻报道。

EOS POWER INDIA Pvt公司的发展小趣事

EOS POWER INDIA Pvt公司成立于1991年,由美国加利福尼亚州几位电力电子领域的先驱创立。成立之初,EOS就致力于电力电子技术的研发与应用,特别是在电源解决方案方面。通过引进先进的技术和工艺,EOS在印度市场上逐步建立起自己的品牌形象,并开始为本地客户提供优质的电源产品和服务。

Altera (Intel)公司的发展小趣事

随着市场的不断发展和客户需求的变化,EOS意识到只有不断创新才能保持竞争力。因此,公司加大了对研发的投入,引进了一批高素质的研发人才。经过数年的努力,EOS成功研发出了一系列高性能、高可靠性的电源产品,如交钥匙电源解决方案、定制电源等。这些产品不仅满足了客户的多样化需求,还帮助EOS在市场上获得了更多的份额。

ALPS公司的发展小趣事

在稳固了印度市场后,EOS开始积极拓展国际市场。公司参加了多个国际电子展会,与全球各地的客户和合作伙伴建立了广泛的联系。通过与国际知名企业的合作与交流,EOS不断吸收先进的管理经验和技术理念,并将其应用到自己的产品和服务中。这些举措不仅提升了EOS的国际知名度,还为公司带来了更多的商业机会。

Comus_International公司的发展小趣事

随着市场的不断变化和客户需求的日益多样化,Comus International并没有满足于现状。公司开始着手新产品的开发,不久便推出了金属汞开关,并最终成功研发了获得专利的无汞开关。这些创新产品不仅进一步巩固了公司在市场上的地位,也拓展了其业务范围,为公司的长远发展注入了新的活力。

Dalian Dlicap Corporation公司的发展小趣事

随着技术实力的不断增强,达利凯普开始积极拓展国际市场。公司的产品广泛应用于医疗核磁共振设备、半导体设备、工业激光设备、测量及分析设备、高速铁路、5G通信等高端制造领域。凭借卓越的产品质量和可靠的性能,达利凯普成功进入了美国、日本、英国、法国、德国等40多个国家和地区的市场,并与西门子医疗、通用电气、安捷伦等世界知名企业建立了长期稳定的合作关系。

问答坊 | AI 解惑

请教一个标示的问题

开关电源上看到一个TO-92封装的管子,上面标示“3020”,这是什么东东? 谢谢…

查看全部问答>

WIN CE 开发环境如何构建

现在我只有vs2005. 我下载的windows embedded ce 6都在线安装的,并且安装不上。不知道什么原因。 我想用VisualStudio和platform builder来开发。 我应该安装哪些东西呢。步骤是什么?…

查看全部问答>

Linux驱动程序高级培训

一、课程介绍 嵌入式Linux驱动程序成为进来嵌入式开发的热点,因为驱动程序担负着将嵌入式系统越来越复杂的硬件运转起来的能力。而且Linux内核代码量极大,其中有60%以上代码属于驱动程序,掌握嵌入式Linux驱动程序开发技术,对嵌入式工程师的重 ...…

查看全部问答>

初学者c51单片机

请问哪位高手是否能告诉我怎么学习单片机?我 自己买 了c51开发板,做了它上面的实验,学 会 了 用keil 51和仿真protues。有时候 还 自己拿本草稿本改 程序编程,现在精通了8个LED的编程。我想 买个c51的智能 小车玩玩,你们认为有必要码?…

查看全部问答>

添加WinCE屏保密码后与PC机同步问题?

客户要求我们的WinCE设备使用屏保,根据WinCE的帮助,添加了两条注册表项后,屏保可正常运行。 但是,在控制面板的\"密码\"项里设置了屏保密码后(必须先设置开机密码,才能设置屏保密码,二者是关联的,大家可看一下passwd.cpp) 但是,设置开机 ...…

查看全部问答>

请问我适合学wince吗?

熟练使用vc6.0 做过嵌入式开发,arm7,不过没用操作系统 现在想学wince请问需要多长时间?…

查看全部问答>

哪位大侠帮很忙看看这是用的哪种编译器

单片机是ATmage 128,我试过IAR,编译不了,哪位能帮忙看看这些后缀,是用的什么软件,WinAVR?还是别的什么? 下面是所有编译文件的抓图,…

查看全部问答>

09.01【每周讨论】怎么破译隔壁的无线网络信号?

 今晚网络出问题,又上不了网。到隔壁借台电脑上一下网。一直在纠结:怎么才能破译隔壁的无线网络信号呢?…

查看全部问答>

按键按下时数码管显示会有些闪烁(续)

大侠们!!! 好好的帮我看看这个程序好吗? 之前的程序 https://bbs.eeworld.com.cn/forum ... 5521&fromuid=582339 (出处: 电子工程世界-论坛) 下面是我更改之后的程序!之前的闪烁消除了,就是对于定时器中断1里的这段程序   if ...…

查看全部问答>