DSP-定时器原理

DSP-定时器原理

CPU_TIMER

Timer0 最常用于普通裸机定时任务;Timer1、Timer2 不经过 PIE。使用 SYS/BIOS 时,Timer1、Timer2 可能被系统占用

一般只设置定CPUTimer寄存器的TCR寄存器

三个定时器的主要区别

1、Timer0中断配置 区别于1、2

Timer0 的完整路径:

Timer0产生TINT0

↓

TIE = 1

↓

PIEIER1.INTx7 = 1

↓

PIE Group1

↓

IER中的M_INT1 = 1

↓

全局中断EINT

↓

CPU执行Timer0 ISR

Timer0经过PIE外设中断层,则 ISR 退出前要应答 PIE:

Timer0产生中断

↓

PIE Group1被占用并暂时锁定

↓

CPU执行cpu_timer0_isr()

↓

写PIEACK_GROUP1

↓

解除Group1锁定

↓

允许Group1下一次中断

中断设置/中段函数

c 复制代码
EALLOW;
//打开
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS;
//使能 PIE 第1组的第7个中断通道
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
//IER:CPU 中断使能寄存器
//M_INT1:中断系统的1号中断
IER |= M_INT1;
EINT;

//Timer0 ISR 退出前要应答 PIE:
interrupt void cpu_timer0_isr(void)
{
    // 定时任务
		/*通知 PIE 控制器:"第1组中断已经处理完成,可以接收该组的下一次中断*/
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

定时器0初始化

c 复制代码
/* 基础初始化CPU定时器。 */
InitCpuTimers();
/* Timer1每隔0.5秒产生一次中断请求,内部已设置TIE = 1。 */
ConfigCpuTimer(&CpuTimer0, 150.0f, 500000.0f);
/*  StartCpuTimer0()是一个宏,展开CpuTimer0Regs.TCR.bit.TSS = 0; 启动计数 。*/
StartCpuTimer0();

2、Timer1中断配置

c 复制代码
EALLOW;
PieVectTable.XINT13 = &cpu_timer1_isr;
EDIS;

IER |= M_INT13;
EINT;

定时器1初始化

c 复制代码
/* 基础初始化CPU定时器。 */
InitCpuTimers();
/* Timer1每隔0.5秒产生一次中断请求,内部已设置TIE = 1。 */
ConfigCpuTimer(&CpuTimer1, 150.0f, 500000.0f);
/*  StartCpuTimer0()是一个宏,展开CpuTimer0Regs.TCR.bit.TSS = 0; 启动计数 。*/
StartCpuTimer1();

3、Timer2中断配置

c 复制代码
EALLOW;
PieVectTable.TINT2 = &cpu_timer2_isr;
EDIS;

IER |= M_INT14;
EINT;
相关推荐
java_nnnn1 小时前
Linux 学习第二篇:从零认识 Linux 文件系统、目录结构与基本命令
linux·运维·学习·1024程序员节
重生之我是Java开发战士1 小时前
【Redis】Redis五大数据类型
1024程序员节
全栈小51 小时前
【C#】体验和使用墨衍MoGrow平台写一篇技术总结文章,提供C#,Quart.Net,统一捕获异常,定时任务关键词,看看出来效果如何
1024程序员节
蹊黎1 小时前
C++中stack、queue、priority queue类的部分简单实现
数据结构·c++·visualstudio·1024程序员节
hixiong1231 小时前
纯C# Paddle2Onnx 转换器
1024程序员节
愤怒火龙果1 小时前
AIShield 靶场 WP
人工智能·网络安全·1024程序员节
软件派1 小时前
Eden AI 保姆级介绍:一站式 AI 聚合网关,一个 API 调用上百种大模型与视觉语音能力
1024程序员节·统一 api·多模态 api
ai_coder_ai1 小时前
论平台工程(平台化架构)在云原生系统中的设计与实践
1024程序员节
惊讶的猫1 小时前
mysql索引
mysql·1024程序员节