NXP实战笔记(二):S32K3xx基于RTD-SDK在S32DS上配置PIT与STM中断并反转IO

2023-12-29 06:21:36

目录

1、PIT

1.1、PIT概述

1.2、PIT的配置

1.3、Dio配置

1.4、中断配置

1.5、测试代码

1.6、测试结果

2、STM

2.1、STM概述

2.2、STM的配置

2.3、测试代码

2.4、测试结果


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、测试结果

文章来源:https://blog.csdn.net/weixin_43580890/article/details/135267895
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。