对应定时器配置
- 格式:docx
- 大小:24.82 KB
- 文档页数:44
LTE常用定时器解释及配置建议LTE(Long Term Evolution)是一种移动通信技术,提供更快的数据传输速度和更低的时延。
在LTE系统中,定时器被广泛用于处理各种时序事件,以确保系统正常运行。
本文将解释LTE常用定时器的作用,并提供配置建议。
1.提示定时器(T300):提示定时器用于处理无线资源块(RB)分配的确认消息(PRACHRACH)。
当UE发送资源申请后,网络需要在一定时间内确认资源分配是否成功。
如果确认消息未及时到达,UE将重新发送资源请求。
T300定时器的配置建议是根据网络负载和时延要求来设置合适的超时时间。
通常,T300的取值范围为100毫秒到2000毫秒。
2.连接建立定时器(T310):3.连接失活定时器(T325):连接失活定时器用于处理UE在一些服务小区的连接已断开的情况。
当连接断开后,UE需要等待一定时间来检测该服务小区是否恢复连接。
T325定时器的配置建议是根据网络规划和时延要求。
通常,T325的取值范围为100毫秒到2000毫秒。
4.心跳定时器(T3324):心跳定时器用于处理UE与网络之间的链路保持活跃。
网络会周期性地发送心跳消息给UE,以确保网络与UE之间的连接保持正常。
如果UE 在T3324定时器到期之前未收到心跳消息,UE将认为连接已断开并进行相应的处理。
T3324定时器的配置建议是根据网络规划和链路保持的要求。
通常,T3324的取值范围为10秒到30秒。
5. 支持Paging的空闲定时器(T3413):支持Paging的空闲定时器用于处理UE处于空闲状态时的Paging消息。
当UE处于空闲状态时,网络会周期性地发送Paging消息给UE,以便通知UE有待处理的消息。
如果UE在T3413定时器到期之前未接收到Paging消息,UE将认为当前服务小区无任何待处理的消息。
T3413定时器的配置建议是根据网络规划和Paging消息的要求。
通常,T3413的取值范围为20秒到200秒。
Spring配置定时器(注解+xml)⽅式—整理⼀、注解⽅式1. 在Spring的配置⽂件ApplicationContext.xml,⾸先添加命名空间1 xmlns:task="/schema/task"2 /schema/task3 /schema /task/springtask3.1.xsd42. 最后是我们的task任务扫描注解1<task:annotation-driven/>3. spring扫描位置1<context:annotation-config/>2<context:component-scan base-package="com.test"/>4.写⾃⼰的定时任务1 @Component //import ponent;2public class MyTestServiceImpl implements IMyTestService {3 @Scheduled(cron="0/5 * * * * ? ") //每5秒执⾏⼀次4public void myTest(){5 System.out.println("进⼊测试");6 }7 }♦注意:定时器的任务⽅法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定⼀个proxytargetclass的某个值为true)⼆、XML⽅式1.在spring配置⽂件中创建bean,创建schedule1<bean id="schedule"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">3<property name="triggers">4<list>5<ref bean="testTrigger"/>6</list>7</property>8</bean>2. 在spring配置⽂件中创建bean,创建你的triggers1<bean id="testTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">3<property name="jobDetail" ref="testJobDetail"/>4<property name="cronExpression" value="0 1/5 * * * ?"/>5</bean>3. 在spring配置⽂件中创建bean,指定定时器作⽤在那个类那个⽅法上⾯1<bean id="testJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">3<property name="targetObject" ref="targetTestService"/>4<property name="targetMethod" value="timerTest"/>5</bean>♦注明:把定时器作⽤在targetTestService对象中的timerTest⽅法上⾯4. 当然还得把你作⽤的对象交Spring来管理,所以在spring配置⽂件中创建作⽤类的 bean1<bean id="targetTestService" class=".service.TargetTestService" scope="prototype"></bean>♦这是时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运⾏时间,只需要设置其cronExpression属性。
STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)⾼级定时。
⽂章结构:——> ⼀、定时器基本介绍——> ⼆、普通定时器详细介绍TIM2-TIM5——> 三、定时器代码实例⼀、定时器基本介绍之前有⽤过野⽕的学习板上⾯讲解很详细,所以直接上野⽕官⽅的资料吧,作为学习参考笔记发出来⼆、普通定时器详细介绍TIM2-TIM52.1 时钟来源计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)·外部时钟模式1:外部输⼊脚(TIx)·外部时钟模式2:外部触发输⼊(ETR)·内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器,如可以配置⼀个定时器Timer1⽽作为另⼀个定时器Timer2的预分频器。
由于今天的学习是最基本的定时功能,所以采⽤内部时钟。
TIM2-TIM5的时钟不是直接来⾃于APB1,⽽是来⾃于输⼊为APB1的⼀个倍频器。
这个倍频器的作⽤是:当APB1的预分频系数为1时,这个倍频器不起作⽤,定时器的时钟频率等于APB1的频率(36MHZ);当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作⽤,定时器的时钟频率等于APB1的频率的2倍。
{假如APB1预分频为2(变成36MHZ),则定时器TIM2-5的时钟倍频器起作⽤,将变成2倍的APB1(2x36MHZ)将为72MHZ给定时器提供时钟脉冲。
⼀般APB1和APB2的RCC时钟配置放在初始化函数中例如下⾯的void RCC_Configuration(void)配置函数所⽰,将APB1进⾏2分频,导致TIM2时钟变为72MHZ输⼊。
如果是1分频则会是36MHZ输⼊,如果4分频:CKINT=72MHZ/4x2=36MHZ; 8分频:CKINT=72MHZ/8x2=18MHZ;16分频:CKINT=72MHZ/16x2=9MHZ}1//系统时钟初始化配置2void RCC_Configuration(void)3 {4//定义错误状态变量5 ErrorStatus HSEStartUpStatus;6//将RCC寄存器重新设置为默认值7 RCC_DeInit();8//打开外部⾼速时钟晶振9 RCC_HSEConfig(RCC_HSE_ON);10//等待外部⾼速时钟晶振⼯作11 HSEStartUpStatus = RCC_WaitForHSEStartUp();12if(HSEStartUpStatus == SUCCESS)13 {14//设置AHB时钟(HCLK)为系统时钟15 RCC_HCLKConfig(RCC_SYSCLK_Div1);16//设置⾼速AHB时钟(APB2)为HCLK时钟17 RCC_PCLK2Config(RCC_HCLK_Div1);18 //设置低速AHB时钟(APB1)为HCLK的2分频(TIM2-TIM5输⼊TIMxCLK频率将为72MHZ/2x2=72MHZ输⼊)19 RCC_PCLK1Config(RCC_HCLK_Div2);20//设置FLASH代码延时21 FLASH_SetLatency(FLASH_Latency_2);22//使能预取指缓存23 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);24//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz25 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);26//使能PLL27 RCC_PLLCmd(ENABLE);28//等待PLL准备就绪29while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);30//设置PLL为系统时钟源31 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);32//判断PLL是否是系统时钟33while(RCC_GetSYSCLKSource() != 0x08);34 }35//允许TIM2的时钟36 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);37//允许GPIO的时钟38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);39 }APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。
一、接入类定时器1.初始接入流程说明主要受T300、T302定时器的影响:UE RRC连接建立请求消息是由UE的RRC层发起,并向MAC层发出随机接入指示以后,启动T300定时器,接收到RRCConnection Setup消息或RRC Connection Reject 消息,或NAS层指示终止RRC连接建立时停止;如果T300超时,则通知上层RRC连接建立失败, UE转入空闲模式。
网络在RRC连接拒绝时,会在RRC Connection Reject消息中同时向UE指示等待时间(T302时长),UE需等待T302指示的时间后,再发起下一次RRC连接建立流程。
2.定时器参数介绍①T300【功能描述】该参数表示UE侧控制RRC connectionestablishment过程的定时器。
在UE发送RRCConnectionRequest后启动。
在超时前如果:1.UE收到RRCConnectionSetup或RRCConnectionReject;2.触发Cell-reselection过程;3.NAS层终止RRC connection establishment过程。
则定时器停止。
如定时器超时,则UE重置MAC层、释放MAC层配置、重置所有已建立RBs(Radio Bears)的RLC实体。
并通知NAS层RRCconnection establishment失败。
【对网络质量的影响】增加该参数的取值,可以提高UE的RRC connectionestablishment过程中随机接入的成功率。
但是,当UE选择的小区信道质量较差或负载较大时,可能增加UE的无谓随机接入尝试次数。
减少该参数的取值,当UE选择的小区信道质量较差或负载较大时,可能减少UE的无谓随机接入尝试次数。
但是,可能降低UE的RRCconnection establishment过程中随机接入的成功率。
【取值范围】ENUMERATED { ms100, ms200, ms300, ms400, ms600, ms1000,ms1500,ms2000}【取值建议】1000ms②T302【功能描述】T302用于控制eUTRAN拒绝UE的RRC连接建立到UE下一次发起RRC连接建立过程的时间。
实验一:TIMER-1:定时器上溢,查询溢出后取反LED.故频率计算:f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ;定时器的基本设置:1、设置预分频数,得到CK_CNT,TIM_TimeBaseStructure.TIM_Prescaler = 7199;CK_CNT 的计数频率=72M/(7199+1)=10K ;2、设置自动重装载寄存器,当计数值达到这个寄存器锁存数值时,溢出产生事件TIM_TimeBaseStructure.TIM_Period = 9999;10K/(9999+1)=1HZ ,也就是1S 溢出一次;3、设置计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;从0计数到ARR 产生溢出事件;4、 设置时间分割值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;5、 初始化定时器2TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);6、清楚标志TIM_ClearFlag(TIM2, TIM_FLAG_Update);7、打开定时器TIM_Cmd(TIM2, ENABLE);8、在主函数中查询TIM_FLAG_Update 标志置位了就清除标志:if(TIM_GetFlagStatus (TIM2,TIM_FLAG_Update )!=RESET){TIM_ClearFlag (TIM2,TIM_FLAG_Update);if( GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8)==0)GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET);elseGPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET);}时钟预分频 CK_PSC 加减计数器 CK_CNT 达到ARR 的值产生事件实验二、TIMER-1:定时器上溢,中断溢出后取反LED.利用中断的方法:步骤一:定时器的配置1、设置预分频数,得到CK_CNT,TIM_TimeBaseStructure.TIM_Prescaler = 7199;CK_CNT的计数频率=72M/(7199+1)=10K;2、设置自动重装载寄存器,当计数值达到这个寄存器锁存数值时,溢出产生事件TIM_TimeBaseStructure.TIM_Period = 9999;10K/(9999+1)=1HZ ,也就是1S溢出一次;3、设置计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;从0计数到ARR产生溢出事件;4、设置时间分割值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;5、初始化定时器2TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);6、打开中断溢出中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);7、打开定时器TIM_Cmd(TIM2, ENABLE);步骤二:编写中断配置void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else /* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ;NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}注意:加黑的部分,如果你在RAM中编程就要定义VECT_TAB_RAM ,如果在FLASH 编程,则需要NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);如果没有这条预编译语句的话,则很可能会存在进不去中断的错误。
STM32CUBEMX配置教程(十二)STM32的定时器触发的固定频率ADC采样(使用DMA)本教程将向您展示如何使用STM32CubeMX配置定时器触发的固定频率ADC采样,并使用DMA进行数据传输。
此配置可以用于您需要按照固定频率对模拟信号进行采样的应用中。
在开始之前,请确保已安装好STM32CubeMX和相应的IDE(如Keil、IAR等),并且您已熟悉STM32CubeMX的基本使用方法。
以下是配置步骤:1. 打开STM32CubeMX,并选择您的目标MCU型号。
2. 在"Pinout & Configuration"选项卡中,配置定时器和ADC引脚。
a.选择一个定时器,并设置其时钟源和频率。
您可以选择任何一个可用的定时器来触发ADC采样。
b.配置ADC引脚,将其连接到您的模拟信号源。
3. 在"Configuration"选项卡中,配置ADC。
a.启用ADC和DMA控制器。
b.配置ADC分辨率,采样时间和采样周期。
这些参数取决于您的应用需求。
c. 在"Mode"选项中,选择"Continuous Conversion Mode"。
这样ADC将会不断地根据定时器触发进行采样。
d. 启用"DMA Continuous Requests"。
这样当ADC完成一次采样后,DMA控制器将自动将数据传输到内存中。
4. 在"NVIC Settings"选项卡中,启用DMA和ADC中断。
5. 在"Project"选项卡中,选择生成代码所需的IDE和工程路径。
然后单击"Generate Code"按钮生成代码。
现在您已成功配置了定时器触发的固定频率ADC采样,并使用DMA进行数据传输。
您可以在生成的代码中初始化和启用各个模块,并编写相应的中断处理函数来处理DMA和ADC中断。
STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
关于LTE定时器参数的设置1.接入类定时器定时器常量类流程说明:1 初始RRC连接建立流程,及相关定时器参数影响【初始接入流程说明】主要受T300、T302定时器的影响:UE RRC连接建立请求消息是由UE的RRC层发起,并向MAC层发出随机接入指示以后,启动T300定时器,接收到RRC Connection Setup消息或RRC Connection Reject消息,或NAS 层指示终止RRC连接建立时停止; 如果T300超时,则通知上层RRC连接建立失败, UE转入空闲模式。
网络在RRC连接拒绝时,会在RRC Connection Reject消息中同时向UE指示等待时间(T302 时长),UE需等待T302指示的时间后,再发起下一次RRC连接建立流程。
2.掉线类定时器及常量定时器常量类流程说明:无线链路失败检测流程,及相关定时器常量参数影响【无线链路失败检测流程说明】:在UE进行无线链路检测时,当连续收到的下行失步指示(out of sync)个数等于N310时,则会触发定时器T310的启动。
如果在T310持续过程中,连续又收到下行同步指示(in sync)个数等于N311时,则停止T310定时器,指示链路同步已恢复。
如定时器T310 超时,则认为检测到无线链路失败,将触发第4节所述的RRC连接重建过程。
UE侧的RLF检测协议3GPP TS 36.331 V.9.3.0第5.3.11章节对于RLF有相关描述:1> 当UE高层收到N310个连续“out-of-sync”指示,UE将启动T310定时器,见图2-10;2> 在T310定时器持续期间,如果UE收到N311个连续“in-sync”指示,UE将停止T310定时器;3> 发生下述三种情况表示UE出现RLF:(1)T310定时器超时;(2)RLC达到最大重传次数;(3)在T300,T301,T304,T311都不启动情况下出现来自MAC 的随机接入问题指示(upon random access problemindication from MAC while neither T300, T301, T304 norT311 is running);图2-1 UE侧RLF相关定时器及计数器协议3GPP TS 36.311第7.6章节可知当PDCCH以及PCFICH的BLER 高于10%,则意味着当前链路处于“out –of- sync”,当T310定时器期满后,表示RLF发生,此时T311计数器触发,当其期满后,UE进入RRC_Idle状态,需要进行RRC重建;当PDCCH以及PCFICH的BLER低于2%,意味着当前链路处于“in-sync”状态,T310定时器或者N311计数器都会停止计时或计数。
STM32HAL库学习系列第4篇定时器TIM-----开始定时器与PWM输出配置基本流程:1.配置定时器2.开启定时器3.动态改变pwm输出,改变值HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);函数总结:1 __HAL_TIM_SET_COMPARE()// 是设置CCRx,⼀般是⽤在PWM输出的,控制PWM占空⽐2 __HAL_TIM_GET_COMPARE // 是⽤来读取CCRx的,⼀般⽤于捕获处理PWM输出配置:频率设置:1static void MX_TIM2_Init(void)2 {3 TIM_MasterConfigTypeDef sMasterConfig;4 TIM_IC_InitTypeDef sConfigIC;5 TIM_OC_InitTypeDef sConfigOC;6 htim2.Instance = TIM2;7 htim2.Init.Prescaler = (36-1); //实际时钟频率为 72M/36=2MHz /40000=50H,-----490HZ,改变观察电机输出状态定时器预分频器8 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;9 htim2.Init.Period = (4082-1); //定时器周期配置 PWM频率为 490KHz 定义定时器周期,PWM频率为:168MHz/ (L298N_TIMx_PRESCALER+1)/ (L298N_TIM_PERIOD+1)10//⾼级定时器重复计数寄存器值11 **⾼级才有12// 定义⾼级定时器重复计数寄存器值13//实际PWM频率为:72MHz/(L298N_TIMx_PRESCALER+1)/(L298N_TIM_PERIOD+1)/(L298N_TIM_REPETITIONCOUNTER+1)14#define L298N_TIM_REPETITIONCOUNTER 015 **刹车和死区配置:1/* 刹车和死区时间配置 */2 sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;3 sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;4 sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;5 sBreakDeadTimeConfig.DeadTime = 0;6 sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;7 sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;8 sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;9 HAL_TIMEx_ConfigBreakDeadTime(&htimx_L298N, &sBreakDeadTimeConfig);基于通信的pwm频率和脉宽的更新控制算法:1/*2** pwm是否需要更新,⽐较上⼀次的频率和脉宽值,如果不同,则更新3*/4void pwm_update_loop( void )5 {6/*1,第⼀路判断: 频率或占空⽐发⽣变化 */7if( (HLM_SOKO_I_FREQ != HLM_SOKO_I_FREQ_LAST ) ||8 HLM_SOKO_I_DUTY != HLM_SOKO_I_DUTY_LAST )9 {10/* 更新频率和占空⽐的记录值 */11 HLM_SOKO_I_FREQ_LAST = HLM_SOKO_I_FREQ;12 HLM_SOKO_I_DUTY_LAST = HLM_SOKO_I_DUTY;13/* 更新当前通道的PWM波形 */14 pwm_update( PWM_I,HLM_SOKO_I_FREQ, HLM_SOKO_I_DUTY );15 }1617/*2,第⼆路判断 */18if( (HLM_SOKO_II_FREQ != HLM_SOKO_II_FREQ_LAST ) ||19 HLM_SOKO_II_DUTY != HLM_SOKO_II_DUTY_LAST )20 {21/* 更新频率和占空⽐的记录值 */22 HLM_SOKO_II_FREQ_LAST = HLM_SOKO_II_FREQ;23 HLM_SOKO_II_DUTY_LAST = HLM_SOKO_II_DUTY;24/* 更新当前通道的PWM波形 */25 pwm_update( PWM_II,HLM_SOKO_II_FREQ, HLM_SOKO_II_DUTY );26 }2728/*3,第三路判断 */29if( (HLM_SOKO_III_FREQ != HLM_SOKO_III_FREQ_LAST ) ||30 HLM_SOKO_III_DUTY != HLM_SOKO_III_DUTY_LAST )31 {32/* 更新频率和占空⽐的记录值 */33 HLM_SOKO_III_FREQ_LAST = HLM_SOKO_III_FREQ;34 HLM_SOKO_III_DUTY_LAST = HLM_SOKO_III_DUTY;35/* 更新当前通道的PWM波形 */36 pwm_update( PWM_III,HLM_SOKO_III_FREQ, HLM_SOKO_III_DUTY );37 }38 }补充:开起定时器功能只要在相应的定时器下开始内部时钟源即可使⽤定时器功能定时器内部动能:定时器时钟配置:M是10的6次⽅微秒是10的-6次⽅内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率108MHz,即108000 000Hz。
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 中⼼对齐⽅式3TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);3、通道设置----------------------------------------------------------------------------------------------输出⽐较 & PWM通道TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Timing 输出⽐较时间模式 (输出引脚冻结⽆效)TIM_OCMode_Active 输出⽐较主动模式 (匹配时设置输出引脚为有效电平,当计数值为⽐较/捕获寄存器值相同时,强制输出为⾼电平)TIM_OCMode_Inactive;输出⽐较⾮主动模式 (匹配时设置输出引脚为⽆效电平,当计数值为⽐较/捕获寄存器值相同时,强制输出为低电平)TIM_OCMode_Toggle 输出⽐较触发模式 (翻转。
FTTB数图匹配和长短定时器配置F820查看长短定时器Show run配置长短定时器Voip 5mgc h248-timer dml 600 dms 300数图匹配Voip 5Show mgc parameter9806H和F822查看长短定时器AG模式下SanBaiBei(ag)# get-mgb//获取mgcidSanBaiBei(ag)# get-mgc mgcid 1//查看MGCTYPESanBaiBei(ag)# get-allmgcattr//查看参数--------------------------------------------------------------------------------------------------------------------------------- mgctype: 1descript: ZTEmaxtransinpkg: 3reasonquote: not supportqueryuserstatus: V(1)heartbeat: 0dmlong: 5dmshort: 3dmstart: 10withtime: 2withdelay: 0pfstring: ZTEuserout: 905agout: 908heartid: 0oldMT: 1canclerror: 2hearttype: AG control-------------------------------------------------------------------------------- mgctype: 2descript: HWmaxtransinpkg: 3reasonquote: supportqueryuserstatus: V(1)heartbeat: 1dmlong: 16dmshort: 4dmstart: 10withtime: 1withdelay: 0pfstring: AGWuserout: 905agout: 908heartid: 0oldMT: 1canclerror: 2hearttype: AG control-------------------------------------------------------------------------------- mgctype: 3descript: CISCOmaxtransinpkg: 1reasonquote: not supportqueryuserstatus: V(1)heartbeat: 0dmlong: 16dmshort: 4dmstart: 10withtime: 2withdelay: 0pfstring: ResGwuserout: 905agout: 908heartid: 0oldMT: 1canclerror: 2hearttype: AG control-------------------------------------------------------------------------------- mgctype: 4descript: ALCATELmaxtransinpkg: 3reasonquote: supportqueryuserstatus: V(1)heartbeat: 0dmlong: 16dmshort: 4dmstart: 10withtime: 2withdelay: 0pfstring: ResGwuserout: 905agout: 908heartid: 0oldMT: 1canclerror: 2hearttype: AG control-------------------------------------------------------------------------------- mgctype: 5descript: NORTEL_MGCPmaxtransinpkg: 3reasonquote: not supportqueryuserstatus: V(1)heartbeat: 0dmlong: 16dmshort: 4dmstart: 10withtime: 2withdelay: 0pfstring: ResGwuserout: 905agout: 908heartid: 2oldMT: 0canclerror: 2hearttype: AG control-------------------------------------------------------------------------------- mgctype: 6descript: NORTELmaxtransinpkg: 3reasonquote: not supportqueryuserstatus: V(1)heartbeat: 0dmlong: 16dmshort: 4dmstart: 10withtime: 2withdelay: 0pfstring: ResGwuserout: 905agout: 908heartid: 0oldMT: 1canclerror: 2hearttype: AG control--------------------------------------------------------------------------------6 rows are effected--------------------------------------------------------------------------------------------------------------------------------- 配置长短定时器核心网mgctype都为2mod-mgcattr mgctype 2 dmlong 5 dmshort 3MA5616和MA5620E1、查看长短定时器MA5616(config)#interface h248 0MA5616(config-if-h248-0)#display digitmap-timer得到如下信息-----------------------------------------------------Start timer length(s) : 20Short timer length(s) : 4Long timer length(s) : 20Duration timer length(ms): 3000-----------------------------------------------------Start timer 摘机等待时间,默认即可Short timer 短定时器,一般设为3,默认是4Long timer 长定时器,一般设为6,默认是20Duration timer 拨号等待时间,默认即可设置长短定时器MA5616(config)#interface h248 0MA5616(config-if-h248-0)#digitmap-timerCD.BHSSSGSQZYN_MA5616(config-if-h248-0)#digitmap-timer{ duration<K>|long<K>|short<K>|start<K> }:long{ long-timer-value(s)<L><1,99> }:MA5616(config-if-h248-0)#digitmap-timer{ duration<K>|long<K>|short<K>|start<K> }:long { long-timer-value(s)<L><1,99> }:202、查看数图匹配MA5616(config)#display mg-software parameter 0 13 显示如下-------------------------------------------------Interface Id:0 para index:13 value:1 ------------------------------------------------- APPENDIX:-------------------------------------------------Interface software parameter name:13: DMM match mode0: Protocol define1: Longest2: Shortest3: Auto adapter修改数图匹配方式MA5616(config)#interface h248 0MA5616(config-if-h248-0)#mg-software parameter 13 { {value<L>} }:1(IMS)或2(软交换)。
STM32f407系统定时器时钟配置计算首先,我们需要配置系统定时器的时钟源。
STM32F407的系统定时器可以使用内部时钟源(HCLK/8)或外部时钟源。
通过软件配置,我们可以选择其中一种时钟源。
1.配置内部时钟源:要使用内部时钟源,可以通过RCC寄存器来配置。
具体需要做以下几步:a. 使能系统定时器时钟:在 RCC_APBxENR 寄存器中设置位SysTickEN=1,其中 x 为适当的 APBx 总线索引。
b.配置系统定时器时钟源:在STK_CTRL寄存器中设置位CLKSOURCE=12.配置外部时钟源:如果要使用外部时钟源作为系统定时器的时钟源,我们需要将外部时钟源与系统的时钟树相连。
具体的配置方法因时钟源的不同而不同,可参考具体芯片的参考手册。
配置了系统定时器的时钟源后,我们可以计算定时器中断的时间间隔。
系统定时器中断的时间间隔=(计数器周期)*(重载值+1)/(时钟频率)其中,计数器周期为24位,取值范围为0~2^24-1、时钟频率为系统定时器的时钟源频率。
重载值是计数器的初始值,当计数器减到0时,会触发定时中断。
举个例子,假设系统定时器的时钟源频率为8MHz,我们希望计算系统定时器中断每100ms触发一次的重载值。
中断触发周期 = 100ms = 0.1s时钟频率=8MHz=8*10^6Hz由于重载值需要为整数,我们可以将计算结果四舍五入为最接近的整数,即重载值为477以上就是STM32F407系统定时器时钟配置和计算方法的简要介绍。
配置完系统定时器的时钟源,并计算出需要的重载值后,我们可以通过编程设置相关寄存器,来开始使用系统定时器进行定时中断的任务。
51单片机定时器设置51单片机,也被称为8051微控制器,是一种广泛应用的嵌入式系统。
它具有4个16位的定时器/计数器,可以用于实现定时、计数、脉冲生成等功能。
通过设置相应的控制位和计数初值,可以控制定时器的启动、停止和溢出等行为,从而实现精确的定时控制。
确定应用需求:首先需要明确应用的需求,包括需要定时的时间、计数的数量等。
根据需求选择合适的定时器型号和操作模式。
设置计数初值:根据需要的定时时间,计算出对应的计数初值。
计数初值需要根据定时器的位数和时钟频率进行计算。
设置控制位:控制位包括定时器控制寄存器(TCON)和中断控制寄存器(IE)。
通过设置控制位,可以控制定时器的启动、停止、溢出等行为,以及是否开启中断等功能。
编写程序代码:根据需求和应用场景,编写相应的程序代码。
程序代码需要包括初始化代码和主循环代码。
调试和测试:在完成设置和编程后,需要进行调试和测试。
可以通过观察定时器的状态和输出结果,检查定时器是否按照预期工作。
计数初值的计算要准确,否则会影响定时的精度。
控制位的设置要正确,否则会导致定时器无法正常工作。
需要考虑定时器的溢出情况,以及如何处理溢出中断。
需要考虑定时器的抗干扰能力,以及如何避免干扰对定时精度的影响。
需要根据具体应用场景进行优化,例如调整计数初值或控制位等,以达到更好的性能和精度。
51单片机的定时器是一个非常实用的功能模块,可以用于实现各种定时控制和计数操作。
在进行定时器设置时,需要注意计数初值的计算、控制位的设置、溢出处理以及抗干扰等问题。
同时需要根据具体应用场景进行优化,以达到更好的性能和精度。
在实际应用中,使用51单片机的定时器可以很方便地实现各种定时控制和计数操作,为嵌入式系统的开发提供了便利。
在嵌入式系统和微控制器领域,51单片机因其功能强大、使用广泛而备受。
其中,定时器中断功能是51单片机的重要特性之一,它为系统提供了高精度的定时和计数能力。
本文将详细介绍51单片机定时器中断的工作原理、配置和使用方法。
关于移动集团对TDD-LTE定时器A类参数的考核参数要求和定时器的参数描述1、T300【参数名称】定时器300【移动集团的考核参数要求】500~1000ms【参数描述】含义:该参数表示定时器300的时长,参见3GPP TS 36.331。
UE在发送RRCConnectionRequest时启动此定时器。
定时器超时前,如果收到RRCConnectionSetup或者RRCConnectionReject,则停止该定时器。
定时器超时后,UE进入RRC_IDLE态。
该参数仅适用于FDD及TDD。
界面取值范围:MS100_T300(100毫秒), MS200_T300(200毫秒), MS300_T300(300毫秒), MS400_T300(400毫秒), MS600_T300(600毫秒), MS1000_T300(1000毫秒), MS1500_T300(1500毫秒), MS2000_T300(2000毫秒)单位:无实际取值范围:MS100_T300, MS200_T300, MS300_T300, MS400_T300, MS600_T300, MS1000_T300, MS1500_T300, MS2000_T300MML缺省值:无建议值:MS1000_T300(1000毫秒)参数关系:无修改是否中断业务:否(且不影响空闲模式UE)对无线网络性能的影响:无适用制式:L2、T301【参数名称】定时器301【移动集团的考核参数要求】600ms【参数描述】含义:该参数表示定时器301的时长,参见3GPP TS 36.331。
UE在发送RRCConnectionReestabilshmentRequest时启动该定时器。
定时器超时前,如果UE收到RRCConnectionReestablishment或者RRCConnectionReestablishmentReject或者被选择小区变成不适合小区(适合小区定义参见3GPP TS 36.331),则停止该定时器。
简述基本定时器的配置流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 开启定时器时钟在使用基本定时器之前,需要先开启定时器的时钟。
#include "drv_rcc.h"#include "drv_timer.h"/*** @brief 复位定时器外设寄存器为默认值.* @param pTimer: 要操作的定时器外设,可以是TIM1 ~ TIM14.* @retval 无*/void drv_timer_deinit( TimerType *pTimer ){if( pTimer == TIM1 ){drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM1RST );drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM1RST );}else if( pTimer == TIM2 ){drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM2RST );drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM2RST );}else if( pTimer == TIM3 ){drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM3RST );drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM3RST );}else if( pTimer == TIM4 ){drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM4RST );drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM4RST );}else if( pTimer == TIM6 ){drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM6RST );drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM6RST );}else if( pTimer == TIM7 ){drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM7RST );drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM7RST );}else if( pTimer == TIM8 ){drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM8RST );drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM8RST );}else if( pTimer == TIM15 ){drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM15RST );drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM15RST );}else if( pTimer == TIM16 ){drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM16RST );drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM16RST );}else{if( pTimer == TIM17 ){drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM17RST );drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM17RST );}}}/*** @brief 定时器基本功能初始化* @param pTimer: 定时器TIM1~TIM14* @param TimeClk: 定时器计数时钟频率,最低5000Hz,等于0时为不分频* @param TimePeriod: 定时器周期* @param TimeCntMode: 定时器计数模式,见类型enumTimeCntModeType* @retval 无**/void drv_timer_base_init( TimerType *pTimer, UINT32 TimeClk, UINT32 TimePeriod, enumTimerCntModeType TimeCntMode ){UINT32 l_timer_clk_freq;if( TimeClk == 0 ){pTimer->PSC = 0; //定时器不分频}else{if (( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM15 ) || ( pTimer ==TIM16 ) || ( pTimer == TIM17 )){l_timer_clk_freq = g_ClockFrequency.Apb2TimerClkFreq;}else{l_timer_clk_freq = g_ClockFrequency.Apb1TimerClkFreq;}pTimer->PSC = l_timer_clk_freq / TimeClk - 1; //分频系数}// 定时器基本参数配置pTimer->CR1.bit.CKD = (UINT16)TIM_CKD_DIV1; //滤波分频pTimer->CR1.bit.DIR = (UINT16)TimeCntMode; //计数模式pTimer->ARR = TimePeriod - 1; //重载值pTimer->SR.all = 0x0000; //清状态寄存器所有标志位pTimer->CR1.bit.CEN = 0; //不允许计数}/*** @brief 设置定时器计数模式.* @param pTimer: 定时器,可以是TIM1~5,TIM8.* @param CounterMode: 计数模式,见类型enumTimerCntModeType* @retval 无*/void drv_timer_set_counter_mode( TimerType *pTimer, enumTimerCntModeType CounterMode ){pTimer->CR1.bit.DIR = (UINT16)CounterMode;}/*** @brief 设置定时器计数值* @param pTimer: 定时器TIM1~TIM14* @param Counter: 要设置的定时器值* @retval 无*/void drv_timer_set_counter( TimerType *pTimer, UINT32 Counter ){pTimer->CNT = Counter;}/*** @brief 获取定时器计数值* @param pTimer: 定时器TIM1~TIM14* @retval 计数器值*/UINT32 drv_timer_get_counter( TimerType *pTimer ){UINT32 l_Value = 0;l_Value = ((UINT32)pTimer->CNT) & 0x7FFFFFFF ;return ( l_Value );}/*** @brief 设置定时器自动装载值* @param pTimer: 定时器TIM1~TIM14* @param Period: 自动装载值* @retval 无*/void drv_timer_set_arr( TimerType *pTimer, UINT32 Arr ){pTimer->ARR = Arr;}/*** @brief 获取自动装载值* @param pTimer: 定时器TIM1~TIM14* @param Period: 自动装载值* @retval 无*/UINT32 drv_timer_get_arr( TimerType *pTimer ){return ((UINT32)( pTimer->ARR));}/*** @brief 设置定时器预分频系数* @param pTimer: 定时器TIM1~TIM14* @param Presc: 分频系数理论最大为65535,TimeClock = SysClock / Psc + 1 * @retval 无*/void drv_timer_set_psc( TimerType *pTimer, UINT16 Psc ){pTimer->PSC = Psc; // 写入预分频系数}/*** @brief 使能定时器自动重装模式* @param pTimer: 定时器TIM1~TIM14* @retval 无*/void drv_timer_auto_reload_enable( TimerType *pTimer ){pTimer->CR1.bit.ARPE = 1;}/*** @brief 禁止定时器自动重装模式* @param pTimer: 定时器TIM1~TIM14* @retval 无*/void drv_timer_auto_reload_disable( TimerType *pTimer ){pTimer->CR1.bit.ARPE = 0;}/*** @brief 使能定时器更新* @param pTimer: 定时器TIM1~TIM14* @retval 无*/void drv_timer_update_enable( TimerType *pTimer ){pTimer->CR1.bit.UDIS = 0;}/*** @brief 禁止定时器更新* @param pTimer: 定时器TIM1~TIM14* @retval 无*/void drv_timer_update_disable( TimerType *pTimer ){pTimer->CR1.bit.UDIS = 1;}/*** @brief 设置定时器时钟分频值(定时器时钟与滤波器采样时钟比值).* @param pTimer: 可以是TIM1~5和TIM8~14.* @param Ckd: 分频值,0表示不分频,1表示二分频,2表示四分频,3无效.* @retval 无*/void div_timer_set_div( TimerType *pTimer, UINT16 Ckd ){pTimer->CR1.bit.CKD = Ckd;}/*** @brief 使能定时器.* @param pTimer: 定时器TIM1~TIM14* @retval 无*/void drv_timer_enable( TimerType *pTimer ){pTimer->CR1.bit.CEN = 1;}/*** @brief 失能定时器.* @param pTimer: 定时器TIM1~TIM14* @retval 无*/void drv_timer_disable( TimerType *pTimer ){pTimer->CR1.bit.CEN = 0;}/*** @brief 定时器输出通道1初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType* @retval 无*/void drv_timer_oc1_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode, enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR1.bit_o.OC1PE = 1; //预装载使能pTimer->CCMR1.bit_1S = 0; //配置为输出pTimer->CCMR1.bit_o.OC1M = TimerOCMode; //输出模式pTimer->CR2.bit.OIS1 = TimerOCIdleStatus; //输出空闲状态pTimer->1P = TimerOCPolarity; //有效极性pTimer->CCR1 = 0; //输出比较值}/*** @brief 定时器输出通道1互补通道初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @param TimerOCNIdleStatus: 互补通道输出时状态,类型enumTimerOCIdleStatusType * @retval 无*/void drv_timer_oc1n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity, enumTimerOCIdleStatusType TimerOCNIdleStatus ){if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR1.bit_o.OC1PE = 1; //预装载使能pTimer->CCMR1.bit_1S = 0; //配置为输出pTimer->CCMR1.bit_o.OC1M = TimerOCNMode; //输出模式pTimer->CR2.bit.OIS1N = TimerOCNIdleStatus; //输出空闲状态pTimer->1NP = TimerOCNPolarity; //有效极性pTimer->CCR1 = 0; //输出比较值}/*** @brief 定时器输出通道2初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType* @retval 无*/void drv_timer_oc2_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode,enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR1.bit_o.OC2PE = 1; //预装载使能pTimer->CCMR1.bit_2S = 0; //配置为输出pTimer->CCMR1.bit_o.OC2M = TimerOCMode; //输出模式pTimer->CR2.bit.OIS2 = TimerOCIdleStatus; //输出空闲状态pTimer->2P = TimerOCPolarity; //有效极性pTimer->CCR2 = 0; //输出比较值}/*** @brief 定时器输出通道2互补通道初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @param TimerOCNIdleStatus: 互补通道输出时状态,类型enumTimerOCIdleStatusType * @retval 无*/void drv_timer_oc2n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity, enumTimerOCIdleStatusType TimerOCNIdleStatus ){if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR1.bit_o.OC2PE = 1; //预装载使能pTimer->CCMR1.bit_2S = 0; //配置为输出pTimer->CCMR1.bit_o.OC2M = TimerOCNMode; //输出模式pTimer->CR2.bit.OIS2N = TimerOCNIdleStatus; //输出空闲状态pTimer->2NP = TimerOCNPolarity; //有效极性pTimer->CCR2 = 0; //输出比较值}/*** @brief 定时器输出通道3初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType* @retval 无*/void drv_timer_oc3_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode, enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR2.bit_o.OC3PE = 1; //预装载使能pTimer->CCMR2.bit_3S = 0; //配置为输出pTimer->CCMR2.bit_o.OC3M = TimerOCMode; //输出模式pTimer->CR2.bit.OIS3 = TimerOCIdleStatus; //输出空闲状态pTimer->3P = TimerOCPolarity; //有效极性pTimer->CCR3 = 0; //输出比较值}/*** @brief 定时器输出通道3互补通道初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @param TimerOCNIdleStatus: 互补通道输出时状态,类型enumTimerOCIdleStatusType * @retval 无*/void drv_timer_oc3n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity, enumTimerOCIdleStatusType TimerOCNIdleStatus ){if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR2.bit_o.OC3PE = 1; //预装载使能pTimer->CCMR2.bit_3S = 0; //配置为输出pTimer->CCMR2.bit_o.OC3M = TimerOCNMode; //输出模式pTimer->CR2.bit.OIS3N = TimerOCNIdleStatus; //输出空闲状态pTimer->3NP = TimerOCNPolarity; //有效极性pTimer->CCR3 = 0; //输出比较值}/*** @brief 定时器输出通道3初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType* @retval 无*/void drv_timer_oc4_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode, enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR2.bit_o.OC4PE = 1; //预装载使能pTimer->CCMR2.bit_4S = 0; //配置为输出pTimer->CCMR2.bit_o.OC4M = TimerOCMode; //输出模式pTimer->CR2.bit.OIS4 = TimerOCIdleStatus; //输出空闲状态pTimer->4P = TimerOCPolarity; //有效极性pTimer->CCR4 = 0; //输出比较值}/*** @brief 定时器输出通道4互补通道初始化* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @retval 无*/void drv_timer_oc4n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity ){if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 )){pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}pTimer->CCMR2.bit_o.OC4PE = 1; //预装载使能pTimer->CCMR2.bit_4S = 0; //配置为输出pTimer->CCMR2.bit_o.OC4M = TimerOCNMode; //输出模式pTimer->4NP = TimerOCNPolarity; //有效极性pTimer->CCR4 = 0; //输出比较值}/*** @brief 设置定时器通道1捕获比较值* @param pTimer: 定时器TIM1~TIM14* @param Compara1: 捕获比较值* @retval 无*/void drv_timer_set_compara1( TimerType *pTimer, UINT32 Compara1 ) {pTimer->CCR1 = Compara1;}/*** @brief 设置定时器通道2捕获比较值* @param pTimer: 定时器TIM1~TIM14* @param Compara2: 捕获比较值* @retval 无*/void drv_timer_set_compara2( TimerType *pTimer, UINT32 Compara2 ) {pTimer->CCR2 = Compara2;}/*** @brief 设置定时器通道3捕获比较值* @param pTimer: 定时器TIM1~TIM14* @param Compara3: 捕获比较值* @retval 无*/void drv_timer_set_compara3( TimerType *pTimer, UINT32 Compara3 ) {pTimer->CCR3 = Compara3;}/*** @brief 设置定时器通道4捕获比较值.* @param pTimer: 定时器TIM1~TIM14* @param Compara4: 捕获比较值* @retval 无*/void drv_timer_set_compara4( TimerType *pTimer, UINT32 Compara4 ) {pTimer->CCR4 = Compara4;}/*** @brief 获取定时器通道1捕获比较值.* @param pTimer: 定时器TIM1~TIM9 TIM14* @retval 无*/UINT32 drv_timer_get_compara1( TimerType *pTimer ) {return ( pTimer->CCR1 );}/*** @brief 获取定时器通道2捕获比较值.* @param pTimer: 定时器TIM1~TIM9 TIM14* @retval 无*/UINT32 drv_timer_get_compara2( TimerType *pTimer ) {return ( pTimer->CCR2 );}/*** @brief 获取定时器通道3捕获比较值.* @param pTimer: 定时器TIM1~TIM9 TIM14* @retval 无*/UINT32 drv_timer_get_compara3( TimerType *pTimer ) {return ( pTimer->CCR3 );}/*** @brief 获取定时器通道4捕获比较值.* @param pTimer: 定时器TIM1~TIM9 TIM14* @retval 无*/UINT32 drv_timer_get_compara4( TimerType *pTimer ) {return ( pTimer->CCR4 );}/*** @brief 强制定时器输出1波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc1_active( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC1M = 5;}/*** @brief 强制定时器输出1波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc1_inactive( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC1M = 4;}/*** @brief 强制定时器输出2波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc2_active( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC2M = 5;}/*** @brief 强制定时器输出2波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc2_inactive( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC2M = 4;}/*** @brief 强制定时器输出3波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc3_active( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC3M = 5;}/*** @brief 强制定时器输出3波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc3_inactive( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC3M = 4;}/*** @brief 强制定时器输出4波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc4_active( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC4M = 5;}/*** @brief 强制定时器输出4波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8* @retval 无*/void drv_timer_forced_oc4_inactive( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC4M = 4;}/*** @brief 使能定时器CCR1预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_ccr1_preload_enable( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC1PE = 1;}/*** @brief 禁止定时器CCR1预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_ccr1_preload_disable( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC1PE = 0;}/*** @brief 使能定时器CCR2预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_ccr2_preload_enable( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC2PE = 1;}/*** @brief 禁止定时器CCR2预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_ccr2_preload_disable( TimerType* pTimer ) {pTimer->CCMR1.bit_o.OC2PE = 0;}/*** @brief 使能定时器CCR3预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_ccr3_preload_enable( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC3PE = 1;}/*** @brief 禁止定时器CCR3预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_ccr3_preload_disable( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC3PE = 0;}/*** @brief 使能定时器CCR4预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_ccr4_preload_enable( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC4PE = 1;}/*** @brief 禁止定时器CCR4预装载.* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_ccr4_preload_disable( TimerType* pTimer ) {pTimer->CCMR2.bit_o.OC4PE = 0;}/*** @brief 配置定时器输出通道1输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_set_oc1_polarity_high( TimerType* pTimer ) {pTimer->1P = 1;}/*** @brief 配置定时器输出通道1输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无*/void drv_timer_set_oc1_polarity_low( TimerType* pTimer ) {pTimer->1P = 0;}/*** @brief 配置定时器输出通道1N输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc1n_polarity_high( TimerType* pTimer ) {pTimer->1NP = 1;}/*** @brief 配置定时器输出通道1N输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc1n_polarity_low( TimerType* pTimer ) {pTimer->1NP = 0;}/*** @brief 配置定时器输出通道2输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc2_polarity_high( TimerType* pTimer ) {pTimer->2P = 1;}/*** @brief 配置定时器输出通道2输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc2_polarity_low( TimerType* pTimer ) {pTimer->2P = 0;}/*** @brief 配置定时器输出通道2N输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc2n_polarity_high( TimerType* pTimer ) {pTimer->2NP = 1;}/*** @brief 配置定时器输出通道2N输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc2n_polarity_low( TimerType* pTimer ) {pTimer->2NP = 0;}/*** @brief 配置定时器输出通道3输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc3_polarity_high( TimerType* pTimer ) {pTimer->3P = 1;}/*** @brief 配置定时器输出通道3输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc3_polarity_low( TimerType* pTimer ) {pTimer->3P = 0;}/*** @brief 配置定时器输出通道3N输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc3n_polarity_high( TimerType* pTimer ) {pTimer->3NP = 1;}/*** @brief 配置定时器输出通道3N输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc3n_polarity_low( TimerType* pTimer ) {pTimer->3NP = 0;}/*** @brief 配置定时器输出通道4输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc4_polarity_high( TimerType* pTimer ) {pTimer->4P = 1;}/*** @brief 配置定时器输出通道4输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.* @retval 无*/void drv_timer_set_oc4_polarity_low( TimerType* pTimer ) {pTimer->4P = 0;}/*** @brief 使能定时器捕获比较通道1* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14* @retval 无*/void drv_timer_ccx1_enable( TimerType* pTimer ){pTimer->1E = 1;}/*** @brief 定时定时器捕获比较通道1* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx1_disable( TimerType* pTimer ) {pTimer->1E = 0;}/*** @brief 使能定时器捕获比较通道2* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx2_enable( TimerType* pTimer ) {pTimer->2E = 1;}/*** @brief 定时定时器捕获比较通道2* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx2_disable( TimerType* pTimer ) {pTimer->2E = 0;}/*** @brief 使能定时器捕获比较通道3* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx3_enable( TimerType* pTimer ) {pTimer->3E = 1;}/*** @brief 定时定时器捕获比较通道3* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx3_disable( TimerType* pTimer ) {pTimer->3E = 0;}/*** @brief 使能定时器捕获比较通道4* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx4_enable( TimerType* pTimer ) {pTimer->4E = 1;}/*** @brief 定时定时器捕获比较通道4* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx4_disable( TimerType* pTimer ) {pTimer->4E = 0;}/*** @brief 使能定时器捕获比较通道1N* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx1n_enable( TimerType* pTimer ) {pTimer->1NE = 1;}/*** @brief 定时定时器捕获比较通道1N* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx1n_disable( TimerType* pTimer )pTimer->1NE = 0;}/*** @brief 使能定时器捕获比较通道2N* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx2n_enable( TimerType* pTimer ) {pTimer->2NE = 1;}/*** @brief 定时定时器捕获比较通道2N* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx2n_disable( TimerType* pTimer ) {pTimer->2NE = 0;}/*** @brief 使能定时器捕获比较通道3N* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx3n_enable( TimerType* pTimer ) {pTimer->3NE = 1;}/*** @brief 禁止定时器捕获比较通道3N* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无*/void drv_timer_ccx3n_disable( TimerType* pTimer ) {pTimer->3NE = 0;}* @brief 设置定时器PWM断路输入1* @param pTimer: 定时器* @param TimerBreakPolarity :BK输入有效极性* @param TimerIcFilter :BK输入滤波器* @retval 无*/void drv_timer_set_pwm_brake1( TimerType* pTimer, enumTimerBrakePolarityType TimerBreakPolarity, enumTimerIcFilterType TimerIcFilter ){pTimer->BDTR.bit.BKP = (UINT8)TimerBreakPolarity;pTimer->BDTR.bit.BKF = (UINT8)TimerIcFilter;}/*** @brief 设置定时器PWM断路输入2* @param pTimer: 定时器* @param TimerBreakPolarity :BK输入有效极性* @param TimerIcFilter :BK输入滤波器* @retval 无*/void drv_timer_set_pwm_brake2( TimerType* pTimer, enumTimerBrakePolarityType TimerBreakPolarity, enumTimerIcFilterType TimerIcFilter ){pTimer->BDTR.bit.BK2P = (UINT8)TimerBreakPolarity;pTimer->BDTR.bit.BK2F = (UINT8)TimerIcFilter;}/*** @brief 使能定时器PWM断路输入1* @param pTimer: 定时器* @retval 无*/void drv_timer_enable_pwm_brake1( TimerType* pTimer ){pTimer->BDTR.bit.BKE = 1;}/*** @brief 使能定时器PWM断路输入2* @param pTimer: 定时器* @retval 无*/void drv_timer_enable_pwm_brake2( TimerType* pTimer )pTimer->BDTR.bit.BK2E = 1;}/*** @brief 使能定时器PWM断路输入1* @param pTimer: 定时器* @retval 无*/void drv_timer_disable_pwm_brake1( TimerType* pTimer ){pTimer->BDTR.bit.BKE = 0;}/*** @brief 使能定时器PWM断路输入1* @param pTimer: 定时器* @retval 无*/void drv_timer_disable_pwm_brake2( TimerType* pTimer ){pTimer->BDTR.bit.BK2E = 0;}/*** @brief 定时器输入通道1初始化* @param pTimer: 定时器* @param TimerIcPolarity: 输入通道捕获触发极性,见类型enumTimerIcPolarityType* @param TimerIcPresclar: 输入通道捕分频,见类型enumTimerIcPresclarType* @param TimerIcSelection: 输入通道捕获映射选择,见类型enumTimerIcSelectionType* @param TimerIcFilter: 输入通道捕获滤波器,见类型enumTimerIcFilterType* @retval 无*/void drv_timer_ic1_init( TimerType *pTimer, enumTimerIcPolarityType TimerIcPolarity, enumTimerIcPresclarType TimerIcPresclar, enumTimerIcSelectionType TimerIcSelection, enumTimerIcFilterType TimerIcFilter ){pTimer->CCMR1.bit_1S = TimerIcSelection; //输入映射选择pTimer->CCMR1.bit_i.IC1PSC = TimerIcPresclar; //输入捕获预分频,N次事件执行一次捕获pTimer->CCMR1.bit_i.IC1F = TimerIcFilter; //滤波器频率设置switch ( TimerIcPolarity ) //触发边沿设置{case TIM_IC_POLARITY_RISING:pTimer->1P = 0;pTimer->1NP = 0;break;case TIM_IC_POLARITY_FALLING:pTimer->1P = 1;pTimer->1NP = 0; break;case TIM_IC_POLARITY_BOTHEDGE:pTimer->1P = 1;pTimer->1NP = 1; break;default: break;}}/*** @brief 定时器输入通道2初始化* @param TimerIcPolarity: 输入通道捕获触发极性,见类型enumTimerIcPolarityType* @param TimerIcPresclar: 输入通道捕分频,见类型enumTimerIcPresclarType* @param TimerIcSelection: 输入通道捕获映射选择,见类型enumTimerIcSelectionType* @param TimerIcFilter: 输入通道捕获滤波器,见类型enumTimerIcFilterType* @retval 无*/void drv_timer_ic2_init( TimerType *pTimer, enumTimerIcPolarityType TimerIcPolarity, enumTimerIcPresclarType TimerIcPresclar,enumTimerIcSelectionType TimerIcSelection, enumTimerIcFilterType TimerIcFilter ){pTimer->CCMR1.bit_2S = TimerIcSelection;pTimer->CCMR1.bit_i.IC2PSC = TimerIcPresclar;pTimer->CCMR1.bit_i.IC2F = TimerIcFilter;switch ( TimerIcPolarity ){case TIM_IC_POLARITY_RISING:pTimer->2P = 0;pTimer->2NP = 0; break;case TIM_IC_POLARITY_FALLING:pTimer->2P = 1;pTimer->2NP = 0; break;case TIM_IC_POLARITY_BOTHEDGE:pTimer->2P = 1;pTimer->2NP = 1; break;default: break;}}/*** @brief 定时器输入通道3初始化* @param pTimer: 定时器* @param TimerIcPolarity: 输入通道捕获触发极性,见类型enumTimerIcPolarityType* @param TimerIcPresclar: 输入通道捕分频,见类型enumTimerIcPresclarType* @param TimerIcSelection: 输入通道捕获映射选择,见类型enumTimerIcSelectionType* @param TimerIcFilter: 输入通道捕获滤波器,见类型enumTimerIcFilterType* @retval 无*/void drv_timer_ic3_init( TimerType *pTimer, enumTimerIcPolarityType TimerIcPolarity, enumTimerIcPresclarType TimerIcPresclar,enumTimerIcSelectionType TimerIcSelection, enumTimerIcFilterType TimerIcFilter ){pTimer->CCMR2.bit_3S = TimerIcSelection;pTimer->CCMR2.bit_i.IC3PSC = TimerIcPresclar;pTimer->CCMR2.bit_i.IC3F = TimerIcFilter;switch ( TimerIcPolarity ){case TIM_IC_POLARITY_RISING:pTimer->3P = 0;pTimer->3NP = 0; break;case TIM_IC_POLARITY_FALLING:pTimer->3P = 1;pTimer->3NP = 0; break;case TIM_IC_POLARITY_BOTHEDGE:pTimer->3P = 1;pTimer->3NP = 1; break;default: break;}}/*** @brief 定时器输入通道4初始化* @param pTimer: 定时器* @param TimerIcPolarity: 输入通道捕获触发极性,见类型enumTimerIcPolarityType* @param TimerIcPresclar: 输入通道捕分频,见类型enumTimerIcPresclarType* @param TimerIcSelection: 输入通道捕获映射选择,见类型enumTimerIcSelectionType* @param TimerIcFilter: 输入通道捕获滤波器,见类型enumTimerIcFilterType* @retval 无*/void drv_timer_ic4_init( TimerType *pTimer, enumTimerIcPolarityType TimerIcPolarity, enumTimerIcPresclarType TimerIcPresclar,enumTimerIcSelectionType TimerIcSelection, enumTimerIcFilterType TimerIcFilter ){pTimer->CCMR2.bit_4S = TimerIcSelection;pTimer->CCMR2.bit_i.IC4PSC = TimerIcPresclar;pTimer->CCMR2.bit_i.IC4F = TimerIcFilter;switch ( TimerIcPolarity ){case TIM_IC_POLARITY_RISING: pTimer->4P = 0; break;case TIM_IC_POLARITY_FALLING: pTimer->4P = 1; break;case TIM_IC_POLARITY_BOTHEDGE: pTimer->4P = 1; break;default: break;}}/*** @brief 定时器输入通道1使能* @param pTimer: 定时器* @retval 无*/void drv_timer_ic1_enable( TimerType* pTimer ){pTimer->1E = 1;}/*** @brief 定时器输入通道1禁止* @param pTimer: 定时器* @retval 无*/void drv_timer_ic1_disable( TimerType* pTimer ){pTimer->1E = 0;}/*** @brief 定时器输入通道2使能* @param pTimer: 定时器* @retval 无*/void drv_timer_ic2_enable( TimerType* pTimer )。