MSPM0开发学习笔记:外设Timer
MSPM0 定时器入门:讲解时钟分频、计数模式与中断机制,演示 SysConfig 配置 TIMER 及用 Zero 事件中断翻转 LED 的示例代码。
MSPM0开发学习笔记
第一章 初步安装与配置
第二章 外设GPIO
第三章 外设Timer
一、Timer原理介绍
定时器的工作原理可归纳为以下几个核心机制
1、时钟源与分频
定时器基于稳定的时钟信号工作,时钟源可以是内部振荡器(如系统时钟)或外部输入信号。时钟信号通过分频器调整频率,分频值决定了计数器的实际工作频率。例如,32MHz时钟经256分频后变为125kHz(周期8μs)
2、计数器模式
向上计数:从0递增至预设值(如65535),溢出后触发中断并重置
向下计数:从预设值递减至0,触发中断后可自动重载初始值(自动重装载寄存器功能)实现周期性计时
中央对齐模式:交替进行递增和递减计数,适用于生成对称PWM波形
3、中断触发机制
当计数器达到目标值(溢出或匹配预设值)时,触发中断信号,CPU暂停当前任务执行中断服务程序(如LED翻转)。硬件中断控制器负责管理中断优先级和响应
4、定时精度与范围
最短计时时间:由时钟周期决定。例如,1MHz时钟最短计时1μs
最长计时时间:由计数器位数和分频值共同决定。16位计数器在125kHz时钟下最长计时约524ms(65535×8μs)
5、功能扩展
定时器可通过比较寄存器实现PWM输出(控制占空比)、输入捕获(测量脉冲宽度)等高级功能
二、syscfg配置
这边也需要配置GPIO,不过上一节已经讲过了,所以这边就不在赘述,感兴趣的话大家可以在文章最开始的地方进行跳转查看。
1、TIMER

我们直接来看TIMER的配置,首先是黄色的部分,因为是入门教学,所以我们暂时只用知道这边我们需要选择BUSCLK就可以了。
然后是黄色的部分,这边是将我们的定时器时间通过外部和内部进行划分 是32000000除以(1~8)再除以256的计算过程
然后会在绿色的框中显示出该TIMER可以调节的范围是多少到多少。
灰色部分的话就是我们的预期时间和实际时间(精度不一定能满足所以有时候不一样)
白色部分如果勾选的话会在程序刚刚开始的时候就开始计时

这个部分的中断配置 选择Zero event 就是数到0的时候触发中断
设置完之后进行编译即可
三、程序设计
具体代码如下:
#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:
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
break;
default:
break;
}
}
以上所有参数也是一样可以到Debug/ti_msp_dl_config.h文件里面进行查找
SYSCFG_DL_init()进行初始化
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);使能中断
DL_TimerG_startCounter(TIMER_0_INST);开始中断
void TIMER_0_INST_IRQHandler(void)是中断服务函数
这边的
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
case DL_TIMER_IIDX_ZERO:
的作用是确保是由zero event引起的中断(因为我们刚才那边展开的列表由除了zero event之外的很多中断 如果我们选择多个的话就需要这么做来确保是到0了,这边可用可不用)
进入之后执行
DL_GPIO_togglePins(GPIO_LEDS_PORT,GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN)
进行翻转 实现闪烁
MSPM0開發學習筆記:外設Timer
MSPM0 定時器入門:講解時鐘分頻、計數模式與中斷機制,示範 SysConfig 設定 TIMER 及以 Zero 事件中斷翻轉 LED 的範例程式。
來源:https://blog.csdn.net/2403_87969572/article/details/148102325
抓取時間(ISO本地):2026-05-18 05:16:53
MSPM0開發學習筆記
第一章 初步安裝與配置
第二章 外設GPIO
第三章 外設Timer
文章目錄
一、Timer原理介紹
定時器的工作原理可歸納為以下幾個核心機制
1、時鐘源與分頻
定時器基於穩定的時鐘信號工作,時鐘源可以是內部振盪器(如系統時鐘)或外部輸入信號。時鐘信號通過分頻器調整頻率,分頻值決定了計數器的實際工作頻率。例如,32MHz時鐘經256分頻後變為125kHz(週期8μs)
2、計數器模式
向上計數:從0遞增至預設值(如65535),溢出後觸發中斷並重置
向下計數:從預設值遞減至0,觸發中斷後可自動重載初始值(自動重裝載寄存器功能)實現週期性計時
中央對齊模式:交替進行遞增和遞減計數,適用於生成對稱PWM波形
3、中斷觸發機制
當計數器達到目標值(溢出或匹配預設值)時,觸發中斷信號,CPU暫停當前任務執行中斷服務程序(如LED翻轉)。硬件中斷控制器負責管理中斷優先級和響應
4、定時精度與範圍
最短計時時間:由時鐘週期決定。例如,1MHz時鐘最短計時1μs
最長計時時間:由計數器位數和分頻值共同決定。16位計數器在125kHz時鐘下最長計時約524ms(65535×8μs)
5、功能擴展
定時器可通過比較寄存器實現PWM輸出(控制佔空比)、輸入捕獲(測量脈衝寬度)等高級功能
二、syscfg配置
這邊也需要配置GPIO,不過上一節已經講過了,所以這邊就不在贅述,感興趣的話大家可以在文章最開始的地方進行跳轉查看。
1、TIMER

我們直接來看TIMER的配置,首先是黃色的部分,因為是入門教學,所以我們暫時只用知道這邊我們需要選擇BUSCLK就可以了。
然後是黃色的部分,這邊是將我們的定時器時間通過外部和內部進行劃分 是32000000除以(1~8)再除以256的計算過程
然後會在綠色的框中顯示出該TIMER可以調節的範圍是多少到多少。
灰色部分的話就是我們的預期時間和實際時間(精度不一定能滿足所以有時候不一樣)
白色部分如果勾選的話會在程序剛剛開始的時候就開始計時

這個部分的中斷配置 選擇Zero event 就是數到0的時候觸發中斷
設置完之後進行編譯即可
三、程序設計
具體代碼如下:
#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:
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
break;
default:
break;
}
}
以上所有參數也是一樣可以到Debug/ti_msp_dl_config.h文件裡面進行查找
SYSCFG_DL_init()進行初始化
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);使能中斷
DL_TimerG_startCounter(TIMER_0_INST);開始中斷
void TIMER_0_INST_IRQHandler(void)是中斷服務函數
這邊的
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
case DL_TIMER_IIDX_ZERO:
的作用是確保是由zero event引起的中斷(因為我們剛才那邊展開的列表由除了zero event之外的很多中斷 如果我們選擇多個的話就需要這麼做來確保是到0了,這邊可用可不用)
進入之後執行
DL_GPIO_togglePins(GPIO_LEDS_PORT,GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN)
進行翻轉 實現閃爍
MSPM0 Dev Notes: Timer Peripheral
MSPM0 timer primer: clock/prescaler, counter modes, IRQs, SysConfig TIMER setup, and sample code that toggles LEDs on zero-event interrupts.
Captured at (local ISO): 2026-05-18 05:16:53
MSPM0 Development Notes
Chapter 1 Initial Setup
Chapter 2 GPIO Peripheral
Chapter 3 Timer Peripheral
I. Timer Fundamentals
A timer’s operation boils down to these mechanisms:
1. Clock Source and Prescaler
Timers run from a stable clock—internal (system clock) or external. A prescaler scales frequency; e.g. 32 MHz ÷ 256 → 125 kHz (8 µs period).
2. Counter Modes
Up-count: 0 → preset (e.g. 65535), overflow triggers IRQ and reset
Down-count: preset → 0, IRQ then auto-reload for periodic timing
Center-aligned: up then down—for symmetric PWM
3. Interrupt Mechanism
On overflow or match, hardware IRQ runs the ISR (e.g. toggle LED). The interrupt controller handles priority and nesting.
4. Timing Precision and Range
Minimum interval: one clock period (1 µs at 1 MHz).
Maximum: counter width × prescaler—16-bit @ 125 kHz ≈ 524 ms (65535 × 8 µs).
5. Extended Features
Compare registers enable PWM (duty cycle), input capture (pulse width), etc.
II. SysConfig Setup
GPIO is also required; see Chapter 2 via the links at the top if needed.
1. TIMER

TIMER config: for beginners, select BUSCLK. Prescaler path: 32,000,000 ÷ (1–8) ÷ 256; the green box shows the adjustable range. Gray shows expected vs. actual period (may differ). White checkbox starts the timer at boot.

Interrupt: choose Zero event—IRQ when the counter hits zero.
Build after configuration.
III. Program Design
Example code:
#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:
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
break;
default:
break;
}
}
Parameters are also in Debug/ti_msp_dl_config.h.
SYSCFG_DL_init() initializes hardware.
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN) enables the timer IRQ.
DL_TimerG_startCounter(TIMER_0_INST) starts counting.
TIMER_0_INST_IRQHandler is the ISR.
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
case DL_TIMER_IIDX_ZERO:
Optionally confirms the IRQ source is zero event (useful if multiple interrupt sources are enabled).
DL_GPIO_togglePins(...) toggles LEDs for a blink effect.