官方例程
Sysconfig配置
关于定时器时钟源的选择:
BUSCLK:主系统时钟,为PD1外设提供总线时钟(BUSCLK),系统初始化为32MHz;
LFCLK:低频时钟,就是低频振荡器输出的32.768KHz;
MFCLK:中频时钟,固定4MHz不变,使用的是SYSOC振荡器分频来,系统初始化默认关闭,需要软件打开;
关于定时器模式的选择:
周期性向下计数
周期性向上计数
一次性向下计数
一次性向上计数
中间计数
1.定时器计时
现象:
LED每500ms反转一次
代码:
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);//使能中断
DL_TimerG_startCounter(TIMER_0_INST);//启动定时器
while (1) {
}
}
void TIMER_0_INST_IRQHandler(void)//中断服务函数
{
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {//获取中断挂起标志
case DL_TIMER_IIDX_ZERO://零事件中断,向下计数模式,计数到0中断
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);//电平反转
break;
default:
break;
}
}
2.Pwm
现象:
TimerG0将在PA12和PA13上输出一对62.5Hz边缘对齐的PWM信号。PA12、PA13配置占空比。监测PA12和PA13上的PWM信号。按下S2按键改变占空比
Sysconfig配置
Counter Compare Value = PWM Period Count - PWM Period Count * Desired Duty Cycle
代码
#include "ti_msp_dl_config.h"
uint32_t period=2000;
void Set_Pwm(float duty,uint8_t channel)//设置PWM占空比
{
uint32_t Compare;
Compare = period - period * duty;//上述公式
if(channel == 1)
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST,Compare,GPIO_PWM_0_C0_IDX);//设置捕获比较值
}
else if(channel == 2)
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST,Compare,GPIO_PWM_0_C1_IDX);
}
}
void Set_Freq(uint32_t freqency)//改变频率
{
period = PWM_0_INST_CLK_FREQ / freqency;//周期计算公式
DL_TimerG_setLoadValue(PWM_0_INST,period);//改变系统周期
}
int main(void)
{
SYSCFG_DL_init();
DL_TimerG_startCounter(PWM_0_INST);
while (1) {
if( DL_GPIO_readPins(GPIO_Keys_PORT,GPIO_Keys_PIN_0_PIN))//按下S2,改变PWM波
{
Set_Pwm(0.3,1);
Set_Pwm(0.9,2);
}
else {
Set_Pwm(0.9,1);
Set_Pwm(0.3,2);
}
}
}
3.定时器捕获占空比和周期
代码
// 定义全局变量
volatile uint32_t gCaptureCnt; // 捕获计数器值
volatile bool gSynced; // 同步标志位
volatile bool gCheckCaptures; // 检查捕获标志位
uint32_t gLoadValue; // 定时器重载值
int main(void) {
volatile static uint32_t pwmPeriod; // PWM周期
__attribute__((unused)) volatile static uint32_t pwmDuty; // PWM占空比
SYSCFG_DL_init(); // 初始化系统配置
// 获取用于手动重载定时器的值,因为定时器捕获功能有限制
gLoadValue = DL_TimerG_getLoadValue(CAPTURE_0_INST);
// 初始化全局状态变量
gSynced = false;
gCheckCaptures = false;
// 设置定时器在CPU暂停时的行为为立即停止,防止定时器不同步
DL_TimerG_setCoreHaltBehavior(CAPTURE_0_INST, DL_TIMER_CORE_HALT_IMMEDIATE);
DL_TimerG_setCoreHaltBehavior(PWM_0_INST, DL_TIMER_CORE_HALT_IMMEDIATE);
// 开启中断
NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
// 启动定时器
DL_TimerG_startCounter(CAPTURE_0_INST);
DL_TimerG_startCounter(PWM_0_INST);
while (1) {
// 等待检查捕获标志变为真
while (false == gCheckCaptures) {
__WFE(); // 等待可中断事件
}
gCheckCaptures = false;
// 计算PWM周期和占空比,假设定时器在向下计数模式下运行
pwmPeriod = gLoadValue - gCaptureCnt;
pwmDuty = (((gLoadValue - DL_TimerG_getCaptureCompareValue(CAPTURE_0_INST, DL_TIMER_CC_0_INDEX)) * 100) / pwmPeriod);
__BKPT(0); // 断点,用于调试
}
}
// 中断服务程序
void CAPTURE_0_INST_IRQHandler(void) {
switch (DL_TimerG_getPendingInterrupt(CAPTURE_0_INST)) {
case DL_TIMERG_IIDX_CC1_DN:
// 如果同步标志为真,则更新捕获计数器值,并设置检查捕获标志
if (gSynced == true) {
gCaptureCnt = DL_TimerG_getCaptureCompareValue(CAPTURE_0_INST, DL_TIMER_CC_1_INDEX);
gCheckCaptures = true;
} else {
// 否则,设置同步标志
gSynced = true;
}
// 手动重载定时器以解决捕获限制问题
DL_TimerG_setTimerCount(CAPTURE_0_INST, gLoadValue);
break;
case DL_TIMERG_IIDX_ZERO:
// 如果定时器到达零点,表示没有检测到PWM信号,需要重新同步
gSynced = false;
break;
default:
break;
}
}
主要关注于定时器捕获功能和PWM信号的处理。gCaptureCnt
用于存储从定时器捕获的值,gSynced
用于指示是否已经成功捕获并同步,而gCheckCaptures
则用于通知主循环何时检查捕获的值。在中断服务程序中,根据不同的中断源进行相应的处理,包括更新捕获值、同步状态和手动重载定时器。
4.边沿捕获
留空
5.边沿计数
留空