NXP实战笔记(二):S32K3xx基于RTD-SDK在S32DS上配置PIT与STM中断并反转IO
目录
1、PIT
1.1、PIT概述
????????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.2、PIT的配置
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:是连续触发还是单次
1.3、Dio配置
点击引脚配置选项
选择功能,注入标签
注意配置Port,假设需要调用,例如翻转电平等,一定要添加DIO模块
1.4、中断配置
注意此处的1与2都为固定的,2句柄函数,在源码里面找,有的话必须填写一致,没有的话通过IntCtrl_Ip_InstallHandler 与IntCtrl_Ip_EnableIrq插入即可。
生成代码:点击更新源码即可
1.5、测试代码
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.6、测试结果
2、STM
2.1、STM概述
1、时钟源可在 CGM 中选择- AIPS_PLAT_CLK 或 FXOSC 或 FIRC
2、32bit可选择分频为1~256
3、一个32bit的比较寄存器
4、每个比较通道均有一个中断源
当启用时,计数器以模块频率除以8位预分频器值连续递增
STM有四个相同的比较通道。当通道被启用并且其比较值与计时器计数匹配时,STM设置通道中断标志并在该通道上生成IRQ。
2.2、STM的配置
1、如果应用中有两套时钟设置,则使用双时钟模式。预分频器和备用预分频器分别用于两种时钟模式。分别用于两种时钟模式。
2、启用该选项后,驱动程序代码 更新 STM 通道比较值 比较值。发生时更新 STM 通道比较值。
禁用该选项,则 STM 比较中断仅在计数器发生一次时发生。则 STM 比较中断在一个计数器周期内只发生一次。周期只发生一次。如果需要重复中断,则 中断回调函数必须相应地更新 比较值。
STM的时钟如下
此时48分频,也就是1MHz
2.3、测试代码
初始化
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;
}
2.4、测试结果
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!