打印
[AURIX™]

TC3xx系列芯片--STM模块介绍

[复制链接]
773|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1、STM(System Timer)模块介绍
STM是Aurix2G TC3xx内部63位的系统定时器,提供最高100MHz精度的定时功能,每款芯片的模块数量与

CPU数量对应,比如TC389有4个核,同时具有STM0--STM3一共3个STM模块。STM模块具有如下特性:

1、独立运行的64位计数器(100MHz下最大时间为5849年)

2、支持64位计数值同步读取

3、支持32位连续的特定位置读取,比如读取计数器第7到39位数据

4、支持利用比较寄存器进行灵活的定时中断请求

5、上电自动启动

6、Application Reset后支持继续运转不归零(System Reset和PowerOn Reset后一定归零的)

2、STM模块功能介绍
STM的时钟来自系统时钟,与CPU同源,最大支持100MHz,与系统时钟的倍数关系取决于STM分频寄存器

SCU_CCUCONO.STMDIV。关系如下:



芯片上电之后,根据时钟寄存器复位值,得出fPLL0也就是fSOURCE默认为100MHz,SCU_CCUCON0.STMDIV复位

复位值为3,因此上电之后,在MCU时钟初始化及锁相环稳定之前,STM以默认频率33.3MHz启动并运行。

但是我们MCU中一般将系统时钟fPLL0配置为300MHz,所以在时钟初始化之后STM以100MHz运行。

2.1、STM计时功能



  如上图每个STM模块内部是一个上电自动启动的64位系统时钟,提供不同的寄存器(STM_TIM0--STMTIM5

  和STM_CAP)以读取不同位置的32位时刻值。因为64位数据在32位CPU中无法在一条指令内完成,因此

  STM模块提供了高32位冻结功能:在TIM0到TIM5任一寄存器被读取时,STM会将此刻的高32位时刻值冻结

  一次到STM_CAP中,因此通过先读取STM_TIM0在读取STM_CAP寄存器的方式,组成完成一致的64位时刻值

  代码实现如下:

  EB工具中的源码实现方式如下:



也可自写如下方式实现:



不推荐使用宏的方式写如下图:



因为对于不同的编译器,同行语句的代码指令执行顺序不一定一致,若编译器先执行STM0_CAP.U,则

  执行顺序变为先读取高32位冻结时刻值,在读取低32位时刻值,则在0xFFFFFFFF这种低32位即将归零

  的临界时刻可能会读取出错误值。

2.2、STM定时功能
  STM中每个模块提供了两个32位比较寄存器,用来实现定时功能。比较寄存器可以与STM的64位计时器

  中任意位置的最大32位宽度的时刻值进行对比,当值匹配时产生对应的事件,触发中断。如下图:



  每个比较寄存器有一个起始位置配置MSTART和位宽配置MSIZE。MSTART表示从64位计时器中哪一位

  开始比较,MSIZE表示比较的数据宽度。如上图中的Compare Register0的MSTART=10,MSIZE=17,

  表示从计时器的第10位往后取17位,与比较寄存器STM_CAP0的前17位进行比较,匹配则产生中断。

  因此若需设置定时功能,则需先读取当前时刻值,在根据定时需求设置比较寄存器的值,最终实

  现定时功能。例如当前时刻位0x1000(单位Tick),若要设置0x900Tick后触发中断,则需设置

  STM_CAP0=0x1900。

  EB工具中提供了相应接口Stm_EnableModule()和Stm_EnableAlarm()。其中Stm_EnableModule()是

  进行STM内部比较寄存器和中断配置,Stm_EnableAlarm()则是用来设置一个闹钟。如下图:



   这里需要注意的是如果设置连续触发,类似设置闹钟。比如在4点设置一个1小时闹钟那么需要设置

   5点触发,若到了5点还需要设置一个小时,因响应和操作时间,则可需要设置约为6点0分1秒,STM

   的连续触发是这种机制,并不像其它定时器的周期触发逻辑,而是在每次触发后,在定时器中断中

   重新装载比较寄存器的值,实现连续触发。在EB的MACL代码的Stm_Isr()中可以看到该逻辑:



     因此,STM的比较中断逻辑适合作为EcuM或者Wdg的定时中断,不适合作为OS Counter的触发源,

    会产生累计误差。若需要实现精准连续的定时功能,则需要使用该芯片的其它外设模块,比如

    GPT12、CCU16以及GTM模块。

2.3、STM中断机制
每个STM模块有两个比较寄存器,同时每个STM模块有两个中断源,而且比较寄存器和中断源

的连接是可配的。示意图如下:



由上图可知每个比较寄存器有一个CMPxEN使能开关,一个中断源选择开关CMPxOS,和一个中断

设置和清除开关CMPx_IR。CMPxEN设置为1则打开中断,CMPxOS设置为0或1则选择对应的中断

源,输出到中断模块IR中。

3、MACL配置
3.1、时钟配置
在Mcu->McuClockSettingConfig_0->General中配置STM时钟,这里设置所需频率值,工具会

自动计算出对应的SCU_CCUCON0.STMDIV。



3.2、McuHardwareResourceAllocation配置
MACL中所有的硬件资源都需在MCU模块中进行分配,在Mcu->McuHardwareResourceAllocationConf_0

->McuStmAllocationCOnf中配置STM的硬件分配,如下图:



3.3、ResourceM配置
Aurix2G MCAL中面向多核提供了一个硬件对于核的配置模块ResourceM,其本身不产生代码,但是配置

会影响其它模块生成代码;对STM模块,若用户使用定时器功能,则需要在ResourceM中配置硬件对

Cpu的分配,否则MACL代码中初始化会失败。如下图:



3.4、STM模块配置
STM模块内部只有一个Dev,一个VersionApihe和一个ApiMode,Dev用于开发配置检查,ApiMode表示

对STM进行配置时需要处于什么样的用户权限。



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/sinat_37508529/article/details/141865568

使用特权

评论回复
沙发
IFX-WellinZ| | 2024-9-12 08:14 | 只看该作者
感谢分享。BTW, 这是一个64位的定时器,最开始的地方有一个笔误。

使用特权

评论回复
板凳
LEDyyds| | 2024-9-13 14:12 | 只看该作者
64位,这么大啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

4090

帖子

3

粉丝