DSP

SCI中断方式

2019-07-13 15:15发布

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