历史上的今天
返回首页

历史上的今天

今天是:2024年11月10日(星期日)

正在发生

2021年11月10日 | STM8S003定时器1中断服务程序(PWM)中开启定时器2定时计数

2021-11-10 来源:eefocus

STM8S003定时器1中断服务程序(PWM)中开启定时器2定时定时功能,那么在定时器1中断服务程序退出时,立即就产生了定时器2更新中断,但是轴定时器2中断服务程序中(PWM),开启定时器2定时功能,却工作正常,何故?
这是定时器1中断服务程序的开启定时器2的代码:
                //TIM2_Cmd(DISABLE);
                TIM2->CR1 &= (uint8_t)(~TIM2_CR1_CEN);
                //TIM1_Cmd(DISABLE);
                TIM1->CR1 &= (uint8_t)(~TIM1_CR1_CEN);
                gsMOTOR.ucPulseCnt = 0;                    
                TIM2_CNTR = 0;
                TIM1_CNTR = 0;
                TIM2_OC2PreloadConfig(DISABLE);
                //TIM1_ForcedOC2Config(TIM1_FORCEDACTION_ACTIVE);
                //TIM1_ForcedOC3Config(TIM1_FORCEDACTION_ACTIVE);
               // TIM2_ForcedOC1Config(TIM2_FORCEDACTION_ACTIVE);
               // TIM1_ForcedOC1Config(TIM1_FORCEDACTION_ACTIVE);
                TIM1_CCMR1 = 0x0;
                TIM1_CCMR2 = 0x58;
                TIM1_CCMR3 = 0x50;
                TIM2_CCMR1 = 0x58;
                TIM2_CCMR2 = 0x00;     
                TIM2_CCER1 = 0x01;
                TIM2_CR1 = 0x0C;
                //TIM2_TimeBaseInit(TIM2_PRESCALER_2, gsMOTOR.uiPulseDelay);
                TIM2_PSCR = TIM2_PRESCALER_2;
                TIM2_ARR = gsMOTOR.uiPulseDelay << gsMOTOR.ucShifa;
                //TIM2_OC2Init(TIM2_OCMODE_TIMING, TIM2_OUTPUTSTATE_DISABLE, 0xFF00, TIM2_OCPOLARITY_HIGH);     //延时
                //TIM2_OC1Init(TIM2_OCMODE_TIMING, TIM2_OUTPUTSTATE_DISABLE, 0xFF00, TIM2_OCPOLARITY_HIGH);     //延时
                //TIM2_OC3Init(TIM2_OCMODE_TIMING, TIM2_OUTPUTSTATE_DISABLE, 0xFF00, TIM2_OCPOLARITY_HIGH);     //延时
                //TIM2_CCR2 = 0xFFFF;
                //TIM2_CCR1 = 0xFFFF;
                //TIM2_CCR3 = 0xFFFF;
                //TIM2->CCMR2 = 0x00;
                //TIM2->CCER1 = 0x03;
               
                gsMOTOR.ucTIM2Mode = TIM2_MODE_DELAY;
                //TIM1_Cmd(ENABLE);
                //TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE);
                //TIM2_EGR = 1;
                //TIM2_ClearFlag(TIM2_FLAG_UPDATE);
                TIM2_SR1 = 0;
                TIM2_SR2 = 0;
                TIM2_SR1 = 0;
                TIM2_SR2 = 0;
                //TIM2_Cmd(ENABLE);
                TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
                TIM2->CR1 |= (uint8_t)TIM2_CR1_CEN;

这是定时器2中断服务程序中开启定时2定时功能的代码:
                    TIM2->CR1 &= (uint8_t)(~TIM2_CR1_CEN);
                    //TIM1_Cmd(DISABLE);
                    TIM1->CR1 &= (uint8_t)(~TIM1_CR1_CEN);
                    gsMOTOR.ucPulseCnt = 0;                    
                    TIM2_CNTR = 0;
                    //TIM2_ARRPreloadConfig(DISABLE);
                    TIM2_CR1 = 0x0C;
                    TIM2_OC2PreloadConfig(DISABLE);
                    TIM2_OC1PreloadConfig(DISABLE);
                    TIM2_OC3PreloadConfig(DISABLE);
                    //TIM1_ForcedOC2Config(TIM1_FORCEDACTION_ACTIVE);
                    //TIM1_ForcedOC3Config(TIM1_FORCEDACTION_ACTIVE);
                    //TIM2_ForcedOC1Config(TIM2_FORCEDACTION_ACTIVE);
                    //TIM1_ForcedOC1Config(TIM1_FORCEDACTION_ACTIVE);
                    TIM1_CCMR1 = 0x58;
                    TIM1_CCMR2 = 0x58;
                    TIM1_CCMR3 = 0x50;
                    TIM2_CCMR1 = 0x58;
                    TIM2_CCMR2 = 0x00;
                    
                    //TIM2_TimeBaseInit(TIM2_PRESCALER_1, gsMOTOR.uiPulseDelay);
                    TIM2_PSCR = TIM2_PRESCALER_2;
                    TIM2_ARR = gsMOTOR.uiPulseDelay << gsMOTOR.ucShifb;
                    
                    //TIM2_SetCompare1(0xFFFF);                                       //通道二也会一直在比较,只是不输出而已,因此需要将其设为最大值
                    TIM2_CCR1 = 0xFFFF;
                    TIM2_CCR3 = 0xFFFF;
                    TIM2_OC2Init(TIM2_OCMODE_TIMING, TIM2_OUTPUTSTATE_DISABLE, 0xFFFF, TIM2_OCPOLARITY_HIGH);     //延时
                    gsMOTOR.ucTIM2Mode = TIM2_MODE_DELAY;
                    //TIM1_Cmd(ENABLE);
                    TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE);
                    //TIM2_EGR = 0;
                    //TIM2_ClearFlag(TIM2_FLAG_UPDATE);
                    TIM2_SR1 = 0;
                    TIM2_SR2 = 0;
                    TIM2_SR1 = 0;
                    TIM2_SR2 = 0;
                    //TIM2_Cmd(ENABLE);
                    TIM2->CR1 |= (uint8_t)TIM2_CR1_CEN;


TIM2_ARR = gsMOTOR.uiPulseDelay << gsMOTOR.ucShifa;
的结果TIM2_ARR = 48000


问题已经解决,奇葩的问题:
把TIM2_ARR = gsMOTOR.uiPulseDelay << gsMOTOR.ucShifa;改成
   TIM2_ARRH = *((INT8U *)&gsMOTOR.uiPulseDelay);
   TIM2_ARRL = *(((INT8U *)&gsMOTOR.uiPulseDelay) + 1);
即先写高字节,再写低字节,问题解决!

推荐阅读

史海拾趣

Centellax Inc公司的发展小趣事

Centellax Inc公司自成立以来,一直致力于电子通信技术的研发与创新。在成立初期,公司凭借其独特的测试测量技术,在光通信行业中崭露头角。随着技术的不断迭代和市场的扩大,Centellax逐渐积累了大量的专利和知识产权,为公司的长期发展奠定了坚实的基础。

在技术创新方面,Centellax不断投入研发资源,推出了一系列高性能的测试测量设备。这些设备不仅满足了客户对高速器件深入分析的需求,还提升了公司在行业内的竞争力。同时,Centellax还积极与高校、研究机构等合作,共同推动电子通信技术的进步。

HCH Co公司的发展小趣事

背景:随着全球对环境保护和可持续发展的重视程度不断提高,HCH Co公司积极响应号召,开始了绿色转型之路。公司致力于开发环保型电子产品和绿色生产技术,以减少对环境的影响。

发展:通过不断的技术创新和生产工艺的改进,HCH Co公司成功推出了一系列环保型电子产品,如可回收材料制成的外壳、低功耗的显示屏等。同时,公司还加强了废弃电子产品的回收和再利用工作,实现了资源的循环利用。绿色转型不仅提升了公司的社会形象,也为公司的长期发展注入了新的动力。

永丰盈(CST)公司的发展小趣事

在稳步发展国内市场的同时,CST积极拓展国际市场。公司建立了分布世界各地的销售渠道,与多家国际知名企业建立了长期稳定的合作关系。通过不断的市场拓展和品牌建设,CST在国际市场上树立了良好的企业形象和品牌形象。

C&K公司的发展小趣事

近年来,C&K在保持开关业务稳定发展的同时,还积极寻求新的增长点。为此,公司宣布成立了一个新的部门——C&K航空航天部。这个新部门旨在将公司在开关领域的专业技术与航空航天领域的需求相结合,为客户提供更先进、更可靠的系统解决方案。这一举措不仅展示了C&K在技术创新方面的实力,也为其未来的发展打开了新的大门。

这五个故事从不同角度展现了C&K公司在电子行业中的发展历程和成就。从磁芯记忆到微型开关的转型、成为世界领先的开关制造商、被ITT Industries收购与保持独立品牌、通过收购扩大全球业务与制造能力以及成立航空航天部拓展新领域,每一个阶段都充满了挑战与机遇。正是凭借着对技术创新的执着追求和对市场需求的敏锐洞察,C&K得以在激烈的竞争中脱颖而出,成为电子行业中的佼佼者。

成都振芯/国腾(CORPRO)公司的发展小趣事

2010年,CORPRO在深交所创业板成功上市,成为当时国内“卫星导航第一股”。这一里程碑事件不仅提升了CORPRO的品牌知名度和市场影响力,也为公司后续的发展提供了更为广阔的资金来源和市场空间。上市后,CORPRO继续加大研发投入,推动技术创新和产品升级。

Eon公司的发展小趣事

在成立初期,E.ON面临着天然气产量下滑而消费量增长的挑战。为了应对这一局面,E.ON开始积极寻找天然气供应渠道,并与俄罗斯天然气工业集团(Gazprom)进行了多轮谈判。虽然初期合作并未如愿,但E.ON并未放弃,通过不断努力和策略调整,最终实现了与Gazprom的合作,为公司的天然气业务发展奠定了坚实基础。

问答坊 | AI 解惑

无形的屏幕

哇,我的电脑屏幕隐形了,成透明的了,这...这...怎么可能?淡定淡定,这不是灵异事件,奥秘来自于墙纸...厌倦了常规的墙纸当屏幕背景,那就看一下这一组怪异墙纸,它们会让你的屏幕变无形。但是事实是,屏幕还在,只不过是视觉欺骗了我们的感觉。 ...…

查看全部问答>

有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?

有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?芯片在哪买?…

查看全部问答>

能否根据windows驱动程序(release bin)编写linux驱动

有没有可能通过反编译等方式生成一个linux驱动 有没有捷径可以走…

查看全部问答>

请教一个简单的C51程序,

#include main() {         TMOD=0X10;         TH1=0XFE;         TL1=0X0C;         TR1=1;         ET1=1;       ...…

查看全部问答>

wince下调用软键盘的问题

在wince下调用软键盘,代码如下 void CRecorderDlg::OnBnClickedButton6() {         // TODO: Add your control notification handler code here         SipShowIM(SIPF_ON);  //Shows&nb ...…

查看全部问答>

在wince 下怎么能读取 一个像素 alpha 通道的值

我想把一个带 透明通道的bitmap作为前景贴到一个不带透明通道的背景bitmap上,试了几种方法 都不理想,包括 TransparentBlt(...),alphablend(...),还使用过maskdc 的方法,都不理想。 前两种方法把我的小的前景,拉伸到跟背景一样大;而且Transpa ...…

查看全部问答>

发个清华蓬远地取模软件

前几天取汉字模从网上下个软件,不太好,就因为取然的格式带H地,我要C语言数组地,以前用过清华蓬远的取模软件,我认为是最好地,今天翻出特发上来,大家共享,我也MARK,省得以后再找不到,呵呵…

查看全部问答>

一个晶振引发的问题

本来是51好板,就是CPU座松了,让同事搞一下变紧,拿回来突然不好用,仿真器上也不好用,本来屏幕可显开机画面,但怎么也搞不定,由于急有找了另一台机器总算把程序实验完,第二天对着这个坏板研究起来,首先是换51的40脚DIP座,小心得很,因为板上 ...…

查看全部问答>

菜农友情为STM32设计一种通用加密方法之原理

今天连续看了两篇关于加密方面的帖子,感觉自己应该友情奉献一回了~~~ 设想一种加密办法,大家看看可行吗? 关于STM32F器件电子签名以及加密问题-请指点 今日方知STM32的UID为96位即12个字节,以前知道STM32内嵌CRC32. 网上在线CRC演算工 ...…

查看全部问答>

急求一个实际应用中的反向比例运算放大电路

简要说明一下放大电路的原理和作用…

查看全部问答>