[仿真] 昊芯 利用Timer中断控制LED

[复制链接]
 楼主| 月雾 发表于 2022-7-18 14:48 | 显示全部楼层 |阅读模式
本帖最后由 月雾 于 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核心板,相关资料可以在中科昊芯官网下载。

  1. /*
  2. * main.c
  3. *
  4. *  Created on: 2021年9月25日
  5. *      Author: daieq
  6. */

  7. #include "dsc_config.h"
  8. #include <syscalls.h>
  9. #include "IQmathLib.h"

  10. Uint16 IntCount = 0;

  11. INTERRUPT void timer0_isr(void);

  12. int main(void)
  13. {
  14.     //系统初始化 120MHz
  15.     InitSysCtrl();

  16.     //GPIO初始化
  17.     EALLOW;
  18.     GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
  19.     GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
  20.     GpioDataRegs.GPASET.bit.GPIO0 = 1;
  21.     EDIS;

  22.     //关闭CPU中断
  23.     DINT;

  24.     //初始化PIE模块
  25.     InitPieCtrl();

  26.     //关闭并清除CPU中断标志位
  27.     IER = 0x0000;
  28.     IFR = 0x0000;

  29.     //初始化PIE中断向量表
  30.     InitPieVectTable();

  31.     //配置中断向量表
  32.     EALLOW;
  33.     PieVectTable.TINT0 = &timer0_isr;
  34.     EDIS;

  35.     // 模块初始化
  36.     EALLOW;
  37.     CpuTimer0Regs.TCR.bit.TSS = 1;
  38.     CpuTimer0Regs.PRD.all =  120000000;
  39.     CpuTimer0Regs.TCR.bit.TIF = 1;
  40.     CpuTimer0Regs.TCR.bit.TRB = 1;
  41.     CpuTimer0Regs.TCR.bit.TIE = 1;
  42.     CpuTimer0Regs.TCR.bit.TSS = 0;
  43.     EDIS;

  44.     //使能CPU中断
  45.     IER |= M_INT1;

  46.     //使能PIE中断
  47.     PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

  48.     EINT;
  49.     ERTM;

  50.     for(;;)
  51.     {}
  52. }

  53. void CODE_SECTION("ramfuncs") INTERRUPT timer0_isr()
  54. {
  55.     IntCount++;

  56.     GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;

  57.     PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
  58. }


作者:昊芯 https://www.bilibili.com/read/cv13539303?spm_id_from=333.999.0.0 出处:bilibili

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
月蓉小豆包 发表于 2022-7-20 08:58 | 显示全部楼层
昊芯加油~!!!
月蓉小豆包 发表于 2022-7-28 13:22 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部