完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
来源 灵动MM32 1、定时器同步 在MM32L073一个定时器有4 通道 PWM 输出,有客户在应用中需要使用两个定时器控制6路PWM输出,为了使两个定时器的PWM输出相同的波形,所以需要两个定时器实现同步功能。 所有 tiMx 定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。 MM32L073的每个定时器都可以由另一个定时器触发启动定时器一般是通过软件设置而启动,MM32L073的每个定时器也可以通过外部信号触发而启动,还可以通过另外一个定时器的某一个条件被触发而启动。这里所谓某一个条件可以是定时到时、定时器超时、比较成功等许多条件。这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式,接受触发信号而启动的定时器工作于从模式。 主/从定时器的例子 为了实现两个定时器完全同步,使用一个定时器作为另一个定时器的预分频器。可以配置定时器 1 作为定时器 3 的预分频器。 参考上图,进行下述操作: 配置定时器 1 为主模式,它可以在每一个更新事件 UEV 时输出一个周期性的触发信号。在TIM1_CR2寄存器的MMS = ‗010时,每当产生一个更新事件时在 TRGO1上输出一个上升沿信号。 连接定时器 1 的 TRGO1 输出至定时器 3,设置 TIM3_SMCR 寄存器的 TS = ‗000 ,配置定时器 3为使用 ITR1 作为内部触发的从模式。 然后把从模式控制器置于外部时钟模式 1(TIM3_SMCR 寄存器的 SMS = 111);这样定时器 3即可由定时器 1 周期性的上升沿(即定时器 1 的计数器溢出)信号驱动。 最后,必须设置相应(TIMx_CR1 寄存器)的 CEN 位分别启动两个定时器。 注:如果 OCx 已被选中为定时器 1 的触发输出(MMS = 1xx),它的上升沿用于驱动定时器 3 的计数器。 void Tim1_Init(u16 Prescaler,u16Period) { TIM_TimeBaseInitTypeDefTIM_StructInit; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); TIM_StructInit.TIM_Period=Period; TIM_StructInit.TIM_Prescaler=Prescaler; TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1; TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up; TIM_StructInit.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM1,&TIM_StructInit); TIM_ClearFlag(TIM1,TIM_FLAG_Update); } void TIM3_Init(u16 psc,u16 arr) { TIM_TimeBaseInitTypeDefTIM_StructInit; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM_StructInit.TIM_Period=arr; TIM_StructInit.TIM_Prescaler=psc; TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1; TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up; TIM_StructInit.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM3,&TIM_StructInit); TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Enable); TIM_SelectInputTrigger(TIM1,TIM_TS_ITR2); TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Gated); TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable); TIM3->CNT=0; TIM1->CNT=0; TIM_Cmd(TIM1, ENABLE); delay_ms(300); TIM_Cmd(TIM3, ENABLE); delay_ms(300); } 2、定时器精准延时 在应用中,有的需要精准的定时功能,在客户支持过程中,发现有的客户对定时器的基本定时功能的理解有些偏差,今天将与大家一起使用定时器的基本定时功能。 我们把定时器设置自动重装载寄存器 ARR 的值为1000,设置时钟预分频器为47,则驱动计数器的时钟: CK_CNT = CK_INT / (47+1)=1M,则计数器计数一次的时间等于:1/CK_CNT=1us,当计数器计数到 ARR 的值1000 时,产生一次中断,则中断一次的时间为:1/CK_CNT*ARR=1ms。 void Tim2_UPCount_test(void) { TIM_TimeBaseInitTypeDefTIM_StructInit; NVIC_InitTypeDef NVIC_StructInit; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_StructInit.TIM_Period=1000; TIM_StructInit.TIM_Prescaler=47; TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1; TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up; TIM_StructInit.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM2,&TIM_StructInit); NVIC_StructInit.NVIC_IRQChannel=TIM2_IRQn; NVIC_StructInit.NVIC_IRQChannelPriority=1; NVIC_StructInit.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_StructInit); TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE); TIM_Cmd(TIM2, ENABLE); } 定时器中断一次的时间是 1ms,我们定义一个全局变量ucTim2Flag,每当进一次中断的时候,让 ucTim2Flag来记录进入中断的次数。如果我们想实现一个 1s 的定时,我们只需要判断time是否等于1000 即可,1000 个 1ms 就是1s。然后把ucTim2Flag清 0,重新计数,以此循环往复。 void TIM2_IRQHandler(void) { TIM_ClearITPendingBit(TIM2,TIM_IT_Update); ucTim2Flag++; } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
2253个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11828 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5976 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
11118 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4595 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4328 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
1302浏览 1评论
852浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 12:33 , Processed in 0.572037 second(s), Total 57, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号