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
|