本帖最后由 月雾 于 2022-7-18 14:49 编辑  
 
导语 
在电机控制或者开关电源软件设计中,中断几乎是必用的功能。很多情况下,如何优化中断算法开销成了算法工程师的核心工作。DSP芯片初学者很有必要掌握中断的原理机制、配置方式。本期我们做一个简单中断程序:timer中断控制LED。 
 
什么是中断? 
在实时控制(real-time control)中,代码一般顺序执行或者跳转执行。当需要处理某些实时性要求较高的程序时,软件或硬件向CPU发出中断请求,如果请求被接受,CPU将暂停当前指令、保存状态并执行中断服务程序(interrupt service routine,ISR)。执行完ISR后,CPU再恢复中断前的状态,并继续运行。 
与跳转指令不同的是,中断是无法预测的,一旦设置使能后,只要满足触发条件,就能产生中断。  
在电机或电源的数字化控制中,中断机制是最佳的算法实现手段。毫不夸张地说,几乎的所有的核心算法都是中断函数实现的。昊芯28027支持丰富的中断机制:timer,ADC,PWM,SCI,SPI等外设都支持中断配置。 
 
Timer控制LED的原理  
昊芯28027内置3个timer(0/1/2)。利用Timer0每间隔1秒产生一次timer0中断,在中断服务程序中,每次都将LED对应的GPIO口输出电平反转,就能产生LED亮灭的效果。 
本程序基于昊芯28027核心板,相关资料可以在中科昊芯官网下载。 
 
- /*
 
 -  * main.c
 
 -  *
 
 -  *  Created on: 2021年9月25日
 
 -  *      Author: daieq
 
 -  */
 
  
- #include "dsc_config.h"
 
 - #include <syscalls.h>
 
 - #include "IQmathLib.h"
 
  
- Uint16 IntCount = 0;
 
  
- INTERRUPT void timer0_isr(void);
 
  
- int main(void)
 
 - {
 
 -     //系统初始化 120MHz
 
 -     InitSysCtrl();
 
  
-     //GPIO初始化
 
 -     EALLOW;
 
 -     GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
 
 -     GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
 
 -     GpioDataRegs.GPASET.bit.GPIO0 = 1;
 
 -     EDIS;
 
  
-     //关闭CPU中断
 
 -     DINT;
 
  
-     //初始化PIE模块
 
 -     InitPieCtrl();
 
  
-     //关闭并清除CPU中断标志位
 
 -     IER = 0x0000;
 
 -     IFR = 0x0000;
 
  
-     //初始化PIE中断向量表
 
 -     InitPieVectTable();
 
  
-     //配置中断向量表
 
 -     EALLOW;
 
 -     PieVectTable.TINT0 = &timer0_isr;
 
 -     EDIS;
 
  
-     // 模块初始化
 
 -     EALLOW;
 
 -     CpuTimer0Regs.TCR.bit.TSS = 1;
 
 -     CpuTimer0Regs.PRD.all =  120000000;
 
 -     CpuTimer0Regs.TCR.bit.TIF = 1;
 
 -     CpuTimer0Regs.TCR.bit.TRB = 1;
 
 -     CpuTimer0Regs.TCR.bit.TIE = 1;
 
 -     CpuTimer0Regs.TCR.bit.TSS = 0;
 
 -     EDIS;
 
  
-     //使能CPU中断
 
 -     IER |= M_INT1;
 
  
-     //使能PIE中断
 
 -     PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
 
  
-     EINT;
 
 -     ERTM;
 
  
-     for(;;)
 
 -     {}
 
 - }
 
  
- void CODE_SECTION("ramfuncs") INTERRUPT timer0_isr()
 
 - {
 
 -     IntCount++;
 
  
-     GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
 
  
-     PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
 
 - }
 
 -  
 
  
 
作者:昊芯 https://www.bilibili.com/read/cv13539303?spm_id_from=333.999.0.0 出处:bilibili
  |