电赛MSPM0G3507学习(2)----定时器

官方例程

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.边沿计数

留空

### MSPM0L 定时器8 PWM 配置与使用 #### 初始化配置 为了实现PWM功能,需先通过`syscfg`工具定制初始化函数以启用Timer-PWM模块。这一步骤确保了硬件资源被正确分配给PWM操作[^4]。 ```c #include "ti_msp_dl_config.h" int main(void) { SYSCFG_DL_init(); } ``` #### 中断处理准备 在进入主循环之前,应清除任何可能存在的未决定时器中断,并允许这些中断的发生以便后续响应PWM事件触发的动作[^3]。 ```c NVIC_ClearPendingIRQ(TIMER_0_INST_INT_IRQN); NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN); while (1) {} ``` #### 启动计数器 对于实际产生PWM波形而言,在适当位置调用`DL_TimerA_startCounter()`至关重要;此命令激活内部计数机制从而驱动PWM输出[^1]。 ```c DL_TimerA_startCounter(); ``` #### 设置PWM参数 针对具体应用需求调整PWM特性如频率等。一般情况下,默认总线时钟(BUSCLK)足以满足大多数场景的要求。若要获得特定的PWM频率,则可以通过修改分频系数和计数值来达成目标。例如设定为1kHz: - 假设系统时钟源为24MHz, - 使用预分频器设置为240(即24MHz/240=100KHz),这样可以使得每个计数周期等于10微秒; - 将最大计数值Max Count设为99(对应于1%到99%占空比范围内的任意整数值),因此整个周期长度将是99*10us = 990us接近所需的1ms周期时间。 以上步骤完成后,便可以在指定GPIO端口观察到期望中的PWM方波信号[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值