在线时间104 小时
UID3338547
注册时间2017-1-28
NXP金币14
TA的每日心情 | 无聊 2021-12-29 19:06 |
---|
签到天数: 47 天 连续签到: 1 天 [LV.5]常住居民I
金牌会员
 
- 积分
- 1392
- 最后登录
- 2025-3-4
|
本帖最后由 day_day 于 2020-1-12 18:14 编辑
(一)选择时钟源
- CLOCK_AttachClk(kFRO1M_to_CTIMER0);
复制代码
该时钟似乎是一个内部固有的时钟,可以直接作为CTIMER外设的时钟源,固定1M,不可配置频率,主要是供给看门狗使用的,但用这个时钟相当方便。
当然,使用这个时钟之前,我们需要在图形界面配置启动这个时钟:
- const ctimer_config_t timer_CTIMER0_config = {
- .mode = kCTIMER_TimerMode,
- .input = kCTIMER_Capture_0,
- .prescale = 0
- };
复制代码- CTIMER_Init(CTIMER0, &timer_CTIMER0_config);
复制代码
这个函数配置PR寄存器,当PC寄存器和PR寄存器匹配时,清除PR寄存器,TC寄存器(定时器用于计数的主要寄存器)加一,从而实现分频。
- const ctimer_match_config_t timer_CTIMER0_Match_0_config = {
- .matchValue = 100,
- .enableCounterReset = true,
- .enableCounterStop = true,
- .outControl = kCTIMER_Output_NoAction,
- .outPinInitState = false,
- .enableInterrupt = true
- };
- CTIMER_SetupMatch(CTIMER0,kCTIMER_Match_0,&timer_CTIMER0_Match_0_config);
复制代码
CTIMER定时匹配时,MRx寄存器控制了匹配的数值
用户手册P537显示,这个寄存器有32个位
即最大可以匹配4294967295,若是通过时钟源选择的分频设置CTIMER累加频率为1M,则最多可以数四千多秒,即一个小时多点。
MCR寄存器则控制了中断相关事宜以及重装载(当MRx和TC匹配后,是否清零TC)
- ctimer_callback_t timer_CTIMER0_callbackFunc[] = {CTIMER0_IntMa0CallBack, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
- CTIMER_RegisterCallBack(CTIMER0, timer_CTIMER0_callbackFunc, kCTIMER_MultipleCallback);
复制代码
值得注意的是,这个timer_CTIMER0_callbackFunc变量必须作为全局变量,具体没有深究过,作为局部变量是,会因为函数结束而停止生命周期,被释放掉,从而在执行过程中产生硬件错误,进入HardFault_Handler()。这个问题应该可以通过static解决,但具体没有尝试。
此外,还需要学习两个主要的寄存器IR(中断寄存器,主要是各种标志位)、TCR寄存器(配置计数器基本功能)
(五)修改
可以通过修改CTIMER0->MR0来修改匹配值,或者调用函数
- <font color="black" size="4">void CTIMER0_ChangeMatchValue(uint32_t inpu_value)
- {
- const ctimer_match_config_t timer_CTIMER0_Match_0_config = {
- .matchValue = inpu_value,
- .enableCounterReset = true,
- .enableCounterStop = true,
- .outControl = kCTIMER_Output_NoAction,
- .outPinInitState = false,
- .enableInterrupt = true
- };
- CTIMER_SetupMatch(CTIMER0, kCTIMER_Match_0, &timer_CTIMER0_Match_0_config);
- }</font>
复制代码
不需要重新初始化,节省效率
|
|