当前位置: 首页 > article >正文

DSP28335学习笔记-4

中断部分我觉得写太多理论方面,也是很容易让人看不懂,望而却步。

下面写一些日常使用的代码

初始化配置过程,放在void EXTI1_init()中;

1、使能外设对应的PIE中断

根据下表来判断中断连接哪一组的哪一根线。

下面是常用的表单,对应每一个中断对应

INT1.1SEQ1INT(ADC)
INT1.2SEQ2INT(ADC)
INT1.4XINT1
INT1.5XINT2
INT1.6ADCINT(ADC)
INT1.7TINT0(CPU定时器0)
INT3.1ePWM1_INT(ePWM1)
INT3.2ePWM2_INT(ePWM2)
INT3.3ePWM3_INT(ePWM3)
INT3.4ePWM4_INT(ePWM4)
INT3.5ePWM5_INT(ePWM5)
INT3.6ePWM6_INT(ePWM6)
INT4.1eCAP1_INT(eCAP1)
INT4.2eCAP2_INT(eCAP2)
INT4.3eCAP3_INT(eCAP3)
INT4.4eCAP4_INT(eCAP4)
INT4.5eCAP5_INT(eCAP5)
INT4.6eCAP6_INT(eCAP6)

使能外部中断1

PieCtrlRegs.PIEIER1.bit.INTx4=1; //使能PIE组1的INT4

2、使能外设中断

该中断由外设相关中断使能位来控制,比如外部中断1由外部中断1的控制寄存器中相应中断使能位来控制。

XIntruptRegs.XINT1CR.bit.ENABLE=1; //使能XINT1

3、触发中断

XIntruptRegs.XINTCR1.bit.POLARITY=0;//下降沿触发中断

XIntruptRegs.XINTCR1.bit.ENABLE=1;//使能外部中断1

4、指定中断向量表中断服务函数地址

通过对PIE中断向量表寄存 器的相应位进行设置,中断服务函数名可自定义。中断函数名前需加上地址符“&”。对PIE中断向量表寄存器设置时要注意在程序前加入EALLOW,以修改被保护的寄存器;程序后加入EDIS,不允许修改被保护的寄存器。

EALLOW; 
PieVectTable.XINT1=&EXTI1_IRQn;//函数名需要添加&
 EDIS;

4、使能CPU中断及全局中断

通过对IER和EINT寄存器相应位设置进行使能或者无效。

配置外部中断程序如下

IER|=M_INT1;//使能CPU中断1
EINT;//开全局中断
ERTM;

5、配置中断服务程序

配置好中断后如果有触发,即会进入中断服务函数,中断服务函数名在步骤3定义好,在&之后的名字。前后保证一致,否则将不会进入中断服务函数内执行。在DSP28335 软件开发中,要在中断服务函数名前加上关键字interrupt。

外部中断1的 中断服务函数如下

interrupt void EXT1_IRQn(void)
{

   功能;
}

完整初始化函数程序如下

#include"exti.h"
#include"led.h"
#include"key.h"
void EXTI1_init()
{
   EALLOW;
   SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK=1;//GPIO输入时钟

   EDIS;


  EALLOW;
  GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;//将GPIO12设为通用IO
  GpioCtrlRegs.GPADIR.bit.GPIO12=0;//输入

  GpioCtrlRegs.GPAPUD.bit.GPIO12=0;//上拉电阻
  GpioCtrlRegs.GPAQSEL1.bit.GPIO12=0;//外部中断1和系统时钟同步
 EDIS;

  EALLOW;
   GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL=12;//XINT1对应GPIO12
  EDIS;
  
  EALLOW;
PieVectTable.XINT1=&EXTI1_IRQn;//中断向量表地址
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx4=1;//由于外部中断1对应1.4
XIntruptRegs.XINT1CR.bit.POLARITY=0;//按下按钮,下降沿触发中断;
XIntruptRegs.XINT1CR.bit.ENABLE=1;//使能外部中断1;
IER|=M_INT1;//使能外部中断1;
EINT;//开全局中断
ERTM;}

interrupt void EXTI1_IRQn(void)
{
   Uint32 i;
    for(i=0;i<10000;i++);//消抖
   while(!KEY_H1)//等待按钮按下
    LED_TOGGLE;

   PieCtrlRegs.PIEACK.bit.ACK1=1;//执行后消除中断标志,ACK清0,PIE给CPU一个脉冲
}


  

主函数

void main()
{   int i;

    InitSysCtrl();
   InitPieCtrl();
    IER|=0x00;

    IFR|=0x00;
    InitPieVectTable();
    LED_Init();
   EXTI1_Init();

   while(1)
{  i++;

   if(i%2000==0)
{LED2_TOGGLE;//200ms闪烁一次
}
  delay_us(100);
}}


http://www.kler.cn/a/387263.html

相关文章:

  • GitLab实现 HTTP 访问和 SMTP 邮件发送
  • 论文分享:DiskANN查询算法
  • html+js+css实现拖拽式便签留言
  • 万字长文解读深度学习——卷积神经网络CNN
  • Linux驱动开发(4):Linux的设备模型
  • 6、If、While、For、Switch
  • 计算机网络:简述LAN口模式下NAT和代理的区别
  • 【销帮帮-注册_登录安全分析报告-试用页面存在安全隐患】
  • elementUI 点击弹出时间 date-picker
  • 基于微信的追星小程序+ssm(lw+演示+源码+运行)
  • 大华Android面试题及参考答案
  • 100种算法【Python版】第50篇——Tim Sort
  • Qt:QPdfDocument渲染PDF文件时的信息丢失问题
  • 第73期 | GPTSecurity周报
  • FileLink如何帮助医疗行业实现安全且高效的跨网文件交换
  • Ngnix
  • Harmony OS 如何实现 C++ NATIVE YUV420(其他数据格式如BGRA等)自渲染
  • 反向代理模块
  • windows server2019下载docker拉取redis等镜像并运行项目
  • 小E的射击训练
  • SpringBoot健身房管理:敏捷与自动化
  • stable diffusion图生图
  • 51c自动驾驶~合集5
  • 【数据结构与算法】LRUCache
  • O-RAN Fronthual CU/Sync/Mgmt 平面和协议栈
  • 【系统集成项目管理工程师】英语词汇对照表-技术类