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)
进行翻转 实现闪烁