TC275的STM模块

STM模块是复位后就开始工作的定时模块,它其实是一个64位的定时/计数器,其计数方式是向上计数。计数频率为f_STM,我们之前了解过f_STM默认配置为100MHz,也就是说每个时钟周期为10ns。这边是STM的基本信息,接下来我们看一下它的结构,如图1
在这里插入图片描述
如图1所示,7个定时寄存器可以交错的记录定时器STM的位。一个定时器捕捉寄存器STM_CAP,两个定时器比较寄存器STM_CAM0、STM_CAM1。其中定时寄存器和捕捉寄存器是只读的,比较寄存器则可以读写。

1、1ms定时的产生
首先想办法实现1ms的定时,STM定时器是不停的向上计数到溢出再重新计数的循环。那么我们的想法是记录当前的定时器值作为基值,然后在基值的基础上增加1ms的计数值,然后将该值存到比较寄存器。然后直到比较匹配产生中断,在中断中重复上面的过程,这样就实现了1ms定时。以下框图是我么算法流程;
在这里插入图片描述
T

2、代码配置:
代码分为两部分,一个STM主体,包含获取STM时钟,设置比较值等;一个是STM中断服务函数。
参考代码如下:
uint32 stm0CompareValue;//定义STM0的比较值
float32 SystemClck;//记录STM的时钟频率,默认为100MHZ
void STM0_init(void)
{
IfxStm_CompareConfig stmCompareConfig;//定义比较模块的控制参数
SystemClck=IfxStm_getFrequency(&MODULE_STM0);//获取STM时钟频率
stm0CompareValue= SystemClck /100000;//计算1ms定时值
IfxStm_enableOcdsSuspend(&MODULE_STM0);//使能OCDS挂起
stmCompareConfig.servProvider = IfxSrc_Tos_cpu0;//配置中断请求
IfxStm_initCompareConfig(&stmCompareConfig);//初始化比较寄存器配置
stmCompareConfig.ticks = stm0CompareValue;//表示从现在开始,定时器值和比较值匹配后产生中断
stmCompareConfig.triggerInterruptEnabled =101;//使能中断
IfxStm_initCompare(&MODULE_STM0, &stmCompareConfig);//初始化比较功能
}
IFX_INTERRUPT(Ifx_STM0_Isr,0,IFX_CFG_ISR_PRIORITY_STM0_COMPARE0)
{
uint32 stmTicks;
stmTicks= (uint32)(stm0CompareValue * 1);
IfxStm_updateCompare(&MODULE_STM0,IfxStm_Comparator_0,IfxStm_getCompare(&MODULE_STM0, IfxStm_Comparator_0) + stmTicks);//更新比较值
timeMicSec[0]++;//记录定时数目
__enable ();//使能中断入口
}
以上便是这部分的代码,要说明的有以下几点:
(1)代码中:IfxStm_initCompareConfig(&stmCompareConfig);//初始化比较寄存器配置
这个函数的作用是初始化STM配置参数,参数是一个结构体,函数中对结构体的每个成员进行了初始化赋值,我们可以看一下这个函数体:
void IfxStm_initCompareConfig(IfxStm_CompareConfig *config)
{
config->comparator = IfxStm_Comparator_0;//表示比较寄存器0
config->compareOffset= IfxStm_ComparatorOffset_0;//比较寄存器的起始位为STM寄存器的D0位
config->compareSize = IfxStm_ComparatorSize_32Bits;//比较寄存器的长度为32位
config->triggerInterruptEnabled = FALSE;//关闭中断
config->comparatorInterrupt=IfxStm_ComparatorInterrupt_ir0; //选择中断请求源0
config->ticks = 0xFFFFFFFF;//设置比较初始值
}
函数中对比较寄存器的各个位域以及比较控制寄存器的各个位域均作了定义,这个定义使用STM_CAM0,其位置从STM的D0开始共32位,初始默认关中断、中断请求源为0。这些值可以根据大家的需要自行修改。
(2)代码中;stmCompareConfig.ticks = stm0CompareValue;//表示从现在开始,定时器值和比较值匹配后产生中断
为什么这个将1ms的定时值赋值后就可以实现当前定时值加1ms定时值呢?
是因为在下面的函数
IfxStm_initCompare(&MODULE_STM0, &stmCompareConfig);中实现了这个功能,其位置在:
stm->CMP[config->comparator].U=IfxStm_getOffsetTimer(stm,config->compareOffset) + config->ticks;
这一步将当前定时值采集并加上1ms定时值,然后赋给比较寄存器。
(3)比较寄存器值更新的说明:
源代码为:
IfxStm_updateCompare(&MODULE_STM0,IfxStm_Comparator_0,IfxStm_getCompare(&MODULE_STM0, IfxStm_Comparator_0) + stmTicks);//更新比较值
我们需要这段代码完成我们(2)中所说的比较其赋值
原理是相同的,函数IfxStm_getCompare(&MODULE_STM0, IfxStm_Comparator_0)可以获取当前的比较值,因为当前的比较值就是定时器值。所以直接将该值加上1ms的定时值就是相当于重置定时初值。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值