• DSP28335学习记录(二)——外部中断和定时器中断


    本文记录dsp28335的中断的配置方法:

    目录

    一、中断的过程

    二、外部中断

    三、定时器中断


    一、中断的过程

    中断流程图

    CPU内核的中断总共有16个中断通道,14个可屏蔽(INT1~12,INT13,INT4)和2个不可屏蔽(RESET和NMI)。INT13,INT4是定时器1,定时器2的专用通道(可用于实时操作系统)。

    INT1~12这12路通过PIE模块每路分成8个,共分出了96个中断,每个中断的功能也确定好了。

    中断分布表

    从流程图可以看出来中断信号的流动过程:

    1,从外设,外部获得中断信号

    2,PIEIFRx ,PIE中断标志位,表示是否有中断信号的一个标志位

    3,PIEIERx ,PIE通道使能寄存器,是个开关

    4,PIEACKx,PIE应答,模块的总输出开关

    (下面,中断信号进入CPU了)

    5,IFR,CPU中断标志位

    6,IER,CPU中断使能位,开关

    7,INTM,全局中断使能,开关

    其中需要配置的就是使能位,就是开关要开对。标志位都是信号进来时候,自动产生的。

    上图使PIE模块前级更详细的流程图,外部中断需要通过IO口挂载,XINTCR配置,才进入PIE。所以设置时候再外设配置和PIE配置之间还多一步。

    而其他外设都是直接进入PIE模块的,所以直接启动外设的PIE通道就可以了。

     

    具体中断配置代码框架:

    1. // 步骤 1. 清除所有中断,初始化中断向量表:
    2. // 禁止CPU全局中断
    3. DINT;
    4. // 禁止CPU中断和清除所有CPU中断标志
    5. IER = 0x0000;
    6. IFR = 0x0000;
    7. // 初始化PIE控制寄存器到他们的默认状态.
    8. // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
    9. // 这个函数放在DSP280x_PieCtrl.c源文件里
    10. InitPieCtrl();
    11. //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
    12. // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
    13. // 这个函数放在了DSP280x_PieVect.c源文件里面.
    14. InitPieVectTable();
    15. //步骤 2. 配置中断外设
    16. EALLOW;//关闭写保护
    17. //外设时钟启动
    18. //外设模块配置
    19. //中断方式配置
    20. EDIS;//打开写保护
    21. //步骤 3. 设置外设与中断线 挂接关系
    22. EALLOW;//关闭写保护
    23. xxxxxxxx //链接PIE模块和外设中断的通道,
    24. PieVectTable.XINT1 = &EXTI_IRQ; //中断向量和中断函数绑定
    25. //步骤 4. 使能外设对应 PIE 中断通道
    26. PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//使能PIE 1 组 4通道 (这里需要查询PIE的中断矢量表 来确定使能的位)
    27. EDIS;//打开写保护
    28. //步骤 5. 使能CPU级中断及全局中断
    29. IER |= M_INT1;//使能INT1中断通道 (对应的变量值在 DSP2833x_Device.h中已进行宏定义。要用|或符号赋值,防止改变其他位)
    30. EINT;//打开全局中断
    31. ERTM;//当使用仿真器调试时 开启DEBUG中断

    中断配置流程:

    0,DINT; //关闭全局中断

    1,初始化中断。可以调用库函数,只是只能再最开始时候使用,否则会覆盖前面配置好的中断。

    2,开启各个时钟。各种外设时钟。

    3,外设模块配置。GPIO复用,定时器配置等等。

    4,中断方式配置。外部中断触发方式,

    5,PIE模块配置。外设中断和PIE的通道,中断函数更新到中断向量表,PIE通道使能

    6,CPU中断使能。开启全局中断。

    7,PIEACK手动复位,再中断函数结束前。

    二、外部中断

    外部中断的配置步骤:

    0,DINT; //关闭全局中断

    1,初始化中断。调用库函数。使所以寄存器复位到默认值。

    2,开启GPIO时钟,。各种外设时钟。

    3,外设模块配置。GPIO输入模式。

    4,中断方式配置。下降沿触发,使能,

    5,PIE模块配置。IO口挂载到对应中短线,中断函数更新到中断向量表,PIE通道使能

    6,CPU中断使能。开启全局中断。

    7,PIEACK手动复位,再中断函数结束前。

    具体代码:

    1. void EXIT_Init(void)
    2. {
    3. // 步骤 1. 清除所有中断,初始化中断向量表:
    4. // 禁止CPU全局中断
    5. DINT;
    6. // 禁止CPU中断和清除所有CPU中断标志
    7. IER = 0x0000;
    8. IFR = 0x0000;
    9. // 初始化PIE控制寄存器到他们的默认状态.
    10. // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
    11. // 这个函数放在DSP280x_PieCtrl.c源文件里
    12. InitPieCtrl();
    13. //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
    14. // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
    15. // 这个函数放在了DSP280x_PieVect.c源文件里面.
    16. InitPieVectTable();
    17. //步骤 2. 打开GPIO时钟,配置GPIO14引脚为输入,GPIO50引脚为输入低电平
    18. EALLOW;//关闭写保护
    19. SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
    20. //由于矩阵键盘,把一根线设为低电平,当GPIO14联通,将被拉低。
    21. GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;
    22. GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;
    23. GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;
    24. GpioDataRegs.GPBCLEAR.bit.GPIO50 = 1;
    25. //中断IO口
    26. GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
    27. GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;
    28. GpioCtrlRegs.GPAPUD.bit.GPIO14 = 1;
    29. GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0x02;
    30. GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 1;
    31. EDIS;//打开写保护
    32. //步骤 3. 设置IO口与中断线 挂接关系
    33. EALLOW;//关闭写保护
    34. GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 14;//XINT1 对应 GPIO14脚(具体挂接要满足外部中断框图中的对应情况)
    35. PieVectTable.XINT1 = &EXTI_IRQ; //中断向量和中断函数绑定
    36. //步骤 5. 使能外设对应 PIE 中断通道
    37. PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//使能PIE 1 组 4通道 (这里需要查询PIE的中断矢量表 来确定使能的位)
    38. //步骤 6. 设置外部中断触发方式 并 外设中断使能
    39. XIntruptRegs.XINT1CR.bit.POLARITY = 0;//下降沿触发有效
    40. XIntruptRegs.XINT1CR.bit.ENABLE = 1;//使能外部中断
    41. EDIS;//打开写保护
    42. //步骤 7. 使能CPU级中断及全局中断
    43. IER |= M_INT1;//使能INT1中断通道 (对应的变量值在 DSP2833x_Device.h中已进行宏定义。要用|或符号赋值,防止改变其他位)
    44. EINT;//打开全局中断
    45. ERTM;//当使用仿真器调试时 开启DEBUG中断
    46. }
    47. //步骤 8. 编写中断函数,在中断函数结束前清零PIEACK对应位
    48. interrupt void EXTI_IRQ(void)
    49. {
    50. LED2_TOGGLE; //这里写任务函数
    51. while(GpioDataRegs.GPADAT.bit.GPIO14 == 0);
    52. PieCtrlRegs.PIEACK.bit.ACK1 = 1;//清零PIEACK对应位
    53. }

    三、定时器中断

    外部中断的配置步骤:

    0,DINT; //关闭全局中断

    1,初始化中断。调用库函数。使所以寄存器复位到默认值。(前面有其他中断时,去掉)

    2,开启cpu time0时钟。

    3,外设模块配置。先初始化定时器,配置定时器,打开定时器。

    4,PIE模块配置。中断函数更新到中断向量表,PIE通道使能

    5,CPU中断使能。开启全局中断。

    6,PIEACK手动复位,再中断函数结束前。

    具体代码:

    1. void TIM0_Init(float Freq, float Period)
    2. {
    3. DINT;
    4. // // 禁止CPU中断和清除所有CPU中断标志
    5. // IER = 0x0000;
    6. // IFR = 0x0000;
    7. //
    8. // // 初始化PIE控制寄存器到他们的默认状态.
    9. // // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
    10. // // 这个函数放在DSP280x_PieCtrl.c源文件里
    11. // InitPieCtrl();
    12. //
    13. // //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
    14. // // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
    15. // // 这个函数放在了DSP280x_PieVect.c源文件里面.
    16. // InitPieVectTable();
    17. //第1步 打开TIM0时钟
    18. EALLOW;
    19. SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; //开启cpu time0时钟
    20. EDIS;
    21. //第2步 设置中断入口地址
    22. EALLOW;
    23. PieVectTable.TINT0 = &TIM0_IRQ; //中断向量表绑定中断函数
    24. EDIS;
    25. //第3步 配置定时器基本
    26. // Initialize address pointers to respective timer registers:
    27. InitCpuTimers();
    28. // Initialize timer period:
    29. ConfigCpuTimer(&CpuTimer0,Freq,Period);
    30. //第4步 打开定时器
    31. EALLOW;
    32. CpuTimer0.RegsAddr->TCR.bit.TSS = 0;
    33. //第5步 打开PIE组对应中断
    34. PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第一组7通道
    35. EDIS;
    36. //第6步 打开CPU中断
    37. IER |= M_INT1;
    38. EINT;
    39. ERTM;
    40. }
    41. interrupt void TIM0_IRQ(void)
    42. {
    43. LED3_TOGGLE;
    44. EALLOW;
    45. CpuTimer0Regs.TCR.bit.TIF = 1;//清除外设级中断标志位
    46. PieCtrlRegs.PIEACK.bit.ACK1 = 1;//清除PIE级中断应答
    47. EDIS;
    48. }

    待续。。

  • 相关阅读:
    测试/开发程序员值这么多钱么?“我“不会愿赌服输......
    sequencer和sequence
    机器学习和深度学习区别
    Spring Cloud Alibaba Nacos路由策略之保护阈值!
    Python基础dict字典定义与函数
    Gerrit 使用教程
    面经学习三
    Redis 的缓存击穿,穿透,雪崩及其解决方案
    助力防疫,基于安防摄像头的人脸佩戴口罩检测
    Jmeter——循环控制器中实现Counter计数器的次数重置
  • 原文地址:https://blog.csdn.net/qq_30835339/article/details/125426817