自上次分享了在英飞凌TriCore架构的MCU上移植FreeRTOS后,后台有不少人咨询关于系统时基的事情,今天就来介绍下这个STM。
摘要
本篇文档主要用来介绍英飞凌基于AURIX-2G TriCore 1.6.2架构的 TC3xx系列STM定时器的使用
STM介绍
STM(System Timer) 是为高精度和长周期的全局系统定时应用而设计,是一个向上递增计数器,有很多特点: 自由运行的64位计数器,64位可以同时被读取,64位计数器中的不同32位可以被同时读取,基于比较匹配可以产生灵活的中断服务请求,应用复位后可以自动启动运行,从下图的结构中就可以看出。
STM是一个递增计数器,工作频率为fSTM。清除STMxDIS。复位后,STM启动并立即开始计数。正常运行时是不能操作计数器内容,只能读取。由于STM的宽度为64位,因此不可能用一条指令读取其全部内容。它必须是读取两个加载指令。由于计时器会在两次加载操作之间继续计数,因此读取的两个值是有可能不一致(由于可能从定时器的低部分溢出到两个读操作之间的高部分)。所以为了能够同时连续独处STM的值,采取捕获寄存器(CAP)的办法。因此,CAP将定时器的高半部分保持在完全相同的位置读取低半部分的时间。然后,第二个读取操作将读取CAP的内容以获取完整的计时器值。更多关于STM的详细内容大家可以参考手册第二部分第27章
系统时基
既然STM系统定时器有这么多好处,我们在做开发的时候,不管是裸机还是基于RTOS都可以选用这个STM来作为系统的心跳或者叫时基,在上次给大家分享的在TC33x上移植FreeRTOS,就是基于STM来作为系统的内核心跳SysTick。并且定义为1ms的心跳周期。STM始终fSTM为100Mhz,具体如下
STM的中断会调用freeRTOS的API函数 vPortSystemTickHandler(); 实现系统时基。大家有兴趣的可以去研究下vPortSystemTickHandler();内部内容源码,这个都是开源的。
在移植好的工程里创建任务,开启调度器,就可以了,这里主要要弄清楚这个STM是怎么和FreeRTOS关联起来的,以及如何创建任务。包括任务间的交互,数据传递等。
总结
本文通过STM来实现FreeRTOS的时基运行,需要掌握STM的运行原理和配置,中断服务等。关于这个STM的学习,大家有也可以参考官方的例程和文档,有什么问题也可以在评论区留言。