4、英飞凌-AURIX-TC3X7:系统定时器-STM实验

这篇博客详细介绍了如何使用英飞凌AURIX TC3X7系列MCU的STM(系统定时器)进行延时功能实现和LED控制。STM具有高精度和长周期特性,包括64位计数器、灵活的服务请求生成等功能。作者创建了一个名为TC3X7_STMDelay_Test的工程,编写了Systm_Time.c和Systm_Time.h驱动文件,提供systick_delay函数用于延时,并通过STM模块实现LED灯1s亮灭的周期性翻转。实验结果通过下载验证,源代码可在公众号‘Kevin的学习站’获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4、英飞凌 AURIX TC3X7 系统定时器-STM实验

声明:此博文是在学习英飞凌TC3X7系列MCU过程中写的比较,便于日后的复习;参考了英飞凌、逐飞开源库。

1、STM简介

1.1、作用

STM是为需要高精度和长周期的CPU系统定时应用而设计的。

1.2、特征

自由运行的64位计数器;

所有64位都可以同步读取;

64位计数器的不同的32位部分可以被同步读取;

基于与部分STM内容的比较匹配的灵活的服务请求生成;

在应用程序重置后,将自动开始计数;

STM寄存器由应用程序重置,如果位错误。STMxDIS已被清除。如果有点了。STMxDIS设置完毕,STM寄存器不会通过应用程序重置重置,而是通过系统重置重置。

1.3、STM模块框图

拥有STM0~STM6 七个通用定时器;STM_CMP0、STM_CMP1两个比较定时器和一个STM_CAP定时器。

在这里插入图片描述

功能描述:

STM是一个向上的计数器,运行频率为fstm。如果应用程序重置,STM重置。STMxDIS已被清除。重置后,STM被启用,并立即开始计算。在正常操作过程中,不可能影响定时器的内容。定时器寄存器只能被读取而不能被写入。

STM可以选择禁用,也可以为调试而暂停。在挂起模式下,STM时钟已停止,但所有寄存器仍然可读。

STM也可以从7个寄存器,TIM0到TIM6,选择越来越高的32位范围。这些可以看作是单独的32位计时器,每个都有不同的分辨率和定时范围。

64位系统计时器的内容可以与存储在CMP0和CMP1寄存器中的两个比较值的内容进行比较。可以在STM与CMP0或CMP1寄存器的比较匹配时生成服务请求。

2、实验功能

通过定时器实现延时功能,控制LED翻转;

方驱动提供的函数接口:

IfxStm_getFrequency 函数:获取定时器频率

IFX_INLINE float32 IfxStm_getFrequency(Ifx_STM *stm)
{
    IFX_UNUSED_PARAMETER(stm);
    float32 result;

    result = IfxScuCcu_getStmFrequency();

    return result;
}

3、具体实现

3.1、新建工程

命名为:TC3X7_STMDelay_Test

在这里插入图片描述

在这里插入图片描述

在工程下新建自己的驱动文件夹:My_Driver : HARDWARE、TestAPP

在这里插入图片描述

添加文件夹路径Project->Properties

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在HARDWARE下新建Systm_Time.c和Systm_Time.h

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Systm_Time.c和Systm_Time.h具体实现:

Systm_Time.c

/*
 * System_Time.c
 *
 *  Created on: 2022年7月9日
 *      Author: Kevin
 */

#include "System_Time.h"
#include "IfxStm.h"

void systick_delay(STMN_enum stmn, uint32 time, uint32 num)
{
    uint32 stm_clk;
    uint32 delay_time;
    stm_clk = IfxStm_getFrequency(IfxStm_getAddress((IfxStm_Index)stmn));
    delay_time = (uint32)(stm_clk/1000000*time/1000);

    while(num--)
    {
        IfxStm_waitTicks(IfxStm_getAddress((IfxStm_Index)stmn), delay_time);
    }

}

Systm_Time.h

/*
 * System_Time.h
 *
 *  Created on: 2022年7月9日
 *      Author: Kevin
 */

#ifndef MY_DRIVER_HARDWARE_SYSTEM_TIME_H_
#define MY_DRIVER_HARDWARE_SYSTEM_TIME_H_


#include "Platform_Types.h"   //定义数据类型

typedef enum  // 枚举STM模块号
{
    STM0,
    STM1,
    STM2,
    STM3,
    STM4,
}STMN_enum;


void systick_delay(STMN_enum stmn, uint32 time, uint32 num);
void systick_start(STMN_enum stmn);
uint32 systick_getval(STMN_enum stmn);

//------------------------------------以下宏定义用于延时------------------------------------
#define systick_delay_ms(stmn, time)    systick_delay(stmn, 1000000, time)  //设置延时时间  单位ms
#define systick_delay_us(stmn, time)    systick_delay(stmn, time*1000, 1)   //设置延时时间  单位us
#define systick_delay_ns(stmn, time)    systick_delay(stmn, time, 1)        //设置延时时间  单位ns

//------------------------------------以下宏定义用于获取当前时间------------------------------------
#define systick_getval_ms(stmn)         systick_getval(stmn)/100000         //获取当前计时时间  单位ms
#define systick_getval_us(stmn)         systick_getval(stmn)/100            //获取当前计时时间  单位us
#define systick_getval_ns(stmn)         systick_getval(stmn)*10             //获取当前计时时间  单位ns


#endif /* MY_DRIVER_HARDWARE_SYSTEM_TIME_H_ */

主函数:main.c

#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"
#include "System_Time.h"

IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;

void core0_main(void)
{
    IfxCpu_enableInterrupts();
    
    /* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
     * Enable the watchdogs and service them periodically if it is required
     */
    IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
    
    IfxPort_setPinModeOutput(&MODULE_P20,8, IfxPort_OutputMode_pushPull, IfxPort_OutputIdx_general);
    IfxPort_setPinHigh(&MODULE_P20,8);   //Switch OFF the LED (low-level active)

    /* Wait for CPU sync event */
    IfxCpu_emitEvent(&g_cpuSyncEvent);
    IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
    
    while(1)
    {
        IfxPort_togglePin(&MODULE_P20,8);       /* Toggle the state of the LED*/

        systick_delay_ms(STM0, 1000); //延时1S

    }
}
4、下载验证

可以看到P20.8端口的LED灯实现1s亮灭;没有LED等可以用示波器或者万用表检测电平。

在这里插入图片描述

5、资源下载

项目的程序工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“055”,就可以获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin的学习站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值