DSP

SCI中断方式

2019-07-13 16:53发布

  1. //===========================================================================
  2. //
  3. //文件名称:SCI_interrupt.c
  4. //
  5. //功能描述:DSP28SCI-同计算机通信,采用超级中断接受数据
  6. //间隔2秒DSP向计算机发送字符"2812-UARTisfine!"
  7. //SCI配置:波特率9600,数据长度8Bit,无极性,1位停止位
  8. //TX缓冲空触发SCI-TXINT中断
  9. //CPUCORE定时器0中断出发第一次传输
  10. //===========================================================================
  11. #include"DSP281x_Device.h"
  12. //使用的函数原型声明
  13. voidGpio_select(void);
  14. voidInitSystem(void);
  15. voidSCI_Init(void);
  16. interruptvoidcpu_timer0_isr(void);
  17. interruptvoidSCI_TX_isr(void);
  18. //全局变量
  19. charmessage[]={"TheF2812-UARTisfine!/n/r"};
  20. intindex=0;//字符串指针
  21. voidmain(void)
  22. {
  23. InitSystem();//初始化DSP内核寄存器
  24. Gpio_select();//配置GPIO复用功能寄存器
  25. InitPieCtrl();//调用外设中断扩展初始化单元PIE-unit(代码:DSP281x_PieCtrl.c)
  26. InitPieVectTable();//初始化PIEvector向量表(代码:DSP281x_PieVect.c)
  27. //重新映射PIE-Timer0的中断
  28. EALLOW;//解除寄存器保护
  29. PieVectTable.TINT0=&cpu_timer0_isr;
  30. EDIS;//使能寄存器保护
  31. InitCpuTimers();
  32. //配置CPU-Timer0周期50ms:
  33. //150MHzCPU频率,50000微妙中断周期
  34. ConfigCpuTimer(&CpuTimer0,150,50000);
  35. //使能PIE内的TINT0:Group1interrupt7
  36. PieCtrlRegs.PIEIER1.bit.INTx7=1;
  37. //使能CPUINT1(连接到CPU-Timer0中断)
  38. IER=1;
  39. EALLOW;//解除寄存器保护
  40. PieVectTable.TXAINT=&SCI_TX_isr;
  41. EDIS;//使能寄存器保护
  42. //使能PIE内的SCI_A_TX_INT中断
  43. PieCtrlRegs.PIEIER9.bit.INTx2=1;
  44. //使能CPUINT9
  45. IER|=0x100;
  46. //全局中断使能和更高优先级的实时调试事件
  47. EINT;//全局中断使能INTM
  48. ERTM;//使能实时调试中断DBGM
  49. CpuTimer0Regs.TCR.bit.TSS=0;//启动定时器0
  50. SCI_Init();
  51. while(1)
  52. {
  53. while(CpuTimer0.InterruptCount<40)//等待50ms*40
  54. {
  55. EALLOW;
  56. SysCtrlRegs.WDKEY=0xAA;//看门狗控制
  57. EDIS;
  58. }
  59. CpuTimer0.InterruptCount=0;//复位计数器
  60. index=0;
  61. SciaRegs.SCITXBUF=message[index++];
  62. }
  63. }
  64. voidGpio_select(void)
  65. {
  66. EALLOW;
  67. GpioMuxRegs.GPAMUX.all=0x0;//所有GPIO端口配置为I/O
  68. GpioMuxRegs.GPBMUX.all=0x0;
  69. GpioMuxRegs.GPDMUX.all=0x0;
  70. GpioMuxRegs.GPFMUX.all=0x0;
  71. GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;//配置SCI-RX
  72. GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;//配置SCI-TX
  73. GpioMuxRegs.GPEMUX.all=0x0;
  74. GpioMuxRegs.GPGMUX.all=0x0;
  75. GpioMuxRegs.GPADIR.all=0x0;//GPIOPORT配置为输入
  76. GpioMuxRegs.GPBDIR.all=0x00FF;//GPIOPortB15-B8配置为输入,B7-B0配置为输出
  77. GpioMuxRegs.GPDDIR.all=0x0;//GPIOPORT配置为输入
  78. GpioMuxRegs.GPEDIR.all=0x0;//GPIOPORT配置为输入
  79. GpioMuxRegs.GPFDIR.all=0x0;//GPIOPORT配置为输入
  80. GpioMuxRegs.GPGDIR.all=0x0;//GPIOPORT配置为输入
  81. GpioMuxRegs.GPAQUAL.all=0x0;//设置所有GPIO输入的量化值等于0
  82. GpioMuxRegs.GPBQUAL.all=0x0;
  83. GpioMuxRegs.GPDQUAL.all=0x0;
  84. GpioMuxRegs.GPEQUAL.all=0x0;
  85. EDIS;
  86. }
  87. voidInitSystem(void)
  88. {
  89. EALLOW;
  90. SysCtrlRegs.WDCR=0x00AF;//配置看门狗
  91. //0x00E8禁止看门狗,预定标系数Prescaler=1
  92. //0x00AF不禁止看门狗,预定标系数Prescaler=64
  93. SysCtrlRegs.SCSR=0;//看门狗产生复位
  94. SysCtrlRegs.PLLCR.bit.DIV=10;//配置处理器锁相环,倍频系数为5
  95. SysCtrlRegs.HISPCP.all=0x1;//配置高速外设时钟分频系数:2
  96. SysCtrlRegs.LOSPCP.all=0x2;//配置低速外设时钟分频系数:4
  97. //使用的外设时钟时钟设置:
  98. //一般不使用的外设的时钟禁止,降低系统功耗
  99. SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
  100. SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
  101. SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;//使能SCI模块的时钟
  102. SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
  103. SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
  104. SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
  105. SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
  106. SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
  107. EDIS;
  108. }
  109. voidSCI_Init(void)
  110. {
  111. SciaRegs.SCICCR.all=0x0007;//1bit停止位无循环模式
  112. //无极性,字符长度:8bits,
  113. //异步模式,空闲线协议
  114. SciaRegs.SCICTL1.all=0x0003;//使能TX,RX,内部SCICLK,
  115. //禁止RXERR,SLEEP,TXWAKE
  116. SciaRegs.SCIHBAUD=487>>8;//波特率:9600(LSPCLK=37.5MHz);
  117. SciaRegs.SCILBAUD=487&0x00FF;
  118. SciaRegs.SCICTL2.bit.TXINTENA=1;//使能SCI发送中断
  119. SciaRegs.SCICTL1.all=0x0023;//使SCI退出复位
  120. }
  121. interruptvoidcpu_timer0_isr(void)
  122. {
  123. CpuTimer0.InterruptCount++;
  124. //每个定时器中断清除一次看门狗计数器
  125. EALLOW;
  126. SysCtrlRegs.WDKEY=0x55;//看门狗控制
  127. EDIS;
  128. //响应中断并允许系统接收更多的中断
  129. PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
  130. }
  131. //===========================================================================
  132. //SCI_A发送中断服务程序
  133. //发送字符串message[]
  134. //===========================================================================
  135. interruptvoidSCI_TX_isr(void)
  136. {
  137. if(index<26)SciaRegs.SCITXBUF=message[index++];
  138. //重新初始化PIE为下一次SCI-ATX准备接收下一次中断
  139. PieCtrlRegs.PIEACK.all=0x0100;//响应中断
  140. }
  141. //===========================================================================
  142. //代码结束.
  143. //===========================================================================