对应定时器配置
- 格式: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计数器都会停止计时或计数。
#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 )。