文章目录
- 1. 概述
- 1.1 时钟系统
- 1.2 实验目的
- 2. 代码的配置
1. 概述
1.1 时钟系统
FTM的CPU接口时钟为SYS_CLK,在RUN模式下最高80MHz。模块的时钟结构如下图所示。
从上图中可以看出,FTM模块的功能时钟为SYS_CLK,计数器的时钟源可以来源于三条路:
- SYS_CLK
- 固定时钟
- 外部时钟
此处需要注意,虽然外部时钟源的可选范围较广,但是配置工具提示,其值不可超过SYS_CLK的4分频,为了追求更高的时钟分辨率,笔者配置计数器的时钟为SYS_CLK。
1.2 实验目的
本次实验的内容比较简单,设置FTM模块的基础参数,设置MOD值,当计数器到达MOD值时则产生溢出中断,在中断中对一个静态变量计数,整个计数值到达1秒时翻转一个LED的状态。
2. 代码的配置
由于配置计数器的时钟源为SYS_CLK,那么PCC中的时钟配置则随便配置,笔者采用默认的设置,如下图:
FTM的配置如下:
在这里设置分频值后,计数器的时钟会被配置工具自动计算并显示。计数模式使用向上计数,这里的计数模式没有其他品牌的单片机灵活,只有向上和上下计数两个模式。
计数值的计算和其他单片机差不多,都要预留一个反应的时钟周期,所以MOD值要减1。
初始化代码如下:
ftm_state_t ftmState;
//周期溢出中断初始化
void FtmMcInit(void)
{
//初始化FTM模块参数
FTM_DRV_Init(INST_FLEXTIMER_MC_1, &flexTimer_mc_1_InitConfig_0, &ftmState);
//配置计数器
FTM_DRV_InitCounter(INST_FLEXTIMER_MC_1, &flexTimer_mc_1_TimerConfig_0);
//设置中断优先级
INT_SYS_SetPriority(FTM0_Ovf_Reload_IRQn, 6);
//开始计数
FTM_DRV_CounterStart(INST_FLEXTIMER_MC_1);
}
中断服务程序仍然使用启动文件中定义好的函数名,在中断中要注意将溢出中断的标志位清除。
中断部分代码如下:
//FTM0周期溢出中断
void FTM0_Ovf_Reload_IRQHandler(void)
{
static uint16_t i = 0;
if (++i >= 1000)
{
i = 0;
PINS_DRV_TogglePins(LED_BLUE_PORT, 1 << LED_BLUE_PIN);
}
//清除中断标志位
FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_MC_1, FTM_TIME_OVER_FLOW_FLAG);
}