当前位置:   article > 正文

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

s32k3xx.p01 rtd

目录

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. 1、初始化
  2. #define INT_SYS_DisableIRQGlobal() __asm(" cpsid i")
  3. #define INT_SYS_EnableIRQGlobal() __asm(" cpsie i")
  4. INT_SYS_DisableIRQGlobal();
  5. Clock_Ip_Init(&Clock_Ip_aClockConfig[0]); /* Initialize Clock */
  6. Pit_Ip_Init(0, &PIT_0_InitConfig_PB);
  7. Pit_Ip_InitChannel(0, PIT_0_CH_0);
  8. Pit_Ip_InitChannel(0, PIT_0_CH_1);
  9. Pit_Ip_InitChannel(0, PIT_0_CH_2);
  10. Pit_Ip_StartChannel(0, 2, 30000);
  11. Pit_Ip_EnableChannelInterrupt(0, 2);
  12. Pit_Ip_SetLifetimeTimer(0);
  13. IntCtrl_Ip_Init(&IntCtrlConfig_0);
  14. Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0);
  15. INT_SYS_EnableIRQGlobal();

注意一下30000的含义,首先看时钟,PIT的时钟为30MHz,1ms也就是运行了30000个Ticks。

  1. 执行代码
  2. #define UNUSED(x) (void)x
  3. volatile uint32 PitRunning = 0;
  4. uint64 PitRunPre = 0;/*此处64bit为PIT0_0与PIT0_1的组合*/
  5. uint64 PitRunLas = 0;
  6. uint64 PitRunLasx = 0;
  7. double PitRunTime = 0;
  8. double PitRunTimex = 0;
  9. void Pit0_Ch2_Callback(uint8 channel)
  10. {
  11. PitRunPre = Pit_Ip_GetLifetimeTimer(0);
  12. PitRunTimex = ((double)(PitRunLasx - PitRunPre))/30000.0;
  13. PitRunning++;
  14. if(PitRunning >=1000)
  15. {
  16. Siul2_Dio_Ip_TogglePins(LED_PORT,1<<LED_PIN);
  17. PitRunning = 0;
  18. }
  19. UNUSED(channel);
  20. PitRunLas = Pit_Ip_GetLifetimeTimer(0);
  21. PitRunTime = ((double)(PitRunPre - PitRunLas))/30000.0;
  22. PitRunLasx = PitRunPre;
  23. }

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、测试代码

  1. 初始化
  2. IntCtrl_Ip_Init(&IntCtrlConfig_0);
  3. Stm_Ip_Init(0, &STM_0_InitConfig_PB);
  4. Stm_Ip_InitChannel(0, &STM_0_ChannelConfig_PB[0]);
  5. Stm_Ip_EnableChannel(0,0);
  6. Stm_Ip_StartTimer(0, 0);
  7. Stm_Ip_StartCounting(0,0,1000);
  8. 执行代码
  9. void STM0_0_CallBack(uint8 channel)
  10. {
  11. PitRunPre = Pit_Ip_GetLifetimeTimer(0);
  12. PitRunTimex = ((double)(PitRunLasx - PitRunPre))/30000.0;
  13. PitRunning++;
  14. if(PitRunning >=1000)
  15. {
  16. Siul2_Dio_Ip_TogglePins(LED_PORT,1<<LED_PIN);
  17. PitRunning = 0;
  18. }
  19. UNUSED(channel);
  20. PitRunLas = Pit_Ip_GetLifetimeTimer(0);
  21. PitRunTime = ((double)(PitRunPre - PitRunLas))/30000.0;
  22. PitRunLasx = PitRunPre;
  23. }

2.4、测试结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/144425
推荐阅读
相关标签
  

闽ICP备14008679号