急求大神帮着看看,中断问题

2019-07-15 19:13发布

  1. #include "DSP28x_Project.h"     // Device Headerfile and Examples Include


  2. // Prototype statements for functions found within this file.
  3. interrupt void cpu_timer2_isr(void);
  4. interrupt void SCITXINTA_isr(void);  //发送
  5. interrupt void SCIRXINTA_isr(void);  //接收
  6. void scia_fifo_init(void);
  7. void scia_init(void);
  8. void scia_xmit(int a);
  9. void scia_msg(char *msg);
  10. void shurushuchu_Gpio_Init(void);
  11. void toolInit(void);
  12. void DelayMs(Uint16 ms);
  13. // Global counts used in this example
  14. Uint16 LoopCount;
  15. Uint16 ErrorCount;
  16. Uint16 ReceivedChar;
  17.          Uint16 SendChar;

  18. void main(void)
  19. {
  20.     InitSysCtrl();//初始化系统时钟,关闭看门狗等
  21.     InitSciaGpio();//初始化串口a使用的IO口
  22.     shurushuchu_Gpio_Init();//初始化输入io,输出io,以及485芯片发送接收使能io(485DIR)
  23.     DINT;//关闭中断
  24.     InitPieCtrl();//初始化中断控制器
  25.     IER = 0x0000;//禁止所有中断
  26.     IFR = 0x0000;//清除中断标志位
  27.     InitPieVectTable();//初始化中断向量表
  28.     EALLOW;//解除保护
  29.     PieVectTable.TINT2 = &cpu_timer2_isr;//将TINT2指向中断函数cpu_timer2_isr
  30.     PieVectTable.SCITXINTA= &SCITXINTA_isr;
  31.         PieVectTable.SCIRXINTA= &SCIRXINTA_isr;
  32.         //PieVectTable.SCITXINTA = &SCITXINTA_ISR;
  33.         EDIS; //关闭保护 ,   // 9.1 SCI-A

  34.         InitCpuTimers(); //初始化CPU计时器
  35.         ConfigCpuTimer(&CpuTimer2, 80, 80000);  //80ms//
  36.         CpuTimer2Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
  37. ///         IER |= M_INT1;// Enable CPU int1 which is connected to CPU-Timer 0,
  38.          IER |= M_INT9;//     CPU int13 which is connected to CPU-Timer 1,
  39.          IER |= M_INT14;//   CPU int 14, which is connected to CPU-Timer 2:
  40.         // Enable TINT0 in the PIE: Group 1 interrupt 7
  41.          PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
  42.          PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
  43.          PieCtrlRegs.PIEIER9.bit.INTx2= 1;
  44.          IER = 0x100; // Enable CPU INT
  45.             EINT;        // Enable Global interrupt INTM 全局中断
  46. ///         ERTM;        // Enable Global realtime interrupt DBGM
  47.     scia_fifo_init();           // 初始化串口a缓存模块
  48.     scia_init();          // 初始化串口
  49.     SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//接收缓存溢出位清零

  50.         while(1)
  51.     {
  52.     }





  53. }

  54. void        DelayMs(Uint16 ms)
  55.         {
  56.                 Uint16        i;
  57.                 for(i=0;i<ms;i++)        DSP28x_usDelay(1000);
  58.         }

  59. void scia_init()
  60. {

  61.          SciaRegs.SCICCR.all =0x0007;
  62.      //bit7  0 一个停止位  1 俩个停止位
  63.     // 禁止奇偶校验
  64.          //bit4   0  禁止自测   1 自测
  65.    //bit3     空闲线多处理器模式
  66.    //字符长度  8位
  67.         SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
  68.                                    // Disable RX ERR, SLEEP, TXWAKE
  69.         SciaRegs.SCICTL2.all =0x0003;
  70.         SciaRegs.SCICTL2.bit.TXINTENA =1;//使能发送准备中断
  71.         SciaRegs.SCICTL2.bit.RXBKINTENA =1;//使能接收准备中断
  72.         SciaRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 20MHz.
  73.         SciaRegs.SCILBAUD    =0x0003;
  74.         SciaRegs.SCICTL1.all =0x0023;  //软件复位,重启SCI
  75.         SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
  76.         SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
  77. }

  78. void scia_xmit(int a)   //发送字符
  79. {
  80. //  while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {}
  81.     SciaRegs.SCITXBUF=a;

  82. }

  83. void scia_msg(char * msg)//发送字符串
  84. {
  85.     int i;
  86.     i = 0;
  87.     while(msg<i> != '')
  88.     {
  89.         scia_xmit(msg<i>);
  90.         i++;
  91.     }
  92. }

  93. // Initalize the SCI FIFO
  94. void scia_fifo_init()
  95. {
  96.     SciaRegs.SCIFFTX.all=0xC022;
  97.     SciaRegs.SCIFFRX.all=0x0022;
  98.     SciaRegs.SCIFFCT.all=0x00;

  99. }
  100. void shurushuchu_Gpio_Init(void)
  101. {
  102.         EALLOW;
  103.     GpioCtrlRegs.GPAPUD.all = 0x000000000;       //上拉                                                               
  104.     GpioDataRegs.GPASET.all = 0x0000001ff;      //复位高电平                                                               
  105.     GpioCtrlRegs.GPAMUX1.all= 0x000000000;          //配置为GPIO模式                                                        
  106.     GpioCtrlRegs.GPADIR.all = 0x00000010f;           //配置为输出模式                                                        
  107.     EDIS;
  108. }


  109. interrupt void cpu_timer2_isr(void)
  110. {



  111. //        DINT;//关闭总中断
  112.         CpuTimer2Regs.TCR.bit.TSS = 1;//停止定时器
  113.         CpuTimer2Regs.TCR.bit.TIF = 1;//清零中断标志位
  114.            EALLOW;
  115.         CpuTimer2.InterruptCount++;
  116.         EDIS;
  117.         GpioDataRegs.GPATOGGLE.bit.GPIO9=1;//翻转电平,切换接收发送模式
  118.         if(GpioDataRegs.GPADAT.bit.GPIO9==1){SendChar=GpioDataRegs.GPADAT.bit.GPIO4+2*GpioDataRegs.GPADAT.bit.GPIO5
  119.                   +4*GpioDataRegs.GPADAT.bit.GPIO6+8*GpioDataRegs.GPADAT.bit.GPIO7;
  120.                   //组合IO电平为0x 0 0 0 0 io7 io6 io5 io4

  121.           scia_xmit(SendChar);//发送字符
  122.                   }
  123.         CpuTimer2Regs.TCR.bit.TRB = 1;//定时器重装
  124.     CpuTimer2Regs.TCR.bit.TSS = 0;//启动定时器
  125.         EINT;   //开总中断

  126. }
  127. interrupt void SCIRXINTA_isr(void)
  128. {
  129.         
  130.     ReceivedChar = SciaRegs.SCIRXBUF.all;
  131.     GpioDataRegs.GPADAT.bit.GPIO0=~(ReceivedChar|0x01);//电平逻辑与控制逻辑相反;需要进行位取反运算
  132.     GpioDataRegs.GPADAT.bit.GPIO1=~(ReceivedChar|0x02);//电平逻辑与控制逻辑相反;需要进行位取反运算
  133.         GpioDataRegs.GPADAT.bit.GPIO2=~(ReceivedChar|0x04);//电平逻辑与控制逻辑相反;需要进行位取反运算
  134.         GpioDataRegs.GPADAT.bit.GPIO3=~(ReceivedChar|0x08);//电平逻辑与控制逻辑相反;需要进行位取反运算
  135.         SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;  // Clear SCI Interrupt flag
  136.          PieCtrlRegs.PIEACK.all|=0x100;
  137.     EINT;   //开总中断


  138. }
  139. interrupt void SCITXINTA_isr(void)
  140. {
  141.   if(GpioDataRegs.GPADAT.bit.GPIO9==1)
  142.   {SendChar=GpioDataRegs.GPADAT.bit.GPIO4+2*GpioDataRegs.GPADAT.bit.GPIO5
  143.                   +4*GpioDataRegs.GPADAT.bit.GPIO6+8*GpioDataRegs.GPADAT.bit.GPIO7;
  144.                   //组合IO电平为0x 0 0 0 0 io7 io6 io5 io4


  145.   scia_xmit(SendChar);//发送字符
  146.   }

  147.     SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;  // Clear SCI Interrupt flag
  148.     PieCtrlRegs.PIEACK.all|=0x100;
  149.     EINT;   //开总中断

  150. }



  151. //===========================================================================
  152. // No more.
  153. //===========================================================================

  154. </i></i>
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
sunnysasha
1楼-- · 2019-07-15 21:28
用串口调试助手接受到的数据都是乱码的,应该接受到ffff,是中断之间有问题了么,求大神帮着解答
rlcl
2楼-- · 2019-07-16 03:05
如果能接收数据,一般波特率不对
老爷车上贝尔和猫
3楼-- · 2019-07-16 06:36
 精彩回答 2  元偷偷看……
er_niu
4楼-- · 2019-07-16 10:26
只有这一个中断?没有定时器中断吗?多个中断考虑优先级问题

一周热门 更多>