目录FTM定时器概念定义定时器运用常用概念S32DS添加FTM库S32DSFTM外设配置S32DS添加库冲突概念理解FTM_DRV_Init函数定义FTM_DRV_InitCounter外设函数FTM_DRV_InitCounter外设函数FTM_DRV_CounterStart外设函数INT_SYS_InstallHandler外设函数INT_SYS_InstallHandler定义INT_SYS_EnableIRQ外设函数编写对应定时器代码FTM定时器概念定义FTM是NXP芯片上MCU中内置的片上外设FTM的全称是FlexTimer然后跟其他芯片外设中的定时器一样通常用于输入捕获ICU跟输出比较OC还有生成pwm以及时间延迟、逻辑调度等功能。FTM可以选择时钟源包括输入时钟、固定频率时钟、外部时钟、FTM定时器有16位递增、递减计数器计数器可以设置自由运行或者用户设置起始值跟结束预分频系数也可以设定然后芯片内置了四路FTM资源分别是FTM0、FTM1、FTM2、FTM3 具体表格如下所示。S32K144芯片FTM实例通道FTM0CH0-CH7FTM1CH0-CH7FTM2CH0-CH7FTM3CH0-CH7定时器运用常用概念hz频率计算的是电平翻转修复的次数其默认隐藏时间是1s如果某定时器频率是1hz即代表意思是在1s时间内发生1000次电平翻转。然后FTM的定时器hz如果是375khz也就是1s中发生375000次电平翻转按照这个比例如果想要0.1s触发一种中断那么定时器需要设置37500计数值也就是定时器的十分之一的频率即可。然后如果需要1s以上的时间触发定时器中断需要使用1s触发一次内置变量在中断函数里面通过判断函数触发次数来判断时间同时判断是否调用启动内容。S32DS添加FTM库这里添加FTM库到工程中然后配置对应的外设。S32DSFTM外设配置添加对应的库到工程中具体如下所示。然后配置对应的参数具体如下所示。参数里面定时器溢出中断是必须开启的开启这个定时器在计数溢出的时候才会开启中断吗然后是时钟源、分频系数等参数然后需要设置定时器初始化值跟定时器触发中断数据值这些参数根据自己需要进行配置。S32DS添加库冲突概念理解如果你在S32DS的库中添加了其他外设库并且在两个不同的外设库中配置了同一个引脚这个时候就会发生外设库冲突因为生成的Generate_Code代码中同时使用了这两个引脚然后因为又被配置也就是发生的资源冲突这个时候会发现程序跑不起来需要将对应的库进行删除才能进行运行。这个是有看门狗外设库的生成代码具体如下所示。然后当给看门狗库删除之后再生成代码代码中该部分会被生成然后覆盖掉具体如下所示。FTM_DRV_Init函数定义该函数用于将定时器外设生成结构体配置代码初始化进芯片中函数原型如下所示。status_t FTM_DRV_Init(uint32_t instance, const ftm_user_config_t * info, ftm_state_t * state)然后再函数参数中第一个参数 instance 是选择初始化那个芯片外设然后第二个参数是将定时器配置界面配置参数生成的结构体定义进行取地址ftm_user_config_t 也就是用户配置定时器配置结构体将用户的配置初始化到instance选择的芯片外设中然后state结构体中定义了大量的定时器外设状态成员属性。在运行的过程中state的成员属性会实时进行更新同时如果需要查询定时器频率或者中断等状态可以通过state的这个结构体边量来进行查询。FTM_DRV_InitCounter外设函数这个函数用来开启定时器计数模式这个函数只用来配置定时器的定时模式舍弃了定时器的pwm ICU等功能。FTM_DRV_InitCounter外设函数这个函数中两个参数其中instance是对应的系统硬件编号然后ftm_timer_param_t这个结构体是对应的系统配置中生成的硬件结构体参数。status_t FTM_DRV_InitCounter(uint32_t instance, const ftm_timer_param_t * timer) #define INST_FLEXTIMER_MC1 0U /* Timer mode configuration for flexTimer_mc1 */ ftm_timer_param_t flexTimer_mc1_TimerConfig { FTM_MODE_UP_TIMER, /* Counter mode */ 0U, /* Initial counter value */ 37500U, /* Final counter value */ };然后将这些系统初始化配置初始化对应的定时器定时模式中进去。FTM_DRV_CounterStart外设函数开启定时器计数模式函数在完成配置定时器计数模式的函数初始化之后需要调用这个函数来开启计数模式具体函数原型如下所示。status_t FTM_DRV_CounterStart(uint32_t instance)这里需要注意的是该函数顺序必须在函数定时器模式配置之后在调用这个函数。INT_SYS_InstallHandler外设函数首先这个函数中INT是中断的缩写然后SYS是系统的意思Intasll是安装的意思然后Handler是第一个意思也就是处理程序的意思除此之外handler还有一个意思在程序中也经常使用也就是句柄的意思这意思通常指的是程序资源或者对象标识符通常一个函数返回值也能够称为句柄进行使用。INT_SYS_InstallHandler定义首先这个函数是S32DS中的中断注册函数这个函数能够修改中断向量表将自己定义的函数newHandler绑定到系统的硬件资源上去具体函数原型如下所示。void INT_SYS_InstallHandler(IRQn_Type irqNumber, const isr_t newHandler, isr_t* const oldHandler)其中irqNunber是对应的硬件外设中断然后newhandler是新的处理函数oldhandler是旧的程序如果没有这里通过(isr_t * )0也就是空指针来进行处理。同时在初始化完成之后系统就会调用自己定义的中断处理函数来相应对应的中断事件发生了。INT_SYS_EnableIRQ外设函数在完成中断外设的初始化配置之后还有进行Enable来进行使能使能的目的是开启NVIC中断嵌套向量控制器 的中断编号如果不开启当外设硬件中断响应之后NVIC因为没有开启中断通道依然会被屏蔽掉。void INT_SYS_EnableIRQ(IRQn_Type irqNumber)编写对应定时器代码/* ################################################################### ** Filename : main.c ** Processor : S32K1xx ** Abstract : CAN例程 发送接收CAN报文 ** Main module. ** This module contains users application code. ** Settings : ** Contents : ** No public methods ** ** ###################################################################*/ /*! ** file main.c ** version 01.00 ** brief ** Main module. ** This module contains users application code. */ /*! ** addtogroup main_module main module documentation ** { */ /* MODULE main */ /* Including necessary module. Cpu.h contains other modules needed for compiling.*/ #include Cpu.h #include delay.h //#include key.h volatile int exit_code 0; volatile int Flag 0U; void ftmisr(void) { Flag; if(Flag 10U) { PINS_DRV_TogglePins(PTD,(10)|(11)); Flag 0; } PINS_DRV_TogglePins(PTD,(115)|(116)); FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_MC1,FTM_TIME_OVER_FLOW_FLAG); } /*! \brief The main function for the project. \details The startup initialization sequence is the following: * - startup asm routine * - main() */ int main(void) { /* Write your local variable definition here */ //记得初始化变量 ftm_state_t ftm_state; /*** Processor Expert internal initialization. DONT REMOVE THIS CODE!!! ***/ #ifdef PEX_RTOS_INIT PEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */ #endif /*** End of Processor Expert internal initialization. ***/ /* Write your code here */ /* For example: for(;;) { } */ //时钟初始化 CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT); CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);//更新时钟 delay_init(); PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); //初始化IO FTM_DRV_Init(INST_FLEXTIMER_MC1, flexTimer_mc1_InitConfig,ftm_state); INT_SYS_InstallHandler(FTM0_Ovf_Reload_IRQn,ftmisr,(isr_t*)0); INT_SYS_EnableIRQ(FTM0_Ovf_Reload_IRQn); FTM_DRV_InitCounter(INST_FLEXTIMER_MC1, flexTimer_mc1_TimerConfig); FTM_DRV_CounterStart(INST_FLEXTIMER_MC1); while(1) { } /*** Dont write any code pass this line, or it will be deleted during code generation. ***/ /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DONT MODIFY THIS CODE!!! ***/ #ifdef PEX_RTOS_START PEX_RTOS_START(); /* Startup of the selected RTOS. Macro is defined by the RTOS component. */ #endif /*** End of RTOS startup code. ***/ /*** Processor Expert end of main routine. DONT MODIFY THIS CODE!!! ***/ for(;;) { if(exit_code ! 0) { break; } } return exit_code; /*** Processor Expert end of main routine. DONT WRITE CODE BELOW!!! ***/ } /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/ /* END main */ /*! ** } */ /* ** ################################################################### ** ** This file was created by Processor Expert 10.1 [05.21] ** for the NXP S32K series of microcontrollers. ** ** ################################################################### */
S32K144FTM定时器中断
目录FTM定时器概念定义定时器运用常用概念S32DS添加FTM库S32DSFTM外设配置S32DS添加库冲突概念理解FTM_DRV_Init函数定义FTM_DRV_InitCounter外设函数FTM_DRV_InitCounter外设函数FTM_DRV_CounterStart外设函数INT_SYS_InstallHandler外设函数INT_SYS_InstallHandler定义INT_SYS_EnableIRQ外设函数编写对应定时器代码FTM定时器概念定义FTM是NXP芯片上MCU中内置的片上外设FTM的全称是FlexTimer然后跟其他芯片外设中的定时器一样通常用于输入捕获ICU跟输出比较OC还有生成pwm以及时间延迟、逻辑调度等功能。FTM可以选择时钟源包括输入时钟、固定频率时钟、外部时钟、FTM定时器有16位递增、递减计数器计数器可以设置自由运行或者用户设置起始值跟结束预分频系数也可以设定然后芯片内置了四路FTM资源分别是FTM0、FTM1、FTM2、FTM3 具体表格如下所示。S32K144芯片FTM实例通道FTM0CH0-CH7FTM1CH0-CH7FTM2CH0-CH7FTM3CH0-CH7定时器运用常用概念hz频率计算的是电平翻转修复的次数其默认隐藏时间是1s如果某定时器频率是1hz即代表意思是在1s时间内发生1000次电平翻转。然后FTM的定时器hz如果是375khz也就是1s中发生375000次电平翻转按照这个比例如果想要0.1s触发一种中断那么定时器需要设置37500计数值也就是定时器的十分之一的频率即可。然后如果需要1s以上的时间触发定时器中断需要使用1s触发一次内置变量在中断函数里面通过判断函数触发次数来判断时间同时判断是否调用启动内容。S32DS添加FTM库这里添加FTM库到工程中然后配置对应的外设。S32DSFTM外设配置添加对应的库到工程中具体如下所示。然后配置对应的参数具体如下所示。参数里面定时器溢出中断是必须开启的开启这个定时器在计数溢出的时候才会开启中断吗然后是时钟源、分频系数等参数然后需要设置定时器初始化值跟定时器触发中断数据值这些参数根据自己需要进行配置。S32DS添加库冲突概念理解如果你在S32DS的库中添加了其他外设库并且在两个不同的外设库中配置了同一个引脚这个时候就会发生外设库冲突因为生成的Generate_Code代码中同时使用了这两个引脚然后因为又被配置也就是发生的资源冲突这个时候会发现程序跑不起来需要将对应的库进行删除才能进行运行。这个是有看门狗外设库的生成代码具体如下所示。然后当给看门狗库删除之后再生成代码代码中该部分会被生成然后覆盖掉具体如下所示。FTM_DRV_Init函数定义该函数用于将定时器外设生成结构体配置代码初始化进芯片中函数原型如下所示。status_t FTM_DRV_Init(uint32_t instance, const ftm_user_config_t * info, ftm_state_t * state)然后再函数参数中第一个参数 instance 是选择初始化那个芯片外设然后第二个参数是将定时器配置界面配置参数生成的结构体定义进行取地址ftm_user_config_t 也就是用户配置定时器配置结构体将用户的配置初始化到instance选择的芯片外设中然后state结构体中定义了大量的定时器外设状态成员属性。在运行的过程中state的成员属性会实时进行更新同时如果需要查询定时器频率或者中断等状态可以通过state的这个结构体边量来进行查询。FTM_DRV_InitCounter外设函数这个函数用来开启定时器计数模式这个函数只用来配置定时器的定时模式舍弃了定时器的pwm ICU等功能。FTM_DRV_InitCounter外设函数这个函数中两个参数其中instance是对应的系统硬件编号然后ftm_timer_param_t这个结构体是对应的系统配置中生成的硬件结构体参数。status_t FTM_DRV_InitCounter(uint32_t instance, const ftm_timer_param_t * timer) #define INST_FLEXTIMER_MC1 0U /* Timer mode configuration for flexTimer_mc1 */ ftm_timer_param_t flexTimer_mc1_TimerConfig { FTM_MODE_UP_TIMER, /* Counter mode */ 0U, /* Initial counter value */ 37500U, /* Final counter value */ };然后将这些系统初始化配置初始化对应的定时器定时模式中进去。FTM_DRV_CounterStart外设函数开启定时器计数模式函数在完成配置定时器计数模式的函数初始化之后需要调用这个函数来开启计数模式具体函数原型如下所示。status_t FTM_DRV_CounterStart(uint32_t instance)这里需要注意的是该函数顺序必须在函数定时器模式配置之后在调用这个函数。INT_SYS_InstallHandler外设函数首先这个函数中INT是中断的缩写然后SYS是系统的意思Intasll是安装的意思然后Handler是第一个意思也就是处理程序的意思除此之外handler还有一个意思在程序中也经常使用也就是句柄的意思这意思通常指的是程序资源或者对象标识符通常一个函数返回值也能够称为句柄进行使用。INT_SYS_InstallHandler定义首先这个函数是S32DS中的中断注册函数这个函数能够修改中断向量表将自己定义的函数newHandler绑定到系统的硬件资源上去具体函数原型如下所示。void INT_SYS_InstallHandler(IRQn_Type irqNumber, const isr_t newHandler, isr_t* const oldHandler)其中irqNunber是对应的硬件外设中断然后newhandler是新的处理函数oldhandler是旧的程序如果没有这里通过(isr_t * )0也就是空指针来进行处理。同时在初始化完成之后系统就会调用自己定义的中断处理函数来相应对应的中断事件发生了。INT_SYS_EnableIRQ外设函数在完成中断外设的初始化配置之后还有进行Enable来进行使能使能的目的是开启NVIC中断嵌套向量控制器 的中断编号如果不开启当外设硬件中断响应之后NVIC因为没有开启中断通道依然会被屏蔽掉。void INT_SYS_EnableIRQ(IRQn_Type irqNumber)编写对应定时器代码/* ################################################################### ** Filename : main.c ** Processor : S32K1xx ** Abstract : CAN例程 发送接收CAN报文 ** Main module. ** This module contains users application code. ** Settings : ** Contents : ** No public methods ** ** ###################################################################*/ /*! ** file main.c ** version 01.00 ** brief ** Main module. ** This module contains users application code. */ /*! ** addtogroup main_module main module documentation ** { */ /* MODULE main */ /* Including necessary module. Cpu.h contains other modules needed for compiling.*/ #include Cpu.h #include delay.h //#include key.h volatile int exit_code 0; volatile int Flag 0U; void ftmisr(void) { Flag; if(Flag 10U) { PINS_DRV_TogglePins(PTD,(10)|(11)); Flag 0; } PINS_DRV_TogglePins(PTD,(115)|(116)); FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_MC1,FTM_TIME_OVER_FLOW_FLAG); } /*! \brief The main function for the project. \details The startup initialization sequence is the following: * - startup asm routine * - main() */ int main(void) { /* Write your local variable definition here */ //记得初始化变量 ftm_state_t ftm_state; /*** Processor Expert internal initialization. DONT REMOVE THIS CODE!!! ***/ #ifdef PEX_RTOS_INIT PEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */ #endif /*** End of Processor Expert internal initialization. ***/ /* Write your code here */ /* For example: for(;;) { } */ //时钟初始化 CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT); CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);//更新时钟 delay_init(); PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); //初始化IO FTM_DRV_Init(INST_FLEXTIMER_MC1, flexTimer_mc1_InitConfig,ftm_state); INT_SYS_InstallHandler(FTM0_Ovf_Reload_IRQn,ftmisr,(isr_t*)0); INT_SYS_EnableIRQ(FTM0_Ovf_Reload_IRQn); FTM_DRV_InitCounter(INST_FLEXTIMER_MC1, flexTimer_mc1_TimerConfig); FTM_DRV_CounterStart(INST_FLEXTIMER_MC1); while(1) { } /*** Dont write any code pass this line, or it will be deleted during code generation. ***/ /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DONT MODIFY THIS CODE!!! ***/ #ifdef PEX_RTOS_START PEX_RTOS_START(); /* Startup of the selected RTOS. Macro is defined by the RTOS component. */ #endif /*** End of RTOS startup code. ***/ /*** Processor Expert end of main routine. DONT MODIFY THIS CODE!!! ***/ for(;;) { if(exit_code ! 0) { break; } } return exit_code; /*** Processor Expert end of main routine. DONT WRITE CODE BELOW!!! ***/ } /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/ /* END main */ /*! ** } */ /* ** ################################################################### ** ** This file was created by Processor Expert 10.1 [05.21] ** for the NXP S32K series of microcontrollers. ** ** ################################################################### */