赞
踩
目录
PIT是一组定时器,可用于引发中断和触发器,包括一个专用的实时中断(RTI),它运行在一个单独的时钟上,可用于系统唤醒。
S32K3XX有三个PIT实例
PIT的关键功能如下
1、定时产生触发脉冲的能力
2、可屏蔽中断
3、操作RTI的中断的能力,即使总线时钟被关闭
4、省电与单独的输入时钟为RTI定时器。所有其他计时器共享一个共同的核心时钟
5、每个计时器的独立超时时间
6、当计时器启用连锁模式时,它会在前一个计时器过期后计数。前一个定时器到期。如果定时器 n-1 倒计时到 0、计数器 n 的值就会递减 1。
7、第一个定时器(PIT0)不能链接到任何其他定时器
四个32位定时器通道,时钟源来自AIPS_SLOW_CLK
PIT_0中的一个RTI定时器(也只有RTI)在SIRC (32 KHz)上运行,并支持在STANDBY模式下运行
PIT是向下计数的,这点要非常注意。
计时器和模块由 "AIPS_SLOW_CLK "时钟控制
所有 PIT 实例都能生成周期性触发器,这些触发器可通过 TRGMUX 可通过 TRGMUX 路由至电机控制 IP,如eMIOS、LCU、BCTU、ADC。
包括 RTI 在内的所有 PIT 通道中断共享一个 IRQ 中断向量
1、点击工程目录下的.mex文件
弹出界面如下
功能按钮介绍如下
2、新建一个Pit模块
选择驱动配置,此处裸机是必选的,否则报错
解释概念:OSIF_COUNTER_DUMMY OSIF_COUNTER_SYSTEM OSIF_COUNTER_CUSTOM区别。
OSIF_COUNTER_DUMMY:这是一个虚拟的计数器,不与任何硬件或软件时钟相关联,只用于测试或调试目的。它的值可以通过OSIF_SetCounter函数手动设置,或者通过OSIF_IncrementCounter函数自增1。
OSIF_COUNTER_SYSTEM:这是一个系统级的计数器,与MCU的内核时钟相关联,用于提供高精度的时间测量和延时功能。它的值可以通过OSIF_GetSysTimestamp函数获取,或者通过OSIF_TimeDelay函数设置延时1。
OSIF_COUNTER_CUSTOM:这是一个自定义的计数器,可以与任何硬件或软件时钟相关联,用于实现特定的应用需求。它的值可以通过OSIF_GetCounter函数获取,或者通过OSIF_SetCounter函数设置1。
3、选择硬件通道
PIT0_0与PIT0_1组合成一个64bit的计数器,这样子不容易超时。PIT0_2用于中断触发。时间基准。
PIT0_0配置如下
PIT0_1配置如下
注意此处多了一个ChainMode配置,用于与PIT0_0组合成64bit的链表
PIT0_2的配置
用于产生中断函数
Pit Hardware Module:用于选择PITx,也就是用哪个PIT
Pit Channel 用于选择PIT的具体通道
ChainMode:是否形成链表的形式,注意此处只能Chain0才能与其他的组成链表。
Pit Channel Mode:是连续触发还是单次
点击引脚配置选项
选择功能,注入标签
注意配置Port,假设需要调用,例如翻转电平等,一定要添加DIO模块
注意此处的1与2都为固定的,2句柄函数,在源码里面找,有的话必须填写一致,没有的话通过IntCtrl_Ip_InstallHandler 与IntCtrl_Ip_EnableIrq插入即可。
生成代码:点击更新源码即可
- 1、初始化
- #define INT_SYS_DisableIRQGlobal() __asm(" cpsid i")
- #define INT_SYS_EnableIRQGlobal() __asm(" cpsie i")
- INT_SYS_DisableIRQGlobal();
- Clock_Ip_Init(&Clock_Ip_aClockConfig[0]); /* Initialize Clock */
- Pit_Ip_Init(0, &PIT_0_InitConfig_PB);
- Pit_Ip_InitChannel(0, PIT_0_CH_0);
- Pit_Ip_InitChannel(0, PIT_0_CH_1);
- Pit_Ip_InitChannel(0, PIT_0_CH_2);
- Pit_Ip_StartChannel(0, 2, 30000);
- Pit_Ip_EnableChannelInterrupt(0, 2);
- Pit_Ip_SetLifetimeTimer(0);
- IntCtrl_Ip_Init(&IntCtrlConfig_0);
- Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0);
- INT_SYS_EnableIRQGlobal();
注意一下30000的含义,首先看时钟,PIT的时钟为30MHz,1ms也就是运行了30000个Ticks。
- 执行代码
- #define UNUSED(x) (void)x
- volatile uint32 PitRunning = 0;
- uint64 PitRunPre = 0;/*此处64bit为PIT0_0与PIT0_1的组合*/
- uint64 PitRunLas = 0;
- uint64 PitRunLasx = 0;
- double PitRunTime = 0;
- double PitRunTimex = 0;
- void Pit0_Ch2_Callback(uint8 channel)
- {
-
- PitRunPre = Pit_Ip_GetLifetimeTimer(0);
- PitRunTimex = ((double)(PitRunLasx - PitRunPre))/30000.0;
- PitRunning++;
- if(PitRunning >=1000)
- {
- Siul2_Dio_Ip_TogglePins(LED_PORT,1<<LED_PIN);
- PitRunning = 0;
- }
-
- UNUSED(channel);
- PitRunLas = Pit_Ip_GetLifetimeTimer(0);
- PitRunTime = ((double)(PitRunPre - PitRunLas))/30000.0;
- PitRunLasx = PitRunPre;
-
- }
1、时钟源可在 CGM 中选择- AIPS_PLAT_CLK 或 FXOSC 或 FIRC
2、32bit可选择分频为1~256
3、一个32bit的比较寄存器
4、每个比较通道均有一个中断源
当启用时,计数器以模块频率除以8位预分频器值连续递增
STM有四个相同的比较通道。当通道被启用并且其比较值与计时器计数匹配时,STM设置通道中断标志并在该通道上生成IRQ。
1、如果应用中有两套时钟设置,则使用双时钟模式。预分频器和备用预分频器分别用于两种时钟模式。分别用于两种时钟模式。
2、启用该选项后,驱动程序代码 更新 STM 通道比较值 比较值。发生时更新 STM 通道比较值。
禁用该选项,则 STM 比较中断仅在计数器发生一次时发生。则 STM 比较中断在一个计数器周期内只发生一次。周期只发生一次。如果需要重复中断,则 中断回调函数必须相应地更新 比较值。
STM的时钟如下
此时48分频,也就是1MHz
- 初始化
- IntCtrl_Ip_Init(&IntCtrlConfig_0);
-
- Stm_Ip_Init(0, &STM_0_InitConfig_PB);
- Stm_Ip_InitChannel(0, &STM_0_ChannelConfig_PB[0]);
- Stm_Ip_EnableChannel(0,0);
- Stm_Ip_StartTimer(0, 0);
- Stm_Ip_StartCounting(0,0,1000);
- 执行代码
- void STM0_0_CallBack(uint8 channel)
- {
-
- PitRunPre = Pit_Ip_GetLifetimeTimer(0);
- PitRunTimex = ((double)(PitRunLasx - PitRunPre))/30000.0;
- PitRunning++;
- if(PitRunning >=1000)
- {
- Siul2_Dio_Ip_TogglePins(LED_PORT,1<<LED_PIN);
- PitRunning = 0;
- }
-
- UNUSED(channel);
- PitRunLas = Pit_Ip_GetLifetimeTimer(0);
- PitRunTime = ((double)(PitRunPre - PitRunLas))/30000.0;
- PitRunLasx = PitRunPre;
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。