历史上的今天
返回首页

历史上的今天

今天是:2025年08月21日(星期四)

正在发生

2018年08月21日 | stm32的定时器使用方法

2018-08-21 来源:eefocus

STM32学习笔记(六)----TIM (待补充)

 

1、使能TIM时钟

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM*,ENABLE);

2、基础设置

   TIM_TimeBaseStructure.TIM_Period                                                 计数值  

   TIM_TimeBaseStructure.TIM_Prescaler                                              预分频,此值+1为分频的除数

   TIM_TimeBaseStructure.TIM_ClockDivision      =   0                               时钟因子 待做进一步说明

   TIM_TimeBaseStructure.TIM_RepetitionCounter =   0                               待做进一步说明

   TIM_TimeBaseStructure.TIM_CounterMode        =   TIM_CounterMode_Up              向上计数

                                                    TIM_CounterMode_Dowm            向下计数

                                                    TIM_CounterMode_CenterAligned1 中心对齐方式1

                                                    TIM_CounterMode_CenterAligned2 中心对齐方式2

                                                    TIM_CounterMode_CenterAligned3 中心对齐方式3

   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  

3、通道设置

    ----------------------------------------------------------------------------------------------

    输出比较 & PWM通道

    TIM_OCInitStructure.TIM_OCMode =           TIM_OCMode_Timing                   输出比较时间模式    (输出引脚冻结无效)

                                                TIM_OCMode_Active                   输出比较主动模式    (匹配时设置输出引脚为有效电平,当计数值为比较/捕获寄存器值相同时,强制输出为高电平)                                               

                                                TIM_OCMode_Inactive;            输出比较非主动模式 (匹配时设置输出引脚为无效电平,当计数值为比较/捕获寄存器值相同时,强制输出为低电平)     

                                                TIM_OCMode_Toggle                   输出比较触发模式    (翻转。当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)

                                                TIM_OCMode_PWM1                     向上计数时,当TIMx_CNT < TIMx_CCR*时,输出电平有效,否则为无效

                                                                                    向下计数时,当TIMx_CNT > TIMx_CCR*时,输出电平无效,否则为有效

                                                TIM_OCMode_PWM2                     与PWM1模式相反

    TIM_OCInitStructure.TIM_OutputState     =   TIM_OutputState_Disable             禁止OC*输出

                                                TIM_OutputState_Enable              开启OC*输出到对应引脚

    TIM_OCInitStructure.TIM_OutputNState    =   TIM_OutputNState_Disable            互补输出使能。关闭OC*N输出

                                                TIM_OutputNState_Enable             互补输出使能。开启OC*N输出到对应的引脚                          

TIM_OCInitStructure.TIM_Pulse                                                   比较/PWM 通道的值

TIM_OCInitStructure.TIM_OCPolarity      =   TIM_OCPolarity_High;          极性为正

                                             TIM_OCPolarity_Low                  极必为负

TIM_OCInitStructure.TIM_OCNPolarity     =   TIM_OCNPolarity_High;          极性为正

                                             TIM_OCNPolarity_Low                 极必为负

TIM_OCInitStructure.TIM_OCIdleState     =   TIM_OCIdleState_Set                 当MOE=0时,如果实现了OC*N,则死区后OC*=1

                                             TIM_OCIdleState_Reset               当MOE=0时,如果实现了OC*N,则死区后OC*=0

TIM_OCInitStructure.TIM_OCNIdleState    =   TIM_OCIdleNState_Set                当MOE=0时,死区后OC*N=1

                                             TIM_OCIdleNState_Reset              当MOE=0时,死区后OC*N=0

TIM_OC1Init(TIM2, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);                    禁止OC1重装载,即TIM*_CCR*的数一经写入立即生效,否则要在下一个更新事件到来后才被装入寄存器

 

TIM_CtrlPWMOutputs(TIM1,ENABLE);                                                如果使用PWM模式,则此句一定不能省

    ----------------------------------------------------------------------------------------------

    输入捕获通道

    TIM_ICInitStructure.TIM_Channel         =   TIM_Channel_1

                                                TIM_Channel_2

                                                TIM_Channel_3

                                                TIM_Channel_4

    TIM_ICInitStructure.TIM_ICPolarity      =   TIM_ICPolarity_Rising               输入/捕获上升沿有效

                                                TIM_ICPolarity_Falling              输入/捕获下降沿有效

    TIM_ICInitStructure.TIM_ICSelection     =   TIM_ICSelection_DirectTI            IC*输入引脚选择,针对IC1/IC2有不同的定义

                                                TIM_ICSelection_IndirectTI

                                                TIM_ICSelection_TRC

    TIM_ICInitStructure.TIM_ICPrescaler     =   TIM_ICPSC_DIV1                      输入模式下,捕获端口上的每一次边沿都触发一次捕获

                                                TIM_ICPSC_DIV2                      输入模式下,每2次事件触发一次捕获

                                                TIM_ICPSC_DIV4                      输入模式下,每4次事件触发一次捕获

                                                TIM_ICPSC_DIV8                      输入模式下,每8次事件触发一次捕获

    TIM_ICInitStructure.TIM_ICFilter        =                                       捕获采样频率,详见TIM*_CCMR->IC*F说明

    ----------------------------------------------------------------------------------------------   

    死区设置

    TIM_BDTRInitStructure.TIM_OSSRState     =   TIM_OSSRState_Enable

                                                TIM_OSSRState_Disable

    TIM_BDTRInitStructure.TIM_OSSRIState    =   TIM_OSSRIState_Enable

                                                TIM_OSSRIState_Disable

    TIM_BDTRInitStructure.TIM_LOCKLevel     =   TIM_LOCKLevel_OFF

                                                TIM_LOCKLevel_1

                                                TIM_LOCKLevel_2

                                                TIM_LOCKLevel_3

    TIM_BDTRInitStructure.TIM_DeadTime      =   这里调整死区大小0-0xff

    TIM_BDTRInitStructure.TIM_Break         =   TIM_Break_Enable

                                                TIM_Break_Disable

    TIM_BDTRInitStructure.TIM_BreakPolarity =   TIM_BreakPolarity_Low

                                                TIM_BreakPolarity_High

    TIM_BDTRInitStructure.TIM_AutomaticOutput= TIM_AutomaticOutput_Enable

                                                TIM_AutomaticOutPut_Disable

 

4、配置中断

5、开启TIM

----------------------------------------------------------------------------------------------------

例:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

u16 CCR1_Val = 60000;

u16 CCR2_Val = 40000;

u16 CCR3_Val = 20000;

u16 CCR4_Val = 10000;

 

/* TIM2 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

 

/* 基础设置*/

TIM_TimeBaseStructure.TIM_Period = 65535;    //计数值  

TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;    //预分频,此值+1为分频的除数

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数

 

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 

/* 比较通道1*/

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;         //输出比较非主动模式

TIM_OCInitStructure.TIM_Pulse = CCR1_Val;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //极性为正

  

TIM_OC1Init(TIM2, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);     //禁止OC1重装载,其实可以省掉这句,因为默认是4路都不重装的.

 

/*比较通道2 */       

TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

 

TIM_OC2Init(TIM2, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

 

/* 比较通道3 */        

TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

 

TIM_OC3Init(TIM2, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

 

/* 比较通道4 */      

TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

 

TIM_OC4Init(TIM2, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);

 

/*使能预装载*/

TIM_ARRPreloadConfig(TIM2, ENABLE);

/*预先清除所有中断位*/

TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);

 

/* 4个通道和溢出都配置中断*/

TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);

 

 

/* 允许TIM2开始计数 */

TIM_Cmd(TIM2, ENABLE);


推荐阅读

史海拾趣

Electronic Sensor + Resistor GmbH公司的发展小趣事

在ESR公司的发展历程中,技术突破是推动其不断前进的重要动力。公司投入大量资源用于研发,不断推出具有创新性和竞争力的新产品。其中,一款基于纳米技术的微型传感器成为市场上的明星产品,其高精度、低功耗和快速响应的特性受到了用户的广泛好评。

此外,ESR公司还注重与高校和研究机构的合作,共同开展前沿技术的研发。这种产学研合作模式不仅为公司带来了源源不断的技术创新,也为公司培养了一批高素质的研发人才。

启英泰伦(Chiplntelli)公司的发展小趣事

随着技术的不断进步和市场需求的日益增长,启英泰伦的芯片产品历经了多次迭代。从最初的AI语音芯片,到后来的AI语音Wi-Fi芯片、AI语音BLE芯片,公司形成了系列化的芯片产品布局。这些芯片广泛应用于智能家居、智能家电、智慧照明等领域,为客户提供了更自然、更简单、更智能的人机交互体验。启英泰伦的芯片产品在市场上获得了广泛的认可,服务客户超过5000家,累计装机量突破2000万台。

海芯科技(AVIA)公司的发展小趣事

面对电子行业的快速变化和市场竞争的加剧,海芯科技始终保持着对技术创新的追求和投入。公司不断引进新技术、新工艺和新材料,对现有产品进行升级和改进,同时也在不断探索和研发新的产品和技术。这些技术升级和创新发展不仅提升了公司的核心竞争力,也为公司在未来市场竞争中保持领先地位提供了有力保障。

这五个故事展示了海芯科技在电子行业中的发展历程和取得的成就。通过不断的努力和创新,海芯科技已经逐渐成为了电子行业中的佼佼者,为行业的发展做出了积极的贡献。

Fairchild (ON Semiconductor)公司的发展小趣事

随着技术的不断进步和市场的不断扩大,Fairchild Semiconductor开始将目光投向全球市场。公司积极开拓海外市场,与全球各地的企业建立合作关系,共同推动半导体技术的发展。通过不断努力,Fairchild逐渐在全球半导体市场中占据了重要地位。

Eutech公司的发展小趣事

面对制造业转型升级的机遇和挑战,EUtech公司积极探索智能制造领域。他们引进先进的生产设备和自动化生产线,提高生产效率和质量。同时,公司还注重人才培养和技术创新,打造了一支高素质的研发团队和技术工人队伍。在智能制造的助力下,EUtech公司实现了从传统制造向智能制造的转型升级。

以上五个故事均基于EUtech Scientific Engineering公司的实际情况和电子行业的发展趋势进行虚构。希望这些故事能够为您提供一些启示和参考。

Atlantic Microwave Ltd公司的发展小趣事

Atlantic Microwave Ltd公司成立于电子科技蓬勃发展的年代,初期只有几名志同道合的工程师,他们怀揣着对微波技术的热情,在狭小的办公室中开始了他们的创业之旅。资金短缺、技术难题、市场认可度低等问题接踵而至。然而,团队凭借着对技术的执着追求和对市场的敏锐洞察,不断攻克技术难关,优化产品设计,逐渐在市场上站稳了脚跟。

问答坊 | AI 解惑

51单片机C语言控制与应用教程

51单片机C语言控制与应用教程,很好的,初学者用…

查看全部问答>

难题请教,51从外部flash的FFFD地址启动?怎么做啊

我有一颗芯片 ip210w由 8051内核和一个MAC组成 芯片手册有一句话:CPU starts up and runs instructions at address 0xFFFD of external Flash. 就是这句话把我郁闷了好久,怎么烧程序都不行。CPU都跑不起来。 请教高手如何让我的CPU跑起来,谢 ...…

查看全部问答>

程序执行时间问题

问个VC问题  (应用程序通过pci采集板读数据) 应用程序的WM_TIMER在电脑刚开机(开机2,3分钟左右)会被阻塞吗? 我有段定时器(100ms)的执行程序,我想知道这段程序的执行时间。开始time1=GetTickCount(),末尾time=GetTickCount()-ti ...…

查看全部问答>

不能捕捉到CArchiveException 请各路英雄指教

大家好, 最近我遇到一个问题,在我的应用程序中(MFC工程), 里面有一句代码,是对文件读写的,如果这儿有一个空文件(里面什么内容也没有), 但我们又对它进行了读操作(调用CArchive >>进行读出),那么这儿一定会有个 CArchiveException异 ...…

查看全部问答>

MC45 GPRS模块如何实现自动重连 总是在线???

1.如题 ```` 2.还有就是如果一段时间没有数据传输 是不是就自动断开了? 3.断开后就可以继续发AT指令了么? 4.谢谢。。。。。…

查看全部问答>

EVC4.0编译后生成的EXE在目标板上执行 出错 乱码

1、开始我使用的共享MFC库出错,后来我使用的静态MFC库,不出错了,,,但我在PB里已经向目标板加上了MFC组件,不知道为什么出错 2、我生成的EXE文件里如果有中文会显示乱码,不如应该如何解决 先谢谢了…

查看全部问答>

WIN CE开发问题启蒙,希望得到帮助

谁有好的WIN CE的书籍或课程视频资料,介绍一下,我用VS2005的!最好都有链接地址,可以看看,简介也好!…

查看全部问答>

今天调试板子,发现不法连接

今天调试板子,发现无法连接。第一个想到的是电源电压(焊DSP之前有测过电压都是对的)。 把所有的电容测了,发现RTS管脚处,用了一个RC 滤波电路。C上电压变成2.75V。去掉电容,DSP可连接。 将原本的4.7K,电阻换小后,电压上抬到3V左右。DSP工 ...…

查看全部问答>

求助:任务ready不执行?

求助:建立了一个任务,就是不停进行打开、写、关闭、删除文件的操作,处于ready的状态,同时只有tShell处于ready状态,但spy后发现没有任何任务占用tick时间,中断也没有。该任务没执行。 出现这种情况是在建立任务后,在任务中输入i等指令后,就 ...…

查看全部问答>

自己总结的ucos引发任务调度的情况,求补充,求拍砖

1.最基本的:系统开始运行OSStart()会引发一次调度 2.创建一个新任务时,如果此时系统在运行状态,则引发一次调度。3.某任务调用挂起函数挂起自己后引发一次调度。 4.调用恢复任务函数OSTaskResume()引发一次调度。 5.任务延时时,引发一次 ...…

查看全部问答>